在 Windows 批处理文件中,我知道%1
被第一个参数%2
替换,被第二个参数%*
替换,并被所有参数替换。
有没有办法在第一个参数之后获得所有参数?(例如论点 2-N)第二个之后的所有论点呢?
该SHIFT
命令似乎没有影响%*
。
在 Windows 批处理文件中,我知道%1
被第一个参数%2
替换,被第二个参数%*
替换,并被所有参数替换。
有没有办法在第一个参数之后获得所有参数?(例如论点 2-N)第二个之后的所有论点呢?
该SHIFT
命令似乎没有影响%*
。
@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
视为三个单独的参数。
嗯,有一种方法...
通过使用命令/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
循环(我相信您可以在某处找到有关它的文档)。
没有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
> 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
>