Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for

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

Пользователь


Сообщения: 58
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 00:35, 06-01-2008

 


Moderator


Сообщения: 53170
Благодарности: 15429

Профиль | Отправить PM | Цитировать


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 /?

Отправлено: 16:29, 06-01-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 58
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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


Отправлено: 23:42, 06-01-2008 | #3


Пользователь


Сообщения: 58
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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

Цитата:

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)

Отправлено: 16:43, 07-01-2008 | #4



Moderator


Сообщения: 53170
Благодарности: 15429

Профиль | Отправить PM | Цитировать


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 и т. д.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:51, 07-01-2008 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] как правильно передать переменные подпрограмме из цикла for

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Как в Run передать переменные в качестве параметров ASH AutoIt 4 17-12-2009 10:13
[решено] как создавать переменные с динамическими именами speechless AutoIt 5 15-09-2009 09:38
[решено] Как узнать разрешение екрана (получить высоту и ширину в переменные) crashtuak AutoIt 2 07-08-2009 15:50
CMD/BAT - [решено] Использование If в теле цикла For ven00m Скриптовые языки администрирования Windows 3 11-01-2008 17:09
Как переменные из одного скрипта передать ? Kudryavcev Dmitry Вебмастеру 4 04-10-2003 03:10




 
Переход