PDA

Показать полную графическую версию : [решено] как правильно передать переменные подпрограмме из цикла for


akrav
06-01-2008, 00:35
Столкнулся с непонятной проблемой. Получил задачу: «Есть файлы с одинаковыми именами. Нужно собрать только с разными размерами в одной папке, нумеруя их восходящей нумерацией.» Однако после применения цикла 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
06-01-2008, 16:29
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
06-01-2008, 23:42
Новогодние чудеса продолжаются…

Задача была в проанализировать текстовой лог-файл (\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 <--- ОШИБКА!!! “отсутствующий операнд”
for %%i in (%Arg2%) do if exist %Arg2% (set /a size2=%%~Zi)

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

При передаче параметров подпрограмме из цикла возникает указанная ошибка. Если руками задать значение переменные в подпрограмме testproject все работает отлично. В чем косяк не пойму?!

akrav
07-01-2008, 16:43
Поздравляю Всех с Рожеством Христовым!

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



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
07-01-2008, 17:51
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 и т. д.




© OSzone.net 2001-2012