引数を受け取り、次のように実行するバッチを書きたいと思います。
runmyexe.batch
==============
myexe.exe %1, %2, %3
私の各引数は引用符で囲まれています(これは、のようにスペースを含む可能性のあるファイルへのパスであるためですC:\Program Files\foo.txt
)。問題は、引数の数が不明であることです。myexe.exe
指定されたすべてのパスをコンマで区切って実行するにはどうすればよいですか?
ありがとう。
引数を受け取り、次のように実行するバッチを書きたいと思います。
runmyexe.batch
==============
myexe.exe %1, %2, %3
私の各引数は引用符で囲まれています(これは、のようにスペースを含む可能性のあるファイルへのパスであるためですC:\Program Files\foo.txt
)。問題は、引数の数が不明であることです。myexe.exe
指定されたすべてのパスをコンマで区切って実行するにはどうすればよいですか?
ありがとう。
以下はかなり具体的な解決策です。これは、すべての引数が引用符で囲まれていることが保証されており、コマンドライン上で常に1スペースだけ間隔が空けられている場合にのみ使用できます。
アイデアは、引数のセット全体()を変数に格納し、(引数間のスペースを示す)%*
すべての出現箇所を次のように置き換えることです。" "
", "
@ECHO OFF
SET args=%*
SET args=%args:" "=", "%
myexe.exe %args%
特定の特殊記号を説明するために、遅延拡張を使用することもできます。
@ECHO OFF
SET args=%*
SETLOCAL EnableDelayedExpansion
SET args=!args:" "=", "!
myexe.exe !args!
@ECHO OFF
SETLOCAL EnableDelayedExpansion
REM Build up argument string using delayed expansion.
REM See the following commands for further enlightenment:
REM SETLOCAL /?
REM FOR /?
REM SET /?
REM CALL /?
SET args=
FOR %%p IN (%*) DO (
IF "!args!" EQU "" (
SET args=%%p
) ELSE (
SET args=!args!, %%p
)
REM ECHO %%p
)
ECHO myexe.exe %args%
:: CALL myexe.exe %args%
hereから変更すると、次のようにすべての引数をカンマで区切ります。
set ALL_ARGS=
if ""%1""=="""" goto doneSetArgs
set ALL_ARGS=%1%
shift
:setArgs
if ""%1""=="""" goto doneSetArgs
set ALL_ARGS=%ALL_ARGS%, %1
shift
goto setArgs
:doneSetArgs