Вы можете использовать операторы условного выполнения &&
и ||
:
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
), возможно, потребуется соответствующим образом адаптировать.