如何从第N个位置获取批处理文件参数?
关于如何在批处理文件中传递命令行参数进一步如何获取其余参数并将其准确指定? 我不想使用SHIFT,因为我不知道可能有多少个参数,并且如果可以的话,我想避免对它们进行计数。
例如,给定这个批处理文件:
@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
,但它避免了使用解析命令行for
,让命令行解释做这个工作(关于这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"
be properly properly):
@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%
可能不会像他们最初关于分隔符的方式(记住命令行的解释也把标签, ,
, ;
, =
作为分隔符以及所有组合),因为所有的分隔符所替代单空间在这里。 但是,将%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
。 以上是从我的目录/文件模式处理批次中提取的。 不要说这不能用=
来处理参数,但至少可以用空格和通配符做引用路径。