我有一个从属性文件中读取的参数字符串。属性之一如下:
"CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080"
我需要在首次出现的“ =”时拆分此字符串,并使用以下值设置参数:
-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
我试图先在=令牌上分割字符串,然后从原始字符串中删除第一拳头子字符串令牌。 在下面的代码中,%% G将被设置为“ CUSTOM_JAVA_OPTIONS”,而我试图将其从原始字符串“ TESTSTR”中删除
@echo off
set "TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com
-Dhttp.proxyPort=8080"
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=1,2 delims==" %%G IN ("%TESTSTR%") DO (
echo Name=%%G
echo Value=%%H
set removestr=%%G
echo TESTSTR=!TESTSTR!
echo removestr=!removestr!
set "str=!TESTSTR:%removestr%=!"
echo str=!str!
)
pause
以上似乎无效,它产生:
Name=CUSTOM_JAVA_OPTIONS
Value=-Dhttp.proxyHost
TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
removestr=CUSTOM_JAVA_OPTIONS
str=TESTSTR:=
预期结果必须为:
str=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
答案 0 :(得分:3)
这可以简化为:
@echo off
set "TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080"
FOR /F "tokens=1* delims==" %%G IN ("%TESTSTR%") DO set "str=%%H"
echo TESTSTR=%TESTSTR%
echo.str=%str%
pause
有2个令牌:
1. Text up to 1st delimiter
2. Everything else after first delimiter (*)
请注意,通过在FOR循环之外回显变量,您无需启用延迟扩展。
答案 1 :(得分:1)
您的代码完全失败,因为在最初分析命令时会展开%removestr%
,并且一次分析整个循环(代码块)。因此%removestr%
扩展为进入循环之前存在的值。在您的情况下,该变量未定义。因此!TESTSTR:%removestr%=!
变成!TESTSTR:=!
,最后变成TESTSTR:=
。
如果直接使用%%G
而不是分配环境变量,您会更接近。
set str=!TESTSTR:%%G=!
产生=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
然后您可以使用set str=!str:~1!"
删除开头的=
。
set str=!TESTSTR:%%G==!
将不起作用,因为搜索字符串在第一次出现的=
处停止,因此结果为==-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
The RGuggisberg answer是获得所需结果的最便捷方法。 (您可能同时需要%%G
和%%H
)。
但是,从技术上讲,它在第一个=
时不会中断。实际上,它在连续=
的第一个字符串处中断,因为FOR / F不会解析空令牌。
因此,for /f "tokens=1* delims==" %%G in ("A==B==C")
对于A
(正确)产生%%G
,对于B==C
产生%%H
(不正确)。正确的值应为=B==C
。
答案 2 :(得分:0)
如果 =
字符后的第一个字符始终是 -
,那么以下方法也可能适用于您:>
@Echo Off
Set "TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080"
Set "REST=-%TESTSTR:*-=%"
Set "FIRST=%TESTSTR:-="&:"%"
Set "FIRST=%FIRST:~,-1%"
Echo [%FIRST%] [%REST%] & Pause
底线只是向您显示信息。