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
Я поместил все спецификации файлов и каталогов между кавычками здесь, потому что это единственный безопасный способ, если любой из них содержит пробелы.