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

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

GoodFella 07-12-2010 01:09 1559916

можно ли определить количество параметров команды?
 
Поясню задачу:
в консоли вызываю свой бат-файл, передавая ему какую-то последовательность команд, например: dir md d:\abc\123 copy a.txt b.txt
Мне надо, чтобы мой бат-файл запускал поочередно все эти команды. Так вот вопрос, как можно узнать, для какой из списка команд следующее за ним слово ( или группа слов) является параметром команды, а какая команда выполняется без передачи таковых?
Извините, если продублировал чей-то вопрос.
Спасибо!

amel27 07-12-2010 08:35 1560015

GoodFella, в общем случае - никак, так как "dir md d:\abc\123" можно интерпретировать как две команды либо как одну - листинг каталогов ".\MD" и "d:\abc\123", я уж не говорю о том, что любой EXE-файл может оказаться как командой, так и параметром... так что придется вводить свои правила, по которым делить входной поток на команды... например, брать команды с параметрами в кавычки (при условии, что кавычки не используются в самих параметрах), отделять специальными токенами и т.п.

если используемых команд немного, можно просто сверять каждый параметр обычным IF /I, но с учетом отмеченных ограничений

gora 07-12-2010 08:55 1560023

Попробуйте так:
test.bat
Код:

@Echo Off
For /F "tokens=1-12 delims=," %%a In ("%*") Do (
        Call :_run %%a
        Call :_run %%b
        Call :_run %%c
        Call :_run %%d
        Call :_run %%e
        Call :_run %%f
        Call :_run %%g
        Call :_run %%h
        Call :_run %%i
        Call :_run %%j
        Call :_run %%k
        Call :_run %%l
)
Pause
Exit

:_run
Set t=%*
If Defined t Echo %t%

Запуск, например, такой командой:
Код:

test.bat dir,md "d:\abc\123",copy "a.txt" "b.txt",del /s /q "name abc.txt"
Команда Echo для тестов, удалить для исполнения команд. Число команд в примере до 12, но можно увеличить до 52.

GoodFella 07-12-2010 10:31 1560083

спасибо!) Очень помогли советами! как-то про использование разделителей сам не дошел)

GoodFella 08-12-2010 09:17 1560765

хм.. а еще вопрос.
если при вызове моего test.bat напишу 3 команды, то все равно у меня Call будет выполняться 12 раз? Только в тех оставшихся 9 случаях самой команде Call будет передан пустой символ "" ?
Можно ли сделать, чтобы если у меня пользователь написал 3 команды, call выполнялся тоже ровно три раза? и на этом цикл заканчивался?
Спасибо!

gora 08-12-2010 10:09 1560805

Цитата:

Цитата GoodFella
(1) если при вызове моего test.bat напишу 3 команды, то все равно у меня Call будет выполняться 12 раз? (2) Только в тех оставшихся 9 случаях самой команде Call будет передан пустой символ "" ?
(3) Можно ли сделать, чтобы если у меня пользователь написал 3 команды, call выполнялся тоже ровно три раза? (4) и на этом цикл заканчивался? »

1 Да
2 Да, только остальные 9 ничего делать не будут, т.к., в п\программе проверяется наличие параметра
3 Call можно вообще исключить, эта команда здесь применена только для переноса проверки наличия параметра из цикла в п\программу и уменьшения кода.
4 Число циклов определяется в параметре tokens=1-12

Досрочный выход можно легко организовать:
Код:

@Echo Off
For /F "tokens=1-12 delims=," %%a In ("%*") Do (
        Call :_run %%a
        Call :_run %%b
        Call :_run %%c
        Call :_run %%d
        Call :_run %%e
        Call :_run %%f
        Call :_run %%g
        Call :_run %%h
        Call :_run %%i
        Call :_run %%j
        Call :_run %%k
        Call :_run %%l
)
Pause
Exit

:_run
Set t=%*
If Defined t (Echo %t%) Else (Pause&Exit)


GoodFella 08-12-2010 14:35 1561025

спасибо за помощь!
только почему-то когда удаляю команду Echo, оставив : If Defined t (%t%) Else (Pause&Exit) у меня выдает сообщение на экран : Непредвиденное появление: ).

gora 08-12-2010 15:10 1561061

Попробуйте так:
Код:

...
:_run
Set t=%*
If Not Defined t Pause&Exit
Echo %t%

Если не получится, то приведите здесь свою ком. строку запуска

GoodFella 08-12-2010 15:29 1561071

все, теперь работает нормально!
спасибо за помощь!)


Время: 02:27.

Время: 02:27.
© OSzone.net 2001-