1

在 Windows 批处理文件中,我知道%1被第一个参数%2替换,被第二个参数%*替换,并被所有参数替换。

有没有办法在第一个参数之后获得所有参数?(例如论点 2-N)第二个之后的所有论点呢?

SHIFT命令似乎没有影响%*

4

4 回答 4

5
@ECHO OFF
SETLOCAL
CALL :allafter 3 %*
ECHO args=%args%
GOTO :eof

:allafter
FOR /l %%a IN (1,1,%1) DO SHIFT
(SET args=)
:argloop
shift
IF NOT .%1==. SET args=%args% %1&GOTO argloop
IF DEFINED args SET args=%args:~1%
GOTO :eof

在第三个参数之后得到一切ARGS


编辑 - 处理可能包括逗号的空格分隔元素

@ECHO OFF
SETLOCAL
CALL :allafter 3 %*
ECHO args=%args%
CALL :allafter2 3 %*
ECHO args=%args%
GOTO :eof

:allafter
FOR /l %%a IN (1,1,%1) DO SHIFT
(SET args=)
:argloop
shift
IF NOT .%1==. SET args=%args% %~1&GOTO argloop
IF DEFINED args SET args=%args:~1%
GOTO :EOF

:allafter2
SET /a count=%1
SET args=%*
:arg2loop
SET oldargs=%args%
call SET args=%%args:*%1 =%%
IF "%args%"=="%oldargs%" (call SET args=%%args:*%1,=%%) ELSE (SET /a count-=1)
shift
IF %count% gtr -1 GOTO arg2loop
GOTO :EOF

嗯——说得太早了。这个修改后的例程应该会玩得更好。当调用 remove-leading-n 时,以前的版本将定义为一个参数的内容one,two,three视为三个单独的参数。

于 2013-03-15T05:38:55.943 回答
3

嗯,有一种方法...

通过使用命令/n上的开关shift,您可以做一些类似的事情。但是,它将删除所有参数并将它们放入某个变量中(因此您不能在%3没有for循环的情况下再调用)。

@setlocal enableextensions
@echo off
:loop
if "%~2" equ "" goto end
set variable=%variable% %~2
shift /2
goto loop
:end
echo %1
echo %variable%
endlocal

要再次分离参数,只需执行一个简单的for循环(我相信您可以在某处找到有关它的文档)。

于 2013-03-15T05:45:53.413 回答
1

没有shift&的解决方案goto

@echo off &setlocal enabledelayedexpansion
set /a count=0
for %%i in (%*) do set /a count+=1
set "args="
for /l %%i in (2,1,%count%) do if defined args (call set "args=!args! %%%%i") else call set "args=%%%%i"
echo.%args%
endlocal
于 2013-03-15T07:19:08.793 回答
0
> type t.bat
@echo off
echo %*
for  /f "tokens=1,*delims= " %%i in ("%*") do echo %%j

> t a b c d e f,g h i
a b c d e f,g h i
b c d e f,g h i

> t a,a b c d e f,g h i
a,a b c d e f,g h i
b c d e f,g h i

>
于 2014-01-06T13:23:47.630 回答