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

Batch file 在批处理文件中查找命令行参数的值,batch-file,cmd,command-line-arguments,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

我在运行批处理文件时传递参数列表,需要特定参数-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!
)
但我面临着将args与值进行比较的问题。我尝试使用if,如下所示:

if -> if "!_var!" equ "-logdir" set /a logdir="%%!count!"
但由于语法不正确而导致错误

@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
在中%%B的
之后(
行是有效关键字所在的位置 如果参数未定义
arg
,则 退出可用于检查的
:parseArgs
标签
errorlevel
退出脚本

对参数进行任何排序

例如

变量
%env%
具有当前值

如果您希望在未传递
-log
的情况下使用默认值,则 例如,
调用:parseArgs
行之前设置“log=%~n0.log”

您声称可以有“更多参数”。语法
%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

要传递带有空格(或其他分隔符)的参数,请按如下方式引用它们

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

你在传递什么参数?有没有一个例子?它们是成对的?参数总是以相同的顺序传递吗?如果不知道你使用的是什么操作系统和哪种编程/脚本语言,这个问题是无法回答的。另外,你应该展示你已经尝试过的。我像这样运行:test.bat-env test1-logdir C:\Users\..\log-userhome..-log和更多。这些参数可以按不同的顺序传递。我使用的是Windows 10操作系统。欢迎使用StackOverFlow。请使用。请阅读。也请阅读
test.bat -env test1 -logdir "C:\path with spaces\log"