CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for

Ответить
Аватара пользователя
akrav

CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for

Сообщение akrav »

Столкнулся с непонятной проблемой. Получил задачу: «Есть файлы с одинаковыми именами. Нужно собрать только с разными размерами в одной папке, нумеруя их восходящей нумерацией.» Однако после применения цикла 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
Аватара пользователя
Petya V4sechkin

Re: CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for

Сообщение Petya V4sechkin »

akrav, ваш фрагмент в любом случае не может быть рабочим:



Код:

Код: Выделить всё

если он есть, но другого размера продолжаем перебор
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

Сообщение akrav »

Новогодние чудеса продолжаются…



Задача была в проанализировать текстовой лог-файл (\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

Сообщение akrav »

Поздравляю Всех с Рожеством Христовым!



Мне кажеться, что основная проблема в том, как правильно передать переменные подпрограмме из следующего цикла:




Цитата:





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

Сообщение Petya V4sechkin »

akrav, о-хо-хо...

Во-первых, уберите скобку в конце:



Код:

Код: Выделить всё

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)
:exit

testproject.cmd ничего не знает про Arg1 и Arg3. Ему передаются параметры, а параметры пишутся как %1, %2 и т. д.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»