Полезный ответ Wiktor Stribiżew упрощает ваше регулярное выражение и показывает, как использовать оператор
-match
PowerShell в качестве альтернативы.
Ваш последующий комментарий по поводу трубопровода к Out-String
исправление вашей проблемы подразумевает, что ваша проблема заключалась в том, что $exeOutput
содержал массив строк, а не одну многострочную строку.
Это действительно то, что происходит, когдавы захватывает вывод из вызова внешней программы (*.exe
): PowerShell записывает выходные строки stdout в виде массива строк (строки без завершающего символа новой строки).
В качестве альтернативы преобразованию массива $exeOutput
в одну многострочную строку с Out-String
(что, кстати, медленно [1] ), вы можете использовать switch
оператор для непосредственной работы с массивом:
# Stores 'CCITT Group 4' in $var
$var = switch -regex ($exeOutput) { 'Compression\s+:\s+(.+)' { $Matches[1]; break } }
В качестве альтернативы, учитывая конкретный формат строк в $exeOutput
, вы можете использовать
ConvertFrom-StringData
командлет , который может выполнятьm разбора строк в пары ключ-значение после замены разделителя :
на =
:
$var = ($exeoutput -replace ':', '=' | ConvertFrom-StringData).Compression
[1] Использование командлета обычно медленнее, чем выражение ;с массивом строк $array
в качестве входных данных вы можете добиться того, что $array | Out-String
делает более эффективно с $array -join "`n"
, хотя обратите внимание, что Out-String
также добавляет трейлинг перевод строки.