xcopy-копирование по крайней мере одного файла, соответствующего шаблону
Всякий раз, когда xcopy не удается найти файл, он изменяет переменную errorLevel с 0 на что-то другое.
В нашей компании есть большие скрипты, которые копируют файлы с помощью xcopy и выполняют действия, основанные на этом errorLevel.
Он работает абсолютно нормально для конкретных файлов или каталогов.
Работает абсолютно нормально:
xcopy file dir
if %errorlevel% neq 0 exit -1
Однако, если вместо указания точного имени файла я хочу использовать *, то проверка errorLevel больше не будет работа.
Не работает:
xcopy file* dir
if %errorlevel% neq 0 exit -1
Я получу:
Файл не найден-file*
0 файл(Ы) скопирован
Но errorLevel было бы 0.
Как я могу убедиться, что по крайней мере 1 файл скопирован при использовании подстановочного знака?
1 ответ:
Команда
xcopyпри использовании подстановочных знаков не рассматривает ноль совпадающих файлов как ошибку.В качестве обходного пути можно использовать команду
whereдля проверки наличия хотя бы одного совпадающего элемента, в этом случае она устанавливаетErrorLevelв0, но в противном случае в1. Добавление переключателя/Qпредотвращаетwhereот вывода чего-либо и позволяет ему просто вернутьErrorLevel:where /Q "file*" if %errorlevel% neq 0 exit -1 xcopy "file*" "dir" if %errorlevel% neq 0 exit -1Вы не можете сделать ни одной проверки
ErrorLevel, потому чтоxcopyперезапишетErrorLevelизwhere. Однако, вы можно сократить вышесказанное следующим образом:where /Q "file*" || exit -1 xcopy "file*" "dir" || exit -1Или даже вот так:
where /Q "file*" && xcopy "file*" "dir" || exit -1
Я поместил все спецификации файлов и каталогов между кавычками здесь, потому что это единственный безопасный способ, если любой из них содержит пробелы.