我在运行批处理文件时传递参数列表,并且需要特定参数-logdir的值来在我的批处理文件中设置一些dir路径。我如何首先检查-logdir
是否作为参数传递,是否传递,获取其值并将其设置在变量中。
我的运行方式如下:
test.bat -env test1 -logdir C:\Users\...\log -userhome ... -log ...
以及更多其他参数。这些参数可以按不同顺序传递。
我能够获取使用下面传递的参数列表。
set argCount=0
for %%x in (%*) do set /A argCount+=1
echo Number of processed arguments: %argCount%
set /a count=0
for /l %%x in (1, 1, %argCount%) do (
set /a count=!count!+1
call set "var=%%!count!"
echo var= %!var!
)
但是我在将此参数与值进行比较时遇到问题。我尝试使用if,如下所示:
if -> if "!_var!" equ "-logdir" set /a logdir="%%!count!"
但是由于语法错误而出现错误。
答案 0 :(得分:0)
@echo off
setlocal
call :parseArgs %*
if errorlevel 1 exit /b 1
echo env %env%
echo log %log%
echo logdir %logdir%
echo userhome %userhome%
exit /b
:parseArgs
for %%A in (%*) do (
if defined arg (
call set "%%arg%%=%%~1"
set "arg="
) else (
for %%B in (
env
log
logdir
userhome
) do if "%%~A" == "-%%~B" set "arg=%%~B"
if not defined arg (
>&2 echo %%A is an invalid argument.
exit /b 1
)
)
shift
)
exit /b
在for %%B in (
行之后是有效关键字的位置
位于。如果参数未定义arg
,则该参数
退出:parseArgs
标签,您可以在其中检查
errorlevel
退出脚本。
对参数进行任何排序。
例如
myscript -env current -log text.log
其变量%env%
的值为current
等。
如果您希望使用默认值(例如-log
),那么
只是例如set "log=%~n0.log"
行之前的call :parseArgs
。
答案 1 :(得分:0)
您声称可以有“更多论点”。 %x
语法只能使用前九个参数,因此,在%1
至%9
可用的情况下,您只能处理四对,这可能太少了。很高兴,参数10 ...不会丢失(尽管不能直接访问)。您可以将参数列表向左移动。
由于参数对“可以以不同的顺序传递”,因此最好仅将偶数参数(值)分配给像奇数参数(变量)这样命名的变量。我在代码中添加了一些REM来进行解释:
@echo off & setlocal
:loop
if "%~2" == "" goto :done & REM if no other pair of parameters then done
set "%~1=%~2" & REM set variable
shift & REM remove first...
shift & REM ... two params
goto :loop & REM and repeat
:done
REM show parameters:
set -
注意:不进行语法检查。参数应该重复-param
和value
要传递带有空格(或其他定界符)的参数,请像使用引号一样
test.bat -env test1 -logdir "C:\path with spaces\log"