Как разобрать строку в powershell - PullRequest
0 голосов
/ 23 октября 2018

У меня есть команда Powershell, которая выводит несколько строк.

Я хочу вывести только одну строку, содержащую имя файла .zip.

В настоящее время all строки возвращаются при обнаружении подстроки .zip:

$p.Start() | Out-Null
$p.WaitForExit()
$output = $p.StandardOutput.ReadToEnd()
$output += $p.StandardError.ReadToEnd()
foreach($line in $output)
{  
  if($line.Contains(".zip"))
  {
     $line
  }
}

1 Ответ

0 голосов
/ 23 октября 2018

Поскольку вы используете .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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...