如何从第N个位置获取batch file参数?

关于如何在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个参数AB""C by for ,but as 2 arguments AB" "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 以上是从我的目录/文件模式处理批次中提取的。 不要说这个不能用=来处理参数,但是至少可以用空格和通配符做引用的路径。