Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] как правильно передать переменные подпрограмме из цикла for (http://forum.oszone.net/showthread.php?t=97424)

akrav 06-01-2008 00:35 709841

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

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 710633

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

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

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

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

Цитата:


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 711217

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 и т. д.


Время: 01:48.

Время: 01:48.
© OSzone.net 2001-