Да, я бы не использовал цикл for /f
для этого. Я твердо верю в использование парсера, который понимает структуру при очистке любого вида структурированных данных - парсера XML для данных XML, парсера JSON для данных JSON и так далее. Так что я бы с большей вероятностью использовал для этого PowerShell или JScript, чем чистый Batch. Вот пример гибридного сценария 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
Этот метод будет более устойчивым к пространственным аномалиям, порядку переменных и т. Д., Поскольку вы извлекаете значение "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.