我想编写一个接收参数并运行类似的批处理:
runmyexe.batch
==============
myexe.exe %1, %2, %3
我的每个 args 都用引号括起来(因为它是可能包含空格的文件的路径,例如C:\Program Files\foo.txt
)。问题是 args 的数量是未知的。我如何仍然myexe.exe
使用逗号分隔的所有给定路径运行?
谢谢。
我想编写一个接收参数并运行类似的批处理:
runmyexe.batch
==============
myexe.exe %1, %2, %3
我的每个 args 都用引号括起来(因为它是可能包含空格的文件的路径,例如C:\Program Files\foo.txt
)。问题是 args 的数量是未知的。我如何仍然myexe.exe
使用逗号分隔的所有给定路径运行?
谢谢。
下面是一个比较具体的解决方案。只有在保证所有参数都被引用并且它们在命令行上总是恰好间隔一个空格时才能使用它。
这个想法是将整个参数集 ( %*
) 存储到一个变量中,并将每次出现的" "
(表示参数之间的空格)替换为", "
,如下所示:
@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%
从这里修改它,您将以逗号分隔所有参数:
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