Поскольку вы используете .ReadToEnd()
, $output
получает одну многострочную строку , а не массив строк.
Поэтому вы должны разбить эту строку на отдельныелинии, используя оператор -split
.
Затем вы можете применить оператор сравнения строк, например -match
или -like
, непосредственно к массиву строк для извлечения совпадающих строк:
# Sample multi-line string.
$output = @'
line 1
foo.zip
another line
'@
$output -split '\r?\n' -match '\.zip' # -> 'foo.zip'
-split
основано на регулярных выражениях, а регулярное выражение \r?\n
соответствует символам новой строки (разрывы строк) любого варианта (CRLF, как обычно в Windows, а также LF, как это характерно для Unix-подобных платформ).
-match
также основан на регулярных выражениях, поэтому .
в \.zip
экранируется \
, учитывая, что .
является метасимволом регулярных выражений (по умолчанию он соответствует любому символу, кроме LF).
- Обратите внимание, что
-match
, как и PowerShell в целом, нечувствителен к регистру по умолчанию, поэтому foo.zip
иfoo.ZIP
будет соответствовать, например;
, если вам нужна чувствительность к регистру, используйте -cmatch
.
В качестве отступления:
Интересно, почему вы запускаете свою команду через экземпляр [System.Diagnostics.Process]
, учитывая, что вы, кажется, вызываете синхронно при захвате его стандартных потоков.
PowerShell позволяет вам сделать это намного проще путем прямого вызова, опционально с перенаправлением:
$output = ... 2>&1