Windows会在首次出现定界符时对字符串进行批处理

时间:2019-05-31 05:48:51

标签: batch-file

我有一个从属性文件中读取的参数字符串。属性之一如下:

"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

3 个答案:

答案 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

底线只是向您显示信息。