Показать полную графическую версию : [решено] копировать из текущего каталога...
Доброго времени суток! Помогите написать Bat-файл:
Написать пакетный файл, который будет копировать из текущего каталога все
файлы с расширением .txt, кроме одного файла, указанного в качестве первого
параметра командной строки, в каталог, указанный вторым параметром.
Переписывать только те файлы, которые новее одноименных в каталоге-
приемнике. Если произошла ошибка копирования, выдать сообщение и
прервать выполнение файла.
megaloman
09-04-2011, 12:03
@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
Здравствуйте, я только осваиваю написание скриптов, и мне тоже необходимо копировать все файлы из папки крома одного конкретного файла
Не могли бы Вы, по детальнее объяснить по строчкам, какая команда что делает
If '%2==' GoTo :Eof что значить %2, я не знаком с этим оператором
здесь тоже не все понятно:
Echo %1>~Xcopy.Tmp
xcopy *.txt %2\ /D /Y /Exclude:~Xcopy.Tmp >Nul 1>Nul 2>Nul
megaloman
13-01-2012, 19:09
что значить %2, я не знаком с этим оператором всё очень просто. Допустим, у Вас есть командный файл, например, bfile.bat. Его можно вызывать, передавая вовнутрь его некие данные (параметры), например, как это требуется в постановке этой задачи (см. первый пост вопроса). Внутри батника параметры можно использовать: %1 -это значение первого параметра, %2 - второго.
bfile.bat param1 param2
Зачем нужна строка If '%2==' GoTo :Eof
Если параметр %2 отсутствует (пустой) то получим под If выражение '==' которое истинно и приведёт к переходу на конец батника и его завершению работы. ( GoTo :Eof)
Это сделано для того, чтобы случайный запуск батника не привёл к непредсказуемым последствиям - здесь без параметров батник ничего не сделает.
Echo %1>~Xcopy.Tmp
Здесь имя файла, указанное в первом параметре, запишется во временный файл с именем ~Xcopy.Tmp
Для объяснения работы XCopy в командном окне наберите команду xcopy /? (полУчите хелп на экране) или xcopy /? >C:\_XCopy_Help.txt (хелп в файле C:\_XCopy_Help.txt)
В файле ~Xcopy.Tmp я записал имя файла, который копироваться не будет (см. постановку задачи и ключи работы xcopy в хелпе)
>Nul 1>Nul 2>Nul подавляет вывод на экран сообщений команды xcopy
Помогите пожалуйста с написанием bat-ника. Он не сильно отличаться должен от ентого вроде как.
Написать пакетный файл, который будет копировать из текущего каталога все файлы с некоторым расширением, кроме одного файла, указанного в качестве второго параметра командной строки, в каталог, указанный первым параметром. Если имя каталога, в который должно производиться копирование, не задано, то вывести сообщение об этом и прервать выполнение файла
Вот тут набросал из того что нашел - подскажите надо ли и если надо - где поправить?
@Echo Off
If '%1==' (Echo "Не указана папка для копирования"
GoTo :Eof)
xcopy *.txt %1\
If Not %ErrorLevel%==0 (
Echo Ошибка при копировании
Pause
GoTo :Eof
)
Вот это проверил - работает - только не понимаю как выполнить вот это условие: кроме одного файла, указанного в качестве второго параметра командной строки
megaloman
29-02-2012, 16:17
@Echo Off
Set Mask=*.que
If "%~1"=="" Cls & Echo Каталог для копирования не задан & Pause & GoTo :Eof
Set OutDir=%~1:::
Set OutDir=%OutDir:\:::=%
Set OutDir=%OutDir::::=%
If "%~2"=="" (
xcopy %Mask% "%OutDir%\" /Y /D
) Else (
Echo %~2>%0.NoCopy
xcopy %Mask% "%OutDir%\" /Y /D /EXCLUDE:%0.NoCopy
Del %0.NoCopy
)
Спасибо!
вроде во всем разобрался кроме вот этих строк:
Set OutDir=%~1:::
Set OutDir=%OutDir:\:::=%
Set OutDir=%OutDir::::=%
для чего вообще переменные заключены в %% и зачем столько : и для чего три строки? просто первой из этих не достаточно?
megaloman
29-02-2012, 19:58
Для чего вообще переменные заключены в %% - таков синтаксис в бат-файлах.
В параметре %1 в батник передаётся путь к папке, куда копируем файлы. Я попытался застраховаться от того, в каком виде этот путь передаётся: со слежом на конце или без него (например, C:\Tmp\ или C:\Tmp), чтобы в команде xcopy при копировании не возникла ошибка.
Рассмотрим пример c полученным в переменной %1 путём:
в первой строке OutDir примет значение C:\Tmp\::: или C:\Tmp::: (в зависимости от того, в каком виде Вы передали путь) (%~1 -~ убирает обрамляющие кавычки в пути, если Вы путь передаёте в кавычках, и никак не действует, если путь передаёте без них (см For /?)). Три : -так как в имени файла (папки) такой последовательности в принципе быть не может (хватило бы и двух : )
во второй строке последовательность \::: заменим на пустую (см. Set /?), то есть OutDir примет значение C:\Tmp или C:\Tmp:::
в третей строке последовательность ::: заменим на пустую, то есть OutDir примет значение C:\Tmp
Мы гарантированно получаем путь без слэжа на конце.
Вот еще один способ проделать указанное действие
Set OutDir=%~1
If %OutDir:~-1%==\ Set OutDir=%OutDir:~0,-1%
Поясняю If: Если последний символ пути равен \ то в переменную вырезаем всё, кроме последнего символа
Кстати, для более эффективного выполнения в Xcopy уместно добавить ключ /D чтобы копировались только более свежие файлы, и, если Вы твёрдо уверены, в каком виде передаёте путь, то можно вообще не определять переменную OutDir. Если без \, то @Echo Off
Set Mask=*.que
If "%~1"=="" Cls & Echo Каталог для копирования не задан & Pause & GoTo :Eof
If "%~2"=="" (
xcopy %Mask% "%~1\" /Y /D
) Else (
Echo %~2>%0.NoCopy
xcopy %Mask% "%~1\" /Y /D /EXCLUDE:%0.NoCopy
Del %0.NoCopy
)
Если Вы посчитали некое сообщение полезным, на форуме принято ставить об этом отметку (см. внизу сообщения), так отвечающему легче ориентироваться, насколько его труды пошли на пользу и получить глубокое моральное удовлетворение (или не получить оного).
Спасибо огромное !!! Все понял
Violetta_
06-05-2012, 00:31
Здравствуйте! Я тут переделала уже сделанный батник
@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 »
на такой вот:
@echo off
Set file_exception = %1
Set direct= %2
if '%2==' goto: Eof
for %%a in ( %CD%\*.txt )
do (xcopy %%a %2\/D/Y/Exclude:%1)
if %ErrorLevel% ==1 (echo Error of copy!
pause
goto: Eof
)
pause
но он не запускается почему то....не могу понять в чем проблема, пишет "Ошибка в синтаксисе команды"....что я не правильно написала??
megaloman
06-05-2012, 12:06
Violetta_, Надо быть аккуратнее в написании команд. В конкретном случае Вы исказили синтаксис for. Я не вник в смысл батника, поэтому нормально не тестировал результат, но как вариант (как пример синтаксиса)@echo off
if '%2==' goto :Eof
for %%a in ( %CD%\*.txt ) do (xcopy %%a %2\ /D /Y /Exclude:%1)
if %ErrorLevel% ==1 (
echo Error of copy!
pause
goto: Eof
)Полезно при отладке батника писать не @echo off, а @echo on, можно получить информацию, где загвоздка.
И вообще, смысл организации цикла в Вашем батнике от меня ускользает - хватило бы одного xcopy *.txt ...........
Я уже не говорю про корректность применения If
Что вы хотите получить своим батником?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.