Задать вопрос

Где ошибка в bat-файле?

По заданию :
Написать пакетный файл, который будет копировать из текущего каталога все
файлы с расширением .txt, кроме одного файла, указанного в качестве первого
параметра командной строки, в каталог, указанный вторым параметром.
Переписывать только те файлы, которые новее одноименных в каталоге-
приемнике. Если произошла ошибка копирования, выдать сообщение и прервать выполнение файла.
Было найдено решение:
@Echo Off
If '%2==' GoTo :Eof
Echo %1>~Xcopy.Tmp
xcopy *.txt %2\ /D /Y /Exclude:~Xcopy.Tmp >Nul 1>Nul 2>Nul
If Not %ErrorLevel%==0 (
   Echo Ошибка при копировании
   Pause
   GoTo :Eof 
)
del ~Xcopy.Tmp

Но возникла проблема, файлы копируются, но копируется также и файл указанный в первом параметре, в чем ошибка и как ее исправить?
  • Вопрос задан
  • 949 просмотров
Подписаться 2 Простой 16 комментариев
Решения вопроса 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
При вызове test.cmd "жжжж цццц.txt" C:\Temp\-2 в файл ~Xcopy.Tmp попадает %1 вместе с кавычками, а для xcopy нужно без кавычек.
@Echo Off
If '%2==' GoTo :Eof
setlocal DisableDelayedExpansion
set "file=%~1"
setlocal EnableDelayedExpansion
echo !file!>~Xcopy.Tmp
xcopy *.txt %2\ /D /Y /Exclude:~Xcopy.Tmp
If Not %ErrorLevel%==0 (
   Echo Ошибка при копировании
   Pause
   GoTo :Eof 
)
del ~Xcopy.Tmp


Дополнение:
Указанное выше удаление кавычек из входного параметра универсально. А для файлов есть более интересный способ:DIR /B %1 > ~Xcopy.Tmp. Который позволяет использовать подставочные знаки (* и ?).

Было
Не удалять файл исключения (он всё равно перезаписывается) и проверить правильность.
И попробовать для него абсолютный путь %CD%\~Xcopy.Tmp.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@slavius
Переписывать все файлы - неправильно.
EXCLUDE принимает файл со списком файлов. Нужно или вывести полученное имя в файл и использовать уже его.
Или нужно перебирать все файлы и перед копированием проверять имя файла
for %%f in (path\*.txt) do (
If not %%f==%1 xcopy %%f %2\ /D /Y
If Not %ErrorLevel%==0 (
Echo Ошибка при копировании
Pause
GoTo :Eof
)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы