Windows批处理循环变量以

时间:2020-08-11 06:58:57

标签: batch-file

我有以下循环:

FOR %%a IN (%*) DO (

    IF "%%a"=="-D" (
        # Do something
    )
)

我要检查"%%a"是否以"-D"开头,而不是相等。

我了解%var:~0,2%员工,但在这里看不到如何使用它。

更新

@Mofi的答案确实解决了问题,但是:

@echo off

SET JVM_ARGS=-server 

setlocal EnableExtensions DisableDelayedExpansion

FOR %%a IN (%*) DO (
     set "Argument=%%~a"
     setlocal EnableDelayedExpansion


    IF /I "!Argument:~0,2!"=="-D" (
        SET JVM_ARGS=%JVM_ARGS% %%a
    )
    endlocal
)

echo %JVM_ARGS%

endlocal

我遇到的问题是SET JVM_ARGS=%JVM_ARGS% %%a尽管已执行,但现在不起作用。 echo %JVM_ARGS%打印-server而不是-server -Dxxx

3 个答案:

答案 0 :(得分:0)

一种解决方案是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
SET "JVM_ARGS=-server"
for %%I in (%*) do (
    set "Argument=%%~I"
    setlocal EnableDelayedExpansion
    if /I "!Argument:~0,2!" == "-D" (
        rem echo Argument starting with -D is: !Argument!
        endlocal
        set "JVM_ARGS=%JVM_ARGS% %%I"
    ) else endlocal
)
rem set JVM_ARGS
endlocal

它适用于:

  • -d
  • -D
  • "-d"
  • "-D"
  • -dhello
  • -DHello
  • -d"Hello world!"
  • -D"!That's my function()!"
  • "-dHello world!"
  • "-DYes, argument processing is not trivial!"

以上代码仅针对一个 -D选项编写。对于多个-D选项,有必要替换该行

        set "JVM_ARGS=%JVM_ARGS% %%I"

作者

        set "Argument=%%I"
        call set "JVM_ARGS=%%JVM_ARGS%% %%Argument%%"

命令 CALL 导致解析命令行已经存在

        call set "JVM_ARGS=%JVM_ARGS% %Argument%"

在解析整个命令块之后,在第二次执行 FOR 之前,将%JVM_ARGS%替换为该环境变量的当前字符串值,并将%Argument%替换为分配给环境的字符串值上面的变量Argument。需要使用额外的Argument环境变量,以避免包含-D的{​​{1}}之后的字符串格式错误,因为使用%而不是%%I时会出现这种字符串。 / p>

要了解所使用的命令及其工作方式,请打开command prompt窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • %%Argument%%
  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?

有关命令 SETLOCAL ENDLOCAL 的详细信息,请阅读this answer

答案 1 :(得分:0)

此代码解决了以下问题:

@echo off

SET JVM_ARGS=-server 

setlocal  EnableDelayedExpansion

FOR %%a IN (%*) DO (
echo %%a
    set "_arg_=%%~a"
    IF "!_arg_:~0,2!"=="-D" (
        SET "JVM_ARGS=!JVM_ARGS! %%a"
    )

)

echo %JVM_ARGS%

endlocal

答案 2 :(得分:0)

仅是为您提供替代选择而不会延迟扩展:

FOR %%a IN (%*) DO (
    echo %%a|findstr /bc:"-D" >nul && (
        echo Do something
    )
)

它只是检查%%a是否以-D开头(而不是检查前两个字符是否为-D),从而得出相同的结果。

您可能想添加findstr的i开关,使其不区分大小写(findstr /bic:"-D"