批处理参数:%1之后的所有内容

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)

  • 当带引号的参数包含空格时不起作用,例如.`all_but_first.bat"first arg""second arg"` (10认同)
  • 对于'all-but-n',用`tokens = n`替换`tokens = 1`.其余的参数仍然在'%% b`中 (2认同)

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%

如果有帮助,请告诉我!

  • 这个答案有一个小问题 - "RESTVAR"将包含一个领先的空间.这是一个稍微好一点的版本http://stackoverflow.com/a/761658/1488656 (4认同)
  • 当参数包含“=”时不起作用,即 debug=1 变为 debug 1。 (2认同)

Ram*_*ich 7

以下内容适用于带有",=,"的args.基于Dmitry Sokolov的回答.修正了当第二个arg与第一个arg相同时的问题.

@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%
Run Code Online (Sandbox Code Playgroud)

  • 关于此语法如何工作的任何解释? (2认同)
  • 请解释这如何只替换字符串的 **1** 实例,因为字符串替换的替换部分以 `*` 开头,这使它变得神奇:https://gist.github.com/binki/a96bbf9a282616671ecd7386a9f17510 https:// ss64.com/nt/syntax-replace.html (2认同)

sch*_*der 5

您可以使用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)

编辑:删除使用%*的示例,因为这不起作用 - %*始终输出所有参数

  • 我天真地认为这种方法会起作用,意识到使用“SHIFT”时“%*”不会更新,然后**然后**来到这个SO问题寻找解决方案。看起来你做了相反的事情:-p (3认同)

Dmi*_*lov 5

下面将与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)

  • [高级用法:调用内部命令](https://ss64.com/nt/call.html#advanced)。它的工作原理类似于 `setlocal EnableDelayedExpansion` + `set _tail=!_all:*%2=!`。 (3认同)
  • 我真的想要 CALL SET 行的 ELI5 版本。 (2认同)