noa*_*mtm 34 windows parameters arguments batch-file
重复:
澄清:我知道循环方法 - 这甚至在Command Extensions之前就已经有效了; 我希望有一些有趣和无记录的内容,如%〜*1或其他 - 就像http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx中记录的内容一样?mfr = true.
在Windows批处理文件中(所谓的"命令扩展"打开),%1是第一个参数,%2是第二个,等等.%*是连接的所有参数.
我的问题:例如,有没有办法在%2之后获得所有东西?
我找不到这样的东西,这对我正在做的事情会有所帮助.
Max*_*uxa 32
有一个更短的解决方案(单线程)利用for
循环的标记化功能:
:: all_but_first.bat
echo all: %*
for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
echo all but first: %ALL_BUT_FIRST%
Run Code Online (Sandbox Code Playgroud)
输出:
> all_but_first.bat foo bar baz
all: foo bar baz
all but first: bar baz
Run Code Online (Sandbox Code Playgroud)
Sam*_*uel 20
我不确定是否有直接命令,但你总是可以使用一个简单的循环并移位以获得变量中的结果.就像是:
@echo off set RESTVAR= shift :loop1 if "%1"=="" goto after_loop set RESTVAR=%RESTVAR% %1 shift goto loop1 :after_loop echo %RESTVAR%
如果有帮助,请告诉我!
以下内容适用于带有",=,"的args.基于Dmitry Sokolov的回答.修正了当第二个arg与第一个arg相同时的问题.
@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%
Run Code Online (Sandbox Code Playgroud)
您可以使用SHIFT.它删除%1并将所有其他参数更低一点.此脚本输出%2之后的所有参数(因此它输出%3,%4 ...),直到其中一个为空(因此它是最后一个):
@echo off
SHIFT
SHIFT
:loop
if "%1" == "" goto end
echo %1
SHIFT
goto loop
:end
Run Code Online (Sandbox Code Playgroud)
编辑:删除使用%*的示例,因为这不起作用 - %*始终输出所有参数
下面将与ARGS工作"
,=
,' '
(相对于@MaxTruxa答案)
echo %*
set _all=%*
call set _tail=%%_all:*%2=%%
set _tail=%2%_tail%
echo %_tail%
Run Code Online (Sandbox Code Playgroud)
测试
> get_tail.cmd "first 1" --flag="other options" --verbose
"first 1" --flag="other options" --verbose
--flag="other options" --verbose
Run Code Online (Sandbox Code Playgroud)