在批处理文件中查找命令行参数的值

时间:2019-04-09 10:08:06

标签: batch-file cmd command-line-arguments

我在运行批处理文件时传递参数列表,并且需要特定参数-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!"

但是由于语法错误而出现错误。

2 个答案:

答案 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 -

注意:不进行语法检查。参数应该重复-paramvalue

要传递带有空格(或其他定界符)的参数,请像使用引号一样

test.bat -env test1 -logdir "C:\path with spaces\log"