2012-09-07 6 views
5

バッチファイルに渡された最初の2つの引数を使い、バッチファイルで実行されたコマンドにすべてを追加したいと思います。追加の引数をバッチファイルに渡すには?

これを行う簡単な方法はありますか?

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

バッチが効果的にこの

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

のように実行されます、私は

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

答えて

3

forコマンドは、何をしたいあなたを与える必要があります。forのヘルプから

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

for /?を):


FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k は で始まる行を無視して、myfile.txtの各行を解析しますセミコロンで、各行の2番目と3番目のトークンを 本文に渡します。トークンはカンマやスペースで区切ります。 ボディステートメントでは、2番目のトークンを取得するための%i、3番目のトークン を取得するための%j、3番目以降のすべての残りのトークンを取得する%kに注目してください。 のファイル名にスペースが含まれている場合は、ファイル名を二重引用符 で引用する必要があります。このように二重引用符を使用するには、 もusebackqオプションを使用する必要があります。そうでない場合、二重引用符は、解析するリテラル文字列を定義すると解釈されます。 だから私の溶液中の


%%aはスクリプトに渡された最初の引数の値が、第二引数の%%b値、および%%c残りの引数を持っています。

私は、コマンドプロンプトからbatch.bat USR PWD -Dargument1=1 -Dargument2=2を実行すると、私が手:

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

は、引数を使用してコマンドを呼び出すためにdoechoを削除します。

+1

これは、最初の2つの引数のどちらも引用符で囲まれていない限り動作します。どちらの引数にも引用符で囲まれたスペースが含まれていると失敗します。ユーザー名やパスワードに問題はないでしょうが、一般的な解決策としては受け入れられません。 @dbenham; – dbenham

+0

;あなたは正しいです、どんな種類の引用された文字列を渡して、すべての賭けはオフです。 –

+0

実際に引用符で囲まれたargsは、引用符が平衡し、argsに '&' '|'などの特殊文字や空白が含まれていない限りOKです。別の潜在的な問題 - 引数は '、' ';' 'やスペースの代わりに '= '。 – dbenham

1

これは、あなたが望むかもしれないを実行するには、以下の希望

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

を参照してくださいしかし、SHIFTのみ有効なパラメータ '%1'..'%9'のためではなく、用を持っているとして、それは、ここでは助けにはなりません'%*'したがって、いくつかのプレフィックス付きパラメータなしですべてのパラメータを取得する簡単な方法はありません – jeb

2

通常、Patrick Cuffのソリューションは機能しますが、最初の2つの引数のいずれかに引用符で囲まれたスペースや特殊文字が含まれていると失敗します。また、引数がスペース以外で区切られていると失敗します。 FOR/Fデリミタは、,;=を含むように拡張できますが、引数に引用符で囲まれた区切り文字が含まれていると失敗します。

次の改善点では、&|のような引用符付きの特殊文字がサポートされていますが、引数の区切り文字は引き続き問題になります。

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

EDITここは同じことに

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

エンド編集

残念ながら、本当に一般的なソリューションを実現しUSEBACKQを使用して単純な修正GOTOループを必要としていますそれは3からすべてのパラメータを解析します。すべての引用符が均衡し、すべての特殊文字が引用されている限り、以下の解決策は有効です。すべての制限を排除するために

@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% 

は抜本的な対策が必要になる - How to receive even the strangest command line parameters?

関連する問題