Консультация № 172762
30.09.2009, 14:41
0.00 руб.
0 6 3
Здраствуйте Уважаемые эксперты. Помогите пожалуйста написать bat файл. (см. в приложении)
Пытался разобраться даже с простым примером - не вышло.
set todir = %1

:one

shift

if "%1"=="" goto two

copy %1 %todir%

goto one

:two

set todir=

echo конец

Должно копировать перечисленные в командной строке файлы в указаную категорию.
Я пишу в командной строке:
E:\lab>a.bat E:\lab\time E:\game.ico
нажимаю ENTER и выдает:
E:\lab>set todir = E:\lab\time

E:\lab>shift

E:\lab>if "E:\game.ico" == "" goto two

E:\lab>copy E:\game.ico
Скопировано файлов: 1.

E:\lab>goto one

E:\lab>shift

E:\lab>if "" == "" goto two

E:\lab>set todir=

E:\lab>echo ╨║╨╛╨╜╨╡╤Ж
╨║╨╛╨╜╨╡╤Ж

E:\lab>
Файлы перемещаются не в папку time а в lab...
Не очень разбираюсь в этом.




Приложение:
http://i016.radikal.ru/0909/75/c71f8f3f8c9a.jpg

Обсуждение

давно
Посетитель
7438
7205
30.09.2009, 15:22
общий
это ответ
Здравствуйте, Dimon4ik.
set todir=%1 (без пробелов!)
Удачи!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
30.09.2009, 15:40
общий
это ответ
Здравствуйте, Dimon4ik.
Когда не работает пакетный файл нужно смотреть по очереди, что идет не так. Вас могла бы смутить строка "E:\lab>copy E:\game.ico" - ведь тут есть файл, который нужно скопировать, а куда - не указано, то есть на самом деле файл остается на месте и перезаписывает сам себя. Все дело в том, что пеерменная %todir% не сохраняется.
Поэтому предлагаю такой вариант - первым параметром указывать каталог назначения и не трогать его, а сдвигать уже параметры, начиная со второго, благо такую возможность предоставляет команда shift.
Еще замечание - в скриптах от Вас ввода не ждут, поэтому при копировании файлов лучше еще использовать ключ "/y".
Пример скрипта и его работы - в приложении.
Кстати, может стоит на PowerShell переходить?
Удачи!


Приложение:
Скрипт 1.bat:
:one
if "%2"=="" goto two
copy /y %2 %1
shift /1
goto one
:two
echo end

Результат работы:
C:\Documents and Settings\test>1.bat d:\ftp test.txt test2.txt

C:\Documents and Settings\test>if "test.txt" == "" goto two

C:\Documents and Settings\test>copy /y test.txt d:\ftp
Скопировано файлов: 1.

C:\Documents and Settings\test>shift /1

C:\Documents and Settings\test>goto one

C:\Documents and Settings\test>if "test2.txt" == "" goto two

C:\Documents and Settings\test>copy /y test2.txt test.txt
Скопировано файлов: 1.

C:\Documents and Settings\test>shift /1

C:\Documents and Settings\test>goto one

C:\Documents and Settings\test>if "" == "" goto two

C:\Documents and Settings\test>echo end
end

C:\Documents and Settings\test>
давно
Модератор
137394
1850
30.09.2009, 17:50
общий
это ответ
Здравствуйте, Dimon4ik.
Цитата: Ваш вопрос
Помогите пожалуйста написать bat файл. (см. в приложении)
Там я обнаружил постановку задачи
Цитата: Приведенная Вами ссылка
Скопировать из заданной директории все файлы в поддиректории так, чтобы все файлы типа *.exe были скопированы в поддиректорию EXE, а остальные - в поддиректорию XXX
Вот решение, отвечающее приведенной постановке задачи, если надо копировать файлы (при этом в исходной директории файлы остаются)
Код:
rem Командный файл separcopy.bat 
rem В аргументе передадим имя путь директории
rem Запуск батника без параметров ни к чему не приводит
Rem ---------------------------------------------------

If '%1' == '' GoTo End

Rem Имена поддиректорий для копирования
Rem ------------------------------------

Set SubDir1=EXE
Set SubDir2=XXX

cd "%1"

copy *.exe "%SubDir1%"
copy *.* "%SubDir2%"

cd %SubDir2%
del *.exe

:End
Он работает: в поддиректорию exe сопируются все*.exe файлы. В директорию XXX копируются все файлы, затем *.exe удаляются. Очевидно, это не очень эффективно Возможно, наверное, использовать коману XCOPY.exe с ключом /EXCLUDE:, но что-то мне просто это сделать не удалось.
Запуск командного файла, например, separcopy.bat имя_директории.
Bat-файл должен быть на одном диске с обрабатываемой директорией.

Вот решение, если надо перемещать файлы (при этом в исходной директории файлы удаляются)
Код:
rem Командный файл separmove.bat 
rem В аргументе передадим имя путь директории
rem Запуск батника без параметров ни к чему не приводит
Rem ---------------------------------------------------

If '%1' == '' GoTo End

Rem Имена поддиректорий для копирования
Rem ------------------------------------

Set SubDir1=EXE
Set SubDir2=XXX

cd "%1"
move /Y *.exe %SubDir1%\
move /Y *.* %SubDir2%\


:End

5
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
30.09.2009, 20:25
общий
lupus campestris:
Что делает этот ключ? /у
давно
Модератор
137394
1850
01.10.2009, 11:38
общий
Вот еще решение если надо копировать файлы (при этом в исходной директории файлы остаются)
Последовательно просматриваем файлы, и, в зависимости от расширения, копируем в ту или иную папку.
Код:
Echo Off

rem Командный файл separcopyfor.bat
rem В аргументе передадим имя или путь директории

rem Запуск батника без параметров ни к чему не приводит
Rem ---------------------------------------------------

Rem Имена поддиректорий для копирования
Rem ------------------------------------

Set SubDir1=EXE
Set SubDir2=XXX

If '%1' == '' GoTo End

Set Otkuda=%~1
Set ExeKuda="%~1\%SubDir1%"
Set XXXKuda="%~1\%SubDir2%"

FOR %%f IN ("%Otkuda%\*.*") Do Call :Separator "%%f"
GoTo End

:Separator

if NOT '%~x1' == '.exe' GoTo XXX

Copy "%~1" %ExeKuda%
GoTo End

:XXX
Copy "%~1" %XXXKuda%

:End

Примечание: в этом решении я аккуратнее обращаюсь с именами и путями- проверил и для имён и для путей с пробелами.
Вызов командного файла separcopyfor.bat Где_файлы. Где_файлы - путь к директории (без обратного \ ) где расположены файлы
Если Где_файлы содержит пробелы, путь заключите в " "
Если нужны пояснения - пишите.
Полезную информацию полУчите, вызвав команду for /?
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
01.10.2009, 12:05
общий
Dimon4ik:
Не переспрашивает.

C:\Documents and Settings\test>copy /?
Копирование одного или нескольких файлов в другое место.

COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B] источник [/A | /B]
[+ источник [/A | /B] [+ ...]] [результат [/A | /B]]

источник Имена одного или нескольких копируемых файлов.
/A Файл является текстовым файлом ASCII.
/B Файл является двоичным файлом.
/D Указывает на возможность создания зашифрованного файла
результат Каталог и/или имя для конечных файлов.
/V Проверка правильности копирования файлов.
/N Использование, если возможно, коротких имен при копировании
файлов, чьи имена не удовлетворяют стандарту 8.3.
/Y Подавление запроса подтверждения на перезапись существующего
конечного файла.
/-Y Обязательный запрос подтверждения на перезапись существующего
конечного файла.
/Z Копирование сетевых файлов с возобновлением.

Ключ /Y можно установить через переменную среды COPYCMD.
Ключ /-Y командной строки переопределяет такую установку.
По умолчанию требуется подтверждение, если только команда COPY
не выполняется в пакетном файле.

Чтобы объединить файлы, укажите один конечный и несколько исходных файлов,
используя подстановочные знаки или формат "файл1+файл2+файл3+...".

C:\Documents and Settings\test>
Форма ответа