2015-12-01 2 views
0

У меня есть один мастер пакетный файлКак пропустить весь переданный параметр в пакетном файле?

Master.bat, который называется 3 файлов first.bat, second.bat, third.bat

Теперь я хочу, чтобы передать параметры Master.bat и на основе параметра требуется выполнить внутренние заявления например Если я прошел Master.bat first, тогда Master.bat должен выполнить только call first.bat не другие.

Master.bat 

call "first.bat" 

call "second.bat" 

call "third.bat" 

Как я могу это достичь? Если несколько параметров также переданы? Как я могу выполнить цикл? ответ я принял отлично работает для меня, но Когда я прохожу дополнительные другие параметры он не :(как ниже Master.bat first,second parameter1 parameter2 теперь, когда я пытаюсь выполнить над ним только exceutes first.bat код для Master.bat является

@echo off 
:LOOP 
if "%1"=="" goto ENDLOOP 
call "%1" %3 %2 
shift 
goto LOOP 
:ENDLOOP 

% 1 следует принять first,second% 2 должны принять parameter1% 2 должны принять parameter2

+0

Похоже, было бы так же просто выполнить пакетные файлы, которые вы хотите, просто связав их вместе, вместо использования основного командного файла для их выполнения. Меньше, чтобы напечатать! 'C: \ BatchFiles> first & second' или' C: \ BatchFiles> first & third' – Squashman

+0

Возможный дубликат [как передать параметр, разделенный запятыми, в пакетный файл и использовать, если else в пакетном файле?] (Http: // stackoverflow .com/questions/33955749/how-to-pass-comma-separated-parameter-to-batch-and-use-if-else-in-batch-fil) – Squashman

+1

Попытка понять связь между вашим предыдущим вопросом и вот этот. Опять же, вы можете просто сгруппировать команды вместо того, чтобы иметь отдельный командный файл для выполнения всех сдвигов. 'C: \ BatchFiles> сначала a b & second c d' – Squashman

ответ

1

Команда, которую вы ищете shift:

@echo off 
:LOOP 
if "%1"=="" goto ENDLOOP 
call "%1" 
shift 
goto LOOP 
:ENDLOOP 

Первый передаваемый параметр всегда хранится в %1, вторую в %2 3-й в %3 и так далее. Команда shift перемещает указатель вправо. Старый% 1 потерян,% 2 становится% 1,% 3 становится% 2 и т. Д. Таким образом, вы можете просто перебирать все переданные параметры, пока вы не переместились так часто, как есть параметры. Тогда% 1 становится пустым, и вы прерываете цикл с goto ENDLOOP.

[EDIT] Согласно вашему комментарию здесь, как сделать то, что вы пытаетесь:

@echo off 
:LOOP 
if "%1"=="" goto ENDLOOP 
call "%1" %2 %3 
shift 
shift 
shift 
goto LOOP 
:ENDLOOP 

Если вы звоните master.bat a.bat b c x.bat y z это приведет к вызывая a.bat b c и x.bat y z.

+0

где использовать инструкцию if? например, если параметр «первый», то выполните «first.bat» или что если я передал несколько параметров, например «Master.bat first, second», это означает выполнение как first.bat, так и second.bat – Neo

+0

Когда вы вводите добычу для в первый раз first.bat хранится в% 1, поэтому выполняется 'call% 1'. Afer первая итерация% 1 - second.bat, так что выполняется second.bat. Просто не используйте ',' как разделитель. Если вы хотите использовать ',' вместо пробелов для разделения ваших параметров, весь файл 'first.bat, second.bat' будет интерпретироваться как один единственный параметр. В этом случае вам нужно разбить его на ',', но это совершенно другой вопрос. – MichaelS

+0

это работает для меня, но не для нескольких параметров :(я попытался как '@echo от : LOOP , если "% 1" == "" Гото ENDLOOP вызова "% 1" % 2% 3 сдвиг Гото LOOP : ENDLOOP' имя master.bat первый, второй param111 param222 – Neo

2

пакетный файл мог бы сделать это в более чем одним способом:

  • наиболее распространенным является вызов последовательно первый параметр %1 и использовать shift отказаться от этого, то if, чтобы проверить, есть ли больше параметров и goto, чтобы вернуться в начало цикла.

    :loop call "%1" shift if not "x%1"=="x' goto loop

  • в качестве альтернативы, ваш сценарий может обрабатывать командную строку с for:

    for %%n in (%*) do call "%%n"

Основываясь на комментарий, OP может также иметь в виду случай, когда параметры являются списками, разделенными запятыми. Команда for может сделать это (с более сложным примером) с использованием опции delims=, построив переменную, используемую в качестве встроенной команды, добавив к ней разделяемые токены и, наконец, выполнив полученную встроенную команду. Вероятно, это должен быть отдельный вопрос. Для обсуждения см. How do I get a for loop to work with a comma delimited string?

+0

что если я передал несколько параметров, таких как Master .bat сначала, во-вторых, это означает выполнение как first.bat, так и second.bat – Neo

+0

Это не было в исходном вопросе, но 'for' (прочитать документацию) может пройти через список с определенным разделителем). –

+0

@ThomasDickey, я согласен с вами, просто используя базовую команду 'FOR'. Он идеально подходит для описания пользователей, если вы спросите меня. Просто как пирог. – Squashman

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