2012-04-17 4 views
2

Я пытаюсь передать маркер в подпрограмму в пакете script-Batch Script - Вызов подпрограммы для каждого маркера

SET devices=host1 host2 host3 
FOR /F "tokens=* delims=," %%G IN (%devices%) DO CALL :sendReq %%G 

:sendReq 

curl.exe http://%1:1234/service/monitor 

GOTO :EOF 

Проблемы - The system cannot find the file host1 - это сообщение об ошибке не знаю, почему.

%1 не разрешает host1?

+0

@Mat. Спасибо за редактирование. Сделаю это со следующего раза. – liv2luv

ответ

8

for /f действительно предназначен для анализа текстовых файлов или команд и разбора их по одной целой строке за раз. Посмотрите на то, что это производит:

SET devices=host1 host2 host3 
FOR /F "tokens=*" %%G IN ("%devices%") DO call :sendReq %%G %%H %%I 
goto :EOF 

:sendReq 
echo Parm1: %1 
echo Parm2: %2 
echo Parm3: %3 
GOTO :EOF 

(т.е. каждый пройти через цикл считывает одну целую строку, и присваивает различные маркеры для %G, то %H, %I, %J ... в зависимости от того, сколько жетонов вы на самом деле есть)

Вам просто нужно более простую версию for:.

SET devices=host1 host2 host3 
FOR %%G IN (%devices%) DO call :sendReq %%G 
goto :EOF 

:sendReq 
echo In sendReq: %1 
GOTO :EOF 
+0

Спасибо. Это сработало. 2 последующих вопроса: 1. При передаче% устройств% в качестве параметра 'host1 host2'' FOR' выполняется 3 раза - может быть из-за возврата каретки? Как этого можно избежать? 2. Есть некоторые временные файлы, сгенерированные как часть скрипта, так как код попадает в 'goto: eof', очистка не происходит. Как очистить файлы только после выполнения последнего токена? Еще раз спасибо. – liv2luv

+0

Сделайте очистку сразу после. Что касается 1., убедитесь, что ваши vars чисты, или пропустите недопустимый ввод в 'sendReq'. (Или используйте другой скриптовый язык :)) – Mat

+0

Замечательно! спасибо Матем. Это так же, как и сейчас. – liv2luv

Смежные вопросы