Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] копировать из текущего каталога...

Ответить
Настройки темы
CMD/BAT - [решено] копировать из текущего каталога...

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток! Помогите написать Bat-файл:

Написать пакетный файл, который будет копировать из текущего каталога все
файлы с расширением .txt, кроме одного файла, указанного в качестве первого
параметра командной строки, в каталог, указанный вторым параметром.
Переписывать только те файлы, которые новее одноименных в каталоге-
приемнике. Если произошла ошибка копирования, выдать сообщение и
прервать выполнение файла.

Отправлено: 10:06, 09-04-2011

 

Ветеран


Contributor


Сообщения: 2726
Благодарности: 1696

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:03, 09-04-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте, я только осваиваю написание скриптов, и мне тоже необходимо копировать все файлы из папки крома одного конкретного файла
Не могли бы Вы, по детальнее объяснить по строчкам, какая команда что делает

Цитата:
If '%2==' GoTo :Eof
что значить %2, я не знаком с этим оператором

здесь тоже не все понятно:
Цитата:
Echo %1>~Xcopy.Tmp
xcopy *.txt %2\ /D /Y /Exclude:~Xcopy.Tmp >Nul 1>Nul 2>Nul

Отправлено: 14:42, 13-01-2012 | #3


Ветеран


Contributor


Сообщения: 2726
Благодарности: 1696

Профиль | Отправить PM | Цитировать


Цитата:
что значить %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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:09, 13-01-2012 | #4


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Помогите пожалуйста с написанием bat-ника. Он не сильно отличаться должен от ентого вроде как.
Написать пакетный файл, который будет копировать из текущего каталога все файлы с некоторым расширением, кроме одного файла, указанного в качестве второго параметра командной строки, в каталог, указанный первым параметром. Если имя каталога, в который должно производиться копирование, не задано, то вывести сообщение об этом и прервать выполнение файла

Вот тут набросал из того что нашел - подскажите надо ли и если надо - где поправить?

@Echo Off
If '%1==' (Echo "Не указана папка для копирования"
GoTo :Eof)

xcopy *.txt %1\
If Not %ErrorLevel%==0 (
Echo Ошибка при копировании
Pause
GoTo :Eof
)
Вот это проверил - работает - только не понимаю как выполнить вот это условие: кроме одного файла, указанного в качестве второго параметра командной строки

Последний раз редактировалось Veseliy, 28-02-2012 в 23:29.


Отправлено: 22:24, 28-02-2012 | #5


Ветеран


Contributor


Сообщения: 2726
Благодарности: 1696

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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
)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 29-02-2012 в 20:29.


Отправлено: 16:17, 29-02-2012 | #6


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо!
вроде во всем разобрался кроме вот этих строк:

Set OutDir=%~1:::
Set OutDir=%OutDir:\:::=%
Set OutDir=%OutDir::::=%

для чего вообще переменные заключены в %% и зачем столько : и для чего три строки? просто первой из этих не достаточно?

Отправлено: 19:14, 29-02-2012 | #7


Ветеран


Contributor


Сообщения: 2726
Благодарности: 1696

Профиль | Отправить PM | Цитировать


Для чего вообще переменные заключены в %% - таков синтаксис в бат-файлах.
В параметре %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
)
Если Вы посчитали некое сообщение полезным, на форуме принято ставить об этом отметку (см. внизу сообщения), так отвечающему легче ориентироваться, насколько его труды пошли на пользу и получить глубокое моральное удовлетворение (или не получить оного).

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 29-02-2012 в 20:27.


Отправлено: 19:58, 29-02-2012 | #8


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо огромное !!! Все понял

Отправлено: 20:37, 29-02-2012 | #9


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте! Я тут переделала уже сделанный батник
Цитата megaloman:
@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


но он не запускается почему то....не могу понять в чем проблема, пишет "Ошибка в синтаксисе команды"....что я не правильно написала??

Отправлено: 00:31, 06-05-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] копировать из текущего каталога...

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Вывод имени текущего пользователя Sadowod Скриптовые языки администрирования Windows 24 27-12-2012 10:13
Разное - [решено] Запуск cmd от имени текущего пользователя McLotos Microsoft Windows 2000/XP 3 25-01-2011 11:25
CMD/BAT - Получение текущего IP и перенос полученного значения на сайт steff Скриптовые языки администрирования Windows 1 10-12-2010 11:09
Игра Civilization V выйдет осенью текущего года OSZone News Новости информационных технологий 0 19-02-2010 21:30
Прочие БД - [решено] Чтение текущего пользователя в строку ЕвгенийN Программирование и базы данных 1 23-05-2008 06:01




 
Переход