Как использовать пакет для копирования двух самых последних файлов каждого типа из папки со многими типами журналов - PullRequest
0 голосов
/ 03 июля 2019

Я нашел сообщение, где пользователь хотел скопировать 2 самые последние папки журналов в другое место , на которое ответил Mofi . Я пытаюсь сделать что-то подобное, за исключением того, что у меня есть папка с несколькими типами журналов устранения неполадок Я попытался скопировать только определенные журналы со смешанным успехом. Я могу скопировать два из самых последних журналов для двух типов журналов, но безуспешно с другими. Также кажется, что использование паузы в пакете не останавливает ее, чтобы увидеть какие-либо сообщения об ошибках.

Мне удалось скопировать журнал localhost и журнал сервера. Однако журнал диагностики не копирует или любые другие журналы в папке, которую я пытаюсь переместить. Все файлы в папке имеют расширение .log, но после определенного размера переходят в формат name.log.date, но это не имеет значения для журналов localhost и server. Я пытался ставить паузы в конце каждого блока и даже внутри блоков, но пакет не останавливается, поэтому у меня нет шанса увидеть какие-либо ошибки.

@echo off
mkdir N:\Copy_logs
setlocal EnableExtensions EnableDelayedExpansion

REM -----------------
REM localhostlog
REM -----------------

set FileCount=02
set "SourcePath=D:\applications\server\log"
set "TargetPath=N:\Copy_logs"

set "SourcePath=%SourcePath:/=\%"
set "TargetPath=%TargetPath:/=\%"

if not "%SourcePath:~-1%" == "\" set "SourcePath=%SourcePath%\"
if not "%TargetPath:~-1%" == "\" set "TargetPath=%TargetPath%\"

for /F "eol=| delims=" %%I in ('dir "%SourcePath%/localhost_access_log.*" /A-D /B /O-D 2^>nul') do (
    %SystemRoot%\System32\xcopy.exe "%SourcePath%%%I" "%TargetPath%" /C /I /Q /H /R /Y >nul
    set /A FileCount-=1
    if !FileCount! == 0 goto serverLog
)
REM -----------------
REM serverLog
REM -----------------
:serverLog
set FileCount=02
set "SourcePath=D:\applications\server\log"
set "TargetPath=N:\Copy_logs"

set "SourcePath=%SourcePath:/=\%"
set "TargetPath=%TargetPath:/=\%"

if not "%SourcePath:~-1%" == "\" set "SourcePath=%SourcePath%\"
if not "%TargetPath:~-1%" == "\" set "TargetPath=%TargetPath%\"

for /F "eol=| delims=" %%I in ('dir "%SourcePath%/server.*" /A-D /B /O-D 2^>nul') do (
    %SystemRoot%\System32\xcopy.exe "%SourcePath%%%I" "%TargetPath%" /C /I /Q /H /R /Y >nul
    set /A FileCount-=1
    if !FileCount! == 0 goto diagLog
)
REM -----------------
REM Diagnostic Log
REM -----------------
:diagLog
set FileCount=02
set "SourcePath=D:\applications\server\log"
set "TargetPath=N:\Copy_logs"

set "SourcePath=%SourcePath:/=\%"
set "TargetPath=%TargetPath:/=\%"

if not "%SourcePath:~-1%" == "\" set "SourcePath=%SourcePath%\"
if not "%TargetPath:~-1%" == "\" set "TargetPath=%TargetPath%\"

for /F "eol=| delims=" %%I in ('dir "%SourcePath%/diagnostic.*" /A-D /B /O-D 2^>nul') do (
    %SystemRoot%\System32\xcopy.exe "%SourcePath%%%I" "%TargetPath%" /C /I /Q /H /R /Y >nul
    set /A FileCount-=1
    if !FileCount! == 0 goto :FileCopyDone
)

:FileCopyDone
endlocal

Ожидаемый результат - копирование двух самых последних файлов каждого типа журнала. Первые два типа журналов копируются, но любой из оставшихся журналов не копируется.

1 Ответ

0 голосов
/ 03 июля 2019

Я бы посоветовал вам использовать подфункцию.

Быстрый непроверенный пример:

@Echo Off
Set "source=D:\applications\server\log"
Set "destination=N:\Copy_logs"
Set "number=2"
PushD "%source%" 2>NUL || GoTo :EOF
For %%A In ("localhost_access_log" "server" "diagnostic") Do If Exist "%%~A.*" Call :Sub %%A
PopD
GoTo :EOF

:Sub
For /F "Tokens=1*Delims=[]" %%A In (
    'Dir /B/A-D/O-D/TW "%~1.*" 2^>NUL^|"%__AppDir__%find.exe" /N /V ""') Do (
    If %%A GTR %number% Exit /B
    "%__AppDir__%xcopy.exe" "%source%\%%B" "%destination%\" /Y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...