使用/ f delims获取子字符串,并且仍然保留所有定界符

时间:2019-01-17 02:05:43

标签: batch-file substring delimiter

我必须使用批处理从字符串中提取子字符串。我在Google上搜索了一下,似乎使用/ f delims是可行的方法,但是我被卡住了,delims还剥离了字符串中的所有定界符(=;)。

SET STRING={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}
FOR /f "tokens=4,5 delims=:" %%a in ("%STRING%") do (
  set SUBSTRG=%%a
  set SUBSTRG2=%%b
)
echo %SUBSTRG% %SUBSTRG2%

我想从STRING中提取子字符串“” Suite = 123:638.way; PC = 777; Contact Number = 019553;“。但是使用代码中所述的delim,我最终得到了 "Suite 123638.way PC 777 Contact Number 019553 "}} 我对批处理命令了解甚少,我该如何解决?有没有比/ f delims更好的方法?

1 个答案:

答案 0 :(得分:0)

是的,我不会为此使用for /f循环。我坚信使用一种在读取任何类型的结构化数据时都能理解结构的解析器-XML数据的XML解析器,JSON数据的JSON解析器,等等。因此,相比纯批处理,我更可能使用PowerShell或JScript。这是一个示例Batch + PowerShell混合脚本,演示:

<# : batch portion
@echo off & setlocal

set JSON={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}

for /f "delims=" %%I in (
    'powershell -noprofile "iex (${%~f0} | out-string)"'
) do set "value=%%~I"

echo Scraped value: %value%
exit /b

: end Batch / begin PowerShell #>
add-type -AssemblyName System.Web.Extensions
$JSON = new-object Web.Script.Serialization.JavaScriptSerializer
$obj = $JSON.DeserializeObject($env:JSON)
$obj.Building.value

由于您是按对象层次结构而不是平面文本来检索“值”值,因此这种方法对于间隔异常,变量顺序等更具弹性。

如果您更喜欢纯批处理解决方案,我将使用可变子字符串替换来修剪掉不需要的部分:

@echo off & setlocal

set JSON={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}

rem // Step 1: Strip everything before and including value":"
set "str=%JSON:*value":"=%"

rem // Step 2: Strip everything after and including the next quotation mark
set str=%str:"=&rem;%

rem // Step 3: output result
echo Scraped value: %str%

它既简单又高效,但是在很大程度上取决于您的数据可预测地保持相同的顺序和间距。比使用JSON解析器更脆弱。