Как написать условный оператор, который делает что-то, только если xcopy что-то копирует (код выхода 0) - PullRequest
0 голосов
/ 19 марта 2019

Я хотел бы создать условный оператор для xcopy, который делает что-то, только если xcopy что-то копирует.

Итак, в основном я говорю, что если xcopy скопирует файл, сделайте что-нибудь.

Если не делать что-то еще.

Как это сделать с помощью пакета?

Пока у меня есть следующее:

xcopy "Z:\TestFiles.zip" "C:\Test\" /d /y

if xcopy exit code 0 (

)else

UPDATE:

При запуске следующего скрипта:

xcopy /d /y "Z:\TestFiles.zip" "C:\Testing\"

echo %errorlevel%

Следующие результаты я получаю:

1 скопированных файлов

C: \ Users \ jmills \ Desktop> echo 0

0

_

0 Файл (ы) скопирован

C: \ Users \ jmills \ Desktop> echo 0

0

Поскольку оба кода ошибок равны 0, я не могу использовать:

IF ERRORLEVEL 1 GOTO FilesCopied
IF ERRORLEVEL 0 GOTO NoFiledCopied

:NoFiledCopied
REM do something
GOTO eof

:FilesCopied
REM  do something
GOTO eof

:eof

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вы можете использовать операторы условного выполнения && и ||:

xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\" && echo success. || echo Failure!

В качестве альтернативы вы можете проверить ErrorLevel значение:

xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\"
rem // The following consition means 'if ErrorLevel is greater than or equal to 1':
if ErrorLevel 1 (
    echo Failure!
) else (
    echo Success.
)

Это работает, потому что xcopy не возвращает отрицательное ErrorLevel значение.


Или вы можете запросить значение%ErrorLevel% псевдо- переменная :

xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\"
if %ErrorLevel% equ 0 (
    echo Success.
) else (
    echo Failure!
)

Обратите внимание, что если приведенный выше код помещен в блок кода (заключенный в скобки), необходимо включить и применить с задержкойрасширение переменной для получения последнего значения !ErrorLevel!.


В соответствии с вашим обновлением , вы хотите определить, скопировал ли xcopy какие-либо файлы.Согласно этому связанному потоку Super User , xcopy никогда не возвращает код выхода 1 (который я считаю недостатком дизайна), в отличие от документации , даже если *Используется опция 1043 *, а файлы не копируются.

Чтобы обойти это, вы можете перехватить возвращенное сводное сообщение (# File(s)) с помощью for /F цикла , извлечь число (#) и проверьте, больше ли оно 0.Тем не менее, код выхода по-прежнему следует проверять, так как могут возникнуть другие исключения:

rem // Initialise variable:
set "NUM=0"
rem /* Use a `for /F` loop to capture the output of `xcopy` line by line;
rem    the first token is stored in a variable, which is overwritten in
rem    each loop iteration, so it finally holds the last token, which is
ewm    nothing but the number of copied files; if `xcopy` fails, number `0`
rem    is echoed, which is then captured as well: */
for /F "tokens=1" %%E in ('
    2^> nul xcopy /D /Y "Z:\TestFiles.zip" "C:\Test\" ^|^| echo 0
') do (
    rem // Capture first token of a captured line:
    set "NUM=%%E"
)
rem // Compare the finally retrieved count of copied files:
if %NUM% gtr 0 (
    echo Success.
) else (
    echo Failure!
)

С учетом того, что захваченная итоговая строка зависит от языка, поэтому извлекаемый токен, а также отображаемый текст ошибки (0), возможно, потребуется соответствующим образом адаптировать.

0 голосов
/ 20 марта 2019

Вы можете использовать robocopy вместо xcopy:

ROBOCOPY "Z:\\" "C:\Test\\" "TestFiles.zip"
IF ERRORLEVEL 1 GOTO FilesCopied
IF ERRORLEVEL 0 GOTO NoFiledCopied

:NoFiledCopied
REM do something
GOTO eof

:FilesCopied
REM  do something
GOTO eof

:eof

Дополнительная информация о robocopy: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

...