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 2

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

Я поместил все спецификации файлов и каталогов между кавычками здесь, потому что это единственный безопасный способ, если любой из них содержит пробелы.