Windows 批处理循环变量以

问题描述 投票:0回答:3

我有以下循环:

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

batch-file
3个回答
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!"

上面的代码只是为 one

-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
之后包含
%
的字符串格式错误,因为使用
%%I
而不是
%%Argument%%
时会出现这种情况。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?
  • setlocal /?

请阅读此答案,了解有关命令SETLOCALENDLOCAL的详细信息。


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

0
投票

只是为了给你一个不延迟扩展的替代方案:

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

它只是检查

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

您可能需要添加 findstr 的

i
开关以使其不区分大小写 (
findstr /bic:"-D"
)

© www.soinside.com 2019 - 2024. All rights reserved.