2 Вопрос: извлечь значение между двумя квадратными скобками

вопрос создан в Wed, May 8, 2019 12:00 AM

Мне нужно извлечь значение между двумя квадратными скобками из конкретной строки в выводе команды. Вот вывод команды.

C:\Informatica\PowerCenter\isp\bin> .\infacmd.bat ping -dn Infadomain -nn Node01
[INFACMD_10052] Node [Node01] Domain [Infadomain] Host:Port [infadev:6005] was successfully pinged.
[INFACMD_10470] Kerberos authentication is [disabled] and secure communication is [disabled] in the Informatica domain [Infadomain].
Command ran successfully.

Из приведенного выше вывода мне нужно извлечь значение 'infadev' из приведенного выше результата команды. Я пытался использовать функции регулярных выражений для извлечения значения, но почему-то код не работает.

$cmd = Invoke-Command -ScriptBlock {& cmd.exe /c "infacmd.bat ping" -dn "Infadomain" -nn "Node01"}  | Where-Object {$_ -ne 'Command ran successfully.'}
$result = $cmd |(\[(?:\[??[^\[]*?\]))
write-host $result
  

В строке: 2 символа: 17 + $result = $cmd | ([(?: [?? [^ [] *?])) + ~~~~~~~~~~~~~~~ ~~~~~~ Выражения допускаются только в качестве первого элемента конвейера. + CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: ExpressionsMustBeFirstInPipeline

invoke-command -ScriptBlock {& cmd.exe /c "infacmd.bat ping" -dn "InfaDomain" -nn "Node01"} | Where-Object {$_ -ne 'Command ran successfully.'}
    
0
  1. Какой вывод вы получаете?
    2019-05-08 16: 28: 28Z
  2. В строке: 2 символа: 17 + $result = $cmd | ([(?: [?? [^ [] *?])) + ~~~ ~~~~~~~~~~~~~~~~~~ Выражения допускаются только в качестве первого элемента конвейера. + CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: ExpressionsMustBeFirstInPipeline
    2019-05-08 16: 41: 44Z
  3. Не помещайте информацию в комментарии, измените вопрос в следующий раз себя
    2019-05-08 16: 56: 12Z
  4. $cmd содержит вывод, который вы передаете в канал по каналу ЧТО ? Регулярное выражение нуждается в операторе и кавычках.
    2019-05-08 16: 58: 33Z
  5. всегда является частью infadev:? если так, это делает вещи намного проще. [ Гринь ]
    2019-05-08 17: 36: 51Z
2 ответа                              2                         

это еще одна идея. [ ухмылка ] использует именованную группу захвата для получения первого набора данных в скобках после текста Host:Port.

$Cmd = @'
[INFACMD_10052] Node [Node01] Domain [Infadomain] Host:Port [infadev:6005] was successfully pinged.
[INFACMD_10470] Kerberos authentication is [disabled] and secure communication is [disabled] in the Informatica domain [Infadomain].
Command ran successfully.
'@ -split [environment]::NewLine

$Null = $Cmd.ForEach({$_ -match 'Host:Port \[(?<HostPortInfo>.+)\]'})

$Matches.HostPortInfo

вывод ...

infadev:6005
    
0
2019-05-08 20: 30: 57Z

Вы можете использовать Where -match для получения массива результатов, чем использовать $Matches[i].

$cmd = Invoke-Command -ScriptBlock {& cmd.exe /c "infacmd.bat ping" -dn "Infadomain" -nn "Node01"}  | Where-Object {$_ -ne 'Command ran successfully.'}
$cmd | Where {$_ -match "(\[(?:\[??[^\[]*?\]))" }

$result0 = $Matches[0]
$result1 = $Matches[1]
...
    
0
2019-05-08 17: 05: 17Z
источник размещен Вот