Войти

Показать полную графическую версию : [решено] Вытащить кусок из строки вида ... | ... | ... |


Ксеноинженер
14-04-2013, 20:57
Уважаемые знатоки, подскажите пожалуйста, как из пачки строк вида:
v2.20|Action=Allow|Active=FALSE|Dir=In|Profile=Domain|Profile=Private|Name=@{microsoft.windowscommun icationsapps_16.4.4206.722_x64__8wekyb3d8bbwe?ms-resource://microsoft.windowscommunicationsapps/resources/communicationsPackageName}|Desc=@{microsoft.windowscommunicationsapps_16.4.4206.722_x64__8wekyb3d8bb we?ms-resource://microsoft.windowscommunicationsapps/resources/communicationsPackageName}|LUOwn=S-1-5-21-1311539638-139220600-4108783082-1001|AppPkgId=S-1-15-2-2551677095-2355568638-4209445997-2436930744-3692183382-387691378-1866284433|EmbedCtxt=@{microsoft.windowscommunicationsapps_16.4.4206.722_x64__8wekyb3d8bbwe?ms-resource://microsoft.windowscommunicationsapps/resources/communicationsPackageName}|Platform=2:6:2|Platform2=GTEQ|
вытащить значение Name= ... циклом (любым).
Есть идея?

Iska
14-04-2013, 21:33
Как-то так:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in ("0001.txt") do (
set sLine=%%~i
set sVar=!sLine:^|=" "!
call :FoundName "!sVar!"

echo [!FoundName!]
)

endlocal
exit /b 0

:FoundName
setlocal enableextensions enabledelayedexpansion
set sOut=%~0

:Repeat
set sTwin=%~1

if defined sTwin (
if /i "%sTwin:~0,5%" == "Name=" (
set "s%sTwin%"
)
shift
goto :Repeat
)

endlocal & set %sOut:~1%=%sName%
exit /b

Но лучше с текстом такого вида пользовать WSH.

megaloman
14-04-2013, 23:55
Может быть эдак?@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion

FOR /F "usebackq delims=" %%s IN (`Type zzzzzzzz.txt`) DO (
Set SS="%%s"
Set SS=!SS:^|=" "!
Set SS=!SS:*" "Name=Name!
FOR /F "usebackq delims=}" %%L IN ('!SS!') DO Set String=%%L}
Echo !String!
) При этом выдастся на экране Name=@{......
Если Name= не надо, то @Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion

FOR /F "usebackq delims=" %%s IN (`Type zzzzzzzz.txt`) DO (
Set SS="%%s"
Set SS=!SS:^|=" "!
Set SS=!SS:*" "Name=!
FOR /F "usebackq delims=}=" %%L IN ('!SS!') DO Set String=%%L}
Echo !String!
) При этом на экране будет @{......

Set SS=!SS:^|=" "! Подсмотрел у Iska,

Iska
15-04-2013, 00:25
А если «delims» окажется не «}»?! Тогда уж лучше до пробела.

megaloman
15-04-2013, 00:30
Iska, Сложно судить, что лучше, а если пробел внутри Name=@{.... ....}? Похоже, формат присваивания подразумевает парные скобки, но это тоже мои домыслы.

Ксеноинженер
15-04-2013, 01:06
megaloman, респект.
К решению близко, однако
1 вариант ругается когда ему дают раздел реестра Windows вместо файла
reg query HKLM\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules /s
2 вариант выдал решение с хвостами вида " ""}
Iska, работает отлично! Скрипт достойный ветерана, спасибо в 2000-й раз ;) .

megaloman
17-04-2013, 23:26
@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion

FOR /F "usebackq delims=" %%s IN (`Type zzzzzzzz.txt`) DO (
Set SS="%%s"
Set SS=!SS:*^|Name=!
FOR /F "usebackq delims=|=" %%L IN ('!SS!') DO Set String=%%L
Echo !String!
)

Ксеноинженер
21-04-2013, 02:59
megaloman, так работает. Вижу, поменяли разделитель во 2-м цикле и убрали лишнюю строку в 1-м. В общем, получился альтернативный, короткий код.
Спасибо участникам конференции.




© OSzone.net 2001-2012