【发布时间】:2013-03-15 05:18:51
【问题描述】:
在 Windows 批处理文件中,我知道 %1 被第一个参数替换,%2 被第二个参数替换,%* 被所有参数替换。
有没有办法在第一个参数之后获取所有参数? (例如参数 2-N)第二个之后的所有参数呢?
SHIFT 命令似乎不会影响%*。
【问题讨论】:
标签: windows for-loop batch-file cmd
在 Windows 批处理文件中,我知道 %1 被第一个参数替换,%2 被第二个参数替换,%* 被所有参数替换。
有没有办法在第一个参数之后获取所有参数? (例如参数 2-N)第二个之后的所有参数呢?
SHIFT 命令似乎不会影响%*。
【问题讨论】:
标签: windows for-loop batch-file cmd
@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 的内容视为三个单独的参数。
【讨论】:
a b c d e,f 调用它,那么我会得到d e f 而不是d e,f。有没有办法解决它,以便它允许参数内逗号?
"quotes" 中包含一个包含逗号的参数。结果将包含仍在引号中的参数。要删除引号,请将 SET args=%args% %1 更改为 SET args=%args% %~1
嗯,有一种方法……
通过在shift 命令上使用/n 开关,您可以做类似的事情。但是,它将删除所有参数并将它们放入某个变量中(因此,如果没有 for 循环,您将无法再调用 %3。
@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 循环(我相信您可以在某处找到有关它的文档)。
【讨论】:
a b c,d 调用它,那么我会得到b c d 而不是b c,d。有没有办法解决它,以便它允许参数内逗号?
没有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
【讨论】:
%9 的参数,(除非您使用 %* 并编写自己的 arg 解析器)
> 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
>
【讨论】: