Столкнулся с непонятной проблемой. Получил задачу: «Есть файлы с одинаковыми именами. Нужно собрать только с разными размерами в одной папке, нумеруя их восходящей нумерацией.» Однако после применения цикла for постоянно возникает ошибка «не является внутренней или внешней командой, исполняемой программой или пакетным файлом». CMD.EXE (win xp sp2) никого не узнает. Подскажите в чем дело, пожалуйста…
Вот живой пример:
Цитата:
set Arg1=c:\test1\test.doc
rem выделим из Arg1 имя файла с расширением
for %%i in (%Arg1%) do (set name1=%%~Ni%%~Xi)
rem определим размер файла test.doc
for %%i in (%Arg1%) do (set /a size1=%%~Zi)
rem в цикле label1 сравним имеющиеся файлы
set /a j=1
:label1
pause
set Arg2=%~d0\Base\%j%%name1%
rem определим размер файла jtest.doc
set /a size2=0
if exist %Arg2% (goto label2)
:label3
если он есть, но другого размера продолжаем перебор
if "%size2%" neq "%size1%" (set /a j=j+1 & goto label1)
если такого файла нет копируем его
if "%size2%"=="0" (xcopy "%Arg1%" "%~d0\Base\%i%%name1%" /c/q/r/h/p)
goto exit
:label2
for %%i in (%Arg2%) do (set /a size2=%%~Zi)
goto label3
:exit
CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for
-
Petya V4sechkin
Re: CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for
akrav, ваш фрагмент в любом случае не может быть рабочим:
Код:
На худой конец так (хоть я не уверен, что правильно понял задачу):
Код:
Проверьте, существует ли файл \WINDOWS\system32\xcopy.exe.
Выполните в командной строке:
xcopy /?
Код:
Код: Выделить всё
если он есть, но другого размера продолжаем перебор
if "%size2%" neq "%size1%" (set /a j=j+1 & goto label1)
если такого файла нет копируем его
if "%size2%"=="0" (xcopy "%Arg1%" "%~d0\Base\%i%%name1%" /c/q/r/h/p)
goto exitНа худой конец так (хоть я не уверен, что правильно понял задачу):
Код:
Код: Выделить всё
rem если такого файла нет копируем его и выходим
if not exist %Arg2% (xcopy "%Arg1%" "%Arg2%" /c/q/r/h & goto exit)
rem если он есть, но другого размера продолжаем перебор
if "%size2%" neq "%size1%" (set /a j=j+1 & goto label1)
goto exitПроверьте, существует ли файл \WINDOWS\system32\xcopy.exe.
Выполните в командной строке:
xcopy /?
-
akrav
Re: CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for
Новогодние чудеса продолжаются…
Задача была в проанализировать текстовой лог-файл (\Base\log.txt)
с двумя колонками:
Цитата:
…..
c:\test1\test.doc Project1
d:\test2\test.doc Project1
…..
В паке Base\Project1\ нужно собирать одноименные файлы разных версий c восходящей нумерацией. Т.е. если на дисках с: и d: оказались разные по размеру файлы то после работы скрипта в папке Base\Project1\ появятся 1test.doc 2test.doc
Создаю пакетный файл:
Цитата:
for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do (set Arg1=%%A & set Arg2=%%B & call testproject Arg1 Arg2)
Текст подпрограммы testproject:
Цитата:
rem set Arg1=l:\test1\test.doc
rem set Arg3=Проект
rem выделим из Arg1 имя файла с расширением
for %%i in (%Arg1%) do (set name1=%%~Ni%%~Xi)
rem определим размер файла test.doc
for %%i in (%Arg1%) do (set /a size1=%%~Zi)
rem в цикле label1 сравним имеющиеся файлы в папке “Проект”
set /a j=1
:label1
set Arg2=%~d0\Base\%Arg3%\%j%%name1%
set /a size2=0
rem определим размер файла jtest.doc
Задача была в проанализировать текстовой лог-файл (\Base\log.txt)
с двумя колонками:
Цитата:
…..
c:\test1\test.doc Project1
d:\test2\test.doc Project1
…..
В паке Base\Project1\ нужно собирать одноименные файлы разных версий c восходящей нумерацией. Т.е. если на дисках с: и d: оказались разные по размеру файлы то после работы скрипта в папке Base\Project1\ появятся 1test.doc 2test.doc
Создаю пакетный файл:
Цитата:
for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do (set Arg1=%%A & set Arg2=%%B & call testproject Arg1 Arg2)
Текст подпрограммы testproject:
Цитата:
rem set Arg1=l:\test1\test.doc
rem set Arg3=Проект
rem выделим из Arg1 имя файла с расширением
for %%i in (%Arg1%) do (set name1=%%~Ni%%~Xi)
rem определим размер файла test.doc
for %%i in (%Arg1%) do (set /a size1=%%~Zi)
rem в цикле label1 сравним имеющиеся файлы в папке “Проект”
set /a j=1
:label1
set Arg2=%~d0\Base\%Arg3%\%j%%name1%
set /a size2=0
rem определим размер файла jtest.doc
-
akrav
Re: CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for
Поздравляю Всех с Рожеством Христовым!
Мне кажеться, что основная проблема в том, как правильно передать переменные подпрограмме из следующего цикла:
Цитата:
1) for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do call testproject %%A %%B)
или
Цитата:
2) for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do (set Arg1=%%A & set Arg2=%%B & call testproject Arg1 Arg2)
или
Цитата:
3) for /F "tokens=1,2" %a in (%~d0\Base\log.txt) do call testproject %a %b)
все равно возникают глюки в подпрограмме: в 1 случае параметры просто не передаются, во 2-ом случае возникает вышеописанная ошибка, в 3-ем случае
Цитата:
Непредвиденное появление: ~d0\Base\log.txt)
Мне кажеться, что основная проблема в том, как правильно передать переменные подпрограмме из следующего цикла:
Цитата:
1) for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do call testproject %%A %%B)
или
Цитата:
2) for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do (set Arg1=%%A & set Arg2=%%B & call testproject Arg1 Arg2)
или
Цитата:
3) for /F "tokens=1,2" %a in (%~d0\Base\log.txt) do call testproject %a %b)
все равно возникают глюки в подпрограмме: в 1 случае параметры просто не передаются, во 2-ом случае возникает вышеописанная ошибка, в 3-ем случае
Цитата:
Непредвиденное появление: ~d0\Base\log.txt)
-
Petya V4sechkin
Re: CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for
akrav, о-хо-хо...
Во-первых, уберите скобку в конце:
Код:
Должно быть:
Код:
Во-вторых, замените в testproject.cmd все %Arg1% на %1 и %Arg3% на %2
Код:
testproject.cmd ничего не знает про Arg1 и Arg3. Ему передаются параметры, а параметры пишутся как %1, %2 и т. д.
Во-первых, уберите скобку в конце:
Код:
Код: Выделить всё
for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do call testproject %%A %%B)Должно быть:
Код:
Код: Выделить всё
for /f "tokens=1,2 delims= " %%A in (%~d0\Base\log.txt) do call testproject %%A %%BВо-вторых, замените в testproject.cmd все %Arg1% на %1 и %Arg3% на %2
Код:
Код: Выделить всё
rem выделим из Arg1 имя файла с расширением
for %%i in (%1) do (set name1=%%~Ni%%~Xi)
rem определим размер файла test.doc
for %%i in (%1) do (set /a size1=%%~Zi)
rem в цикле label1 сравним имеющиеся файлы в папке "Проект"
set /a j=1
:label1
set Arg2=%~d0\Base\%2\%j%%name1%
set /a size2=0
rem определим размер файла jtest.doc
for %%i in (%Arg2%) do if exist %Arg2% (set /a size2=%%~Zi)
rem если такого файла нет копируем его и выходим
if not exist %Arg2% (xcopy "%1" "%Arg2%" /c/q/r/h & goto exit)
rem если он есть, но другого размера продолжаем перебор
if "%size2%" neq "%size1%" (set /a j=j+1 & goto label1)
:exittestproject.cmd ничего не знает про Arg1 и Arg3. Ему передаются параметры, а параметры пишутся как %1, %2 и т. д.