我有以下循环:
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
答案 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"
)