关于如何在batch file中传递命令行参数进一步如何得到剩下的参数并精确地指定它们? 我不想使用SHIFT,因为我不知道可能有多less个参数,如果可以的话,我想避免计数。
例如,给定这个batch file:
@echo off set par1=%1 set par2=%2 set par3=%3 set therest=%??? echo the script is %0 echo Parameter 1 is %par1% echo Parameter 2 is %par2% echo Parameter 3 is %par3% echo and the rest are %therest%
运行mybatch opt1 opt2 opt3 opt4 opt5 ...opt20
会产生:
the script is mybatch Parameter 1 is opt1 Parameter 2 is opt2 Parameter 3 is opt3 and the rest are opt4 opt5 ...opt20
我知道%*
给出了所有的参数,但是我不想要前三个(例如)。
下面是你如何做到这一点,而不使用SHIFT
:
@echo off for /f "tokens=1-3*" %%a in ("%*") do ( set par1=%%a set par2=%%b set par3=%%c set therest=%%d ) echo the script is %0 echo Parameter 1 is %par1% echo Parameter 2 is %par2% echo Parameter 3 is %par3% echo and the rest are %therest%
但在这里你知道会有多少人。 你知道你会有三个。 移动三次,剩下的参数都是 %*
。也就是说,当你使用 shift
,你改变 %*
的表观值来表示你还没有关闭的参数。
下面的代码使用了shift
,但是它避免了使用for
命令行解析命令行解释器来做这个工作(考虑到不能正确解析双引号,例如参数集AB" "C
被解释为3个参数A
, B"
, "C
by for
,but as 2 arguments A
, B" "C
by the interpreter; this behavior prevent quoted path arguments like "C:\Program Files\"
@echo off set "par1=%1" & shift /1 set "par2=%1" & shift /1 set "par3=%1" & shift /1 set therest= set delim= :REPEAT if "%1"=="" goto :UNTIL set "therest=%therest%%delim%%1" set "delim= " shift /1 goto :REPEAT :UNTIL echo the script is "%0" echo Parameter 1 is "%par1%" echo Parameter 2 is "%par2%" echo Parameter 3 is "%par3%" echo and the rest are "%therest%" rem.the additional double-quotes in the above echoes^ are intended to visualise potential whitespaces
其余的参数在%therest%
可能看起来不像他们最初关于分隔符的方式(记住命令行解释器也把TAB,,, =
作为分隔符以及所有的组合),因为所有的分隔符被替换为单一空间在这里。 但是,将%therest%
传递给其他命令或批处理文件时,它将被正确解析。
我迄今为止遇到的唯一限制适用于含有脱字符^
论据。 其他限制(与<
, >
, |
, &
, "
)适用于命令行解释器本身。
@ECHO OFF SET REST= ::# Guess you want 3rd and on. CALL :SUBPUSH 3 %* ::# ':~1' here is merely to drop leading space. ECHO REST=%REST:~1% GOTO :EOF :SUBPUSH SET /A LAST=%1-1 SHIFT ::# Let's throw the first two away. FOR /L %%z in (1,1,%LAST%) do ( SHIFT ) :aloop SET PAR=%~1 IF "x%PAR%" == "x" ( GOTO :EOF ) ECHO PAR=%PAR% SET REST=%REST% "%PAR%" SHIFT GOTO aloop GOTO :EOF
我喜欢使用子例程而不是EnableDelayedExpansion
。 以上是从我的目录/文件模式处理批次中提取的。 不要说这个不能用=
来处理参数,但是至少可以用空格和通配符做引用的路径。