Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вытащить кусок из строки вида ... | ... | ... | (http://forum.oszone.net/showthread.php?t=258621)

Ксеноинженер 14-04-2013 20:57 2132537

Вытащить кусок из строки вида ... | ... | ... |
 
Уважаемые знатоки, подскажите пожалуйста, как из пачки строк вида:
Код:

v2.20|Action=Allow|Active=FALSE|Dir=In|Profile=Domain|Profile=Private|Name=@{microsoft.windowscommunicationsapps_16.4.4206.722_x64__8wekyb3d8bbwe?ms-resource://microsoft.windowscommunicationsapps/resources/communicationsPackageName}|Desc=@{microsoft.windowscommunicationsapps_16.4.4206.722_x64__8wekyb3d8bbwe?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 2132573

Как-то так:
Код:

@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 2132709

Может быть эдак?
Код:

@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 2132723

А если «delims» окажется не «}»?! Тогда уж лучше до пробела.

megaloman 15-04-2013 00:30 2132725

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

Ксеноинженер 15-04-2013 01:06 2132730

megaloman, респект.
К решению близко, однако
1 вариант ругается когда ему дают раздел реестра Windows вместо файла
Код:

reg query HKLM\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules /s
2 вариант выдал решение с хвостами вида " ""}
Iska, работает отлично! Скрипт достойный ветерана, спасибо в 2000-й раз ;) .

megaloman 17-04-2013 23:26 2134777

Код:

@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 2136746

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


Время: 05:00.

Время: 05:00.
© OSzone.net 2001-