2012-09-07 18 views
5

Chciałbym użyć pierwszych 2 argumentów przekazanych do pliku wsadowego, a następnie dołączyć wszystko inne do polecenia wykonanego w pliku wsadowym.Jak przekazać dodatkowe dodatkowe argumenty do pliku wsadowego?

Czy istnieje prosty sposób na zrobienie tego?

// batch file 
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line} 

Wsad zostanie wykonany jak ten

batch.bat USR PWD -Dargument1=1 -Dargument2=2 

skutecznie, że lubię być wykonywane

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

Odpowiedz

3

The for komenda powinna dać ci to, co chcesz:

for /f "tokens=1,2*" %%a in ("%*") do echo command -Duser=%%a -Dpwd=%%b %%c 

Z pomocą dla for (for /?):


FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k byłoby analizować każdy wiersz w pliku mojplik.txt, ignorując wiersze, które zaczynają się w średnik, przechodząc drugi i trzeci token z każdej linii do ciała , z tokenami oddzielonymi przecinkami i/lub spacjami. Zauważ, że dla instrukcji odwołanie do treści ciała% i, aby uzyskać 2. token,% j, aby uzyskać trzeci token , a% k, aby uzyskać wszystkie pozostałe tokeny po trzecim. W przypadku nazw plików zawierających spacje należy podać nazwy plików za pomocą cudzysłowów . Aby w ten sposób używać podwójnych cudzysłowów, musisz także użyć opcji usebackq, w przeciwnym razie podwójne cudzysłowy będą interpretowane jako definicje literału do przeanalizowania.


Więc w moim rozwiązaniu %%a ma wartość pierwszego argumentu przekazany do skryptu, %%b wartość drugiego argumentu i %%c Pozostałe argumenty.

Kiedy biegnę batch.bat USR PWD -Dargument1=1 -Dargument2=2 z wiersza poleceń uzyskać:

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

Zdjąć echo po do zadzwonić do komendy z argumentami.

+1

Działa to tak długo, jak żaden z pierwszych 2 argumentów nie zawiera spacji. Ale nie powiedzie się, jeśli któryś z argumentów zawiera cytowane spacje - prawdopodobnie nie jest to problem z nazwą użytkownika lub hasłem, zdecydowanie nie do zaakceptowania jako ogólne rozwiązanie. – dbenham

+0

@dbenham; masz rację, podaj dowolny rodzaj cytowanych ciągów, a wszystkie zakłady są wyłączone. –

+0

Rzeczywiście cytowane argumenty są w porządku, o ile cytaty są zrównoważone, a argumenty nie zawierają spacji ani znaków specjalnych, takich jak '&' '| itp. Kolejny potencjalny problem - argumenty mogą być również rozdzielane przez', ''; 'lub '=' zamiast spacji. – dbenham

1

To może być to, co chcesz po

C:>help shift 
Changes the position of replaceable parameters in a batch file. 

SHIFT [/n] 

If Command Extensions are enabled the SHIFT command supports 
the /n switch which tells the command to start shifting at the 
nth argument, where n may be between zero and eight. For example: 

    SHIFT /2 

would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected. 
+0

Ale to nie pomoże tutaj, jak SHIFT ma tylko wpływ na parametry '% 1'..'% 9' ale nie dla '% *'. Tak więc nie ma prostego sposobu na uzyskanie wszystkich parametrów bez niektórych wstępnie ustawionych parametrów. – jeb

2

Rozwiązanie firmy Patrick Cuff zwykle działa, ale nie powiedzie się, jeśli jeden z pierwszych 2 argumentów zawiera cytowane spacje lub znaki specjalne. Nie powiedzie się również, jeśli argumenty są ograniczone przez coś innego niż spacje. Ograniczniki FOR/F mogą zostać rozszerzone na: ,; i =, ale wtedy nie powiedzie się, jeśli argument zawiera którykolwiek z zacytowanych ograniczników.

Poniższe ulepszenie obsługuje cytowane znaki specjalne, takie jak & i |, ale ograniczniki argumentów nadal stanowią problem.

@echo off 
setlocal enableDelayedExpansion 
set args=%* 
for /f "tokens=1,2*" %%a in ("!args!") do (
    endlocal 
    echo arg1=%%a arg2=%%b remainder=%%c 
) 

EDITOto prostsze modyfikacja za pomocą usebackq że osiąga to samo

for /f "usebackq tokens=1,2*" %%a in ('%*') do echo arg1=%%a arg2=%%b remainder=%%c 

edycji End

niestety prawdziwie ogólne rozwiązanie wymaga pętlę GOTO który analizuje każdy parametr od 3. Poniższe rozwiązanie powinno działać tak długo, jak wszystkie cytaty są zrównoważone, a wszystkie znaki specjalne są cytowane.

@echo off 
setlocal 
set "args=" 
:parseArgs 
set args=%args% %3 
shift /3 
if "%~3" neq "" goto :parseArgs 
if (%3) equ ("") goto :parseArgs 
echo arg1=%1 arg2=%2 remainder=%args% 

Aby wyeliminować wszelkie ograniczenia wymagałoby drastycznych środków - patrz How to receive even the strangest command line parameters?

Powiązane problemy