我有以下循环:
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
一种解决方案是:
@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 /?
请阅读此答案,了解有关命令SETLOCAL和ENDLOCAL的详细信息。
此代码解决了问题:
@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
只是为了给你一个不延迟扩展的替代方案:
FOR %%a IN (%*) DO (
echo %%a|findstr /bc:"-D" >nul && (
echo Do something
)
)
它只是检查
%%a
是否以 -D
开头(而不是检查前两个字符是否为 -D
),这会给出相同的结果。
您可能需要添加 findstr 的
i
开关以使其不区分大小写 (findstr /bic:"-D"
)