Powershell: как легко переключаться между типами строковых переменных Out-String и Get-Content? - PullRequest
1 голос
/ 06 апреля 2020

Я хочу использовать метод, приведенный в ответе на этот вопрос: PowerShell - Удалять все строки текстового файла, пока не будет найдена определенная строка

Однако я не получаю строка из «Get-Content»; Я получаю это от "Out-String". Как я могу преобразовать мою переменную «Out-String» в формат «Get-Content» без необходимости временного файла «Set-Content» / «Get-Content»? Или как я могу получить тот же конечный результат, даже не конвертируя?

Мне очень больно, что «Get-Member» для переменной из «Out-String» или «Get-Content» возвращает TypeName System.String, но вы не можете использовать их таким же образом ...

Вот упрощенный код, который я пытался понять - давайте использовать это:

# Let's work with the text from 'Get-Help' output:
$myString = (Get-Help | out-string)

# I only want the text from the "SEE ALSO" section:
$cut = $myString.Where({ $_ -like ("*SEE ALSO*") },'SkipUntil')
$cut # This shows the whole thing!!! :-(
$cut | gm | findstr TypeName # says 'TypeName: System.String'

# Dirty conversion to "Get-Content" format:
Set-Content "tmp.file" -value $cut
$recut = (Get-Content "tmp.file").Where({ $_ -like ("*SEE ALSO*") },'SkipUntil')
$recut # Now this shows what I want, even though the below returns 'TypeName: System.String' as well !!!
(Get-Content "tmp.file") | gm | findstr TypeName

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Проблема в том, что get-help (без параметров) или out-string выводит одну многострочную строку (с windows окончаниями строк). Я даже пробовал вне струнного потока. Это необычно для команды powershell. Get-content разделит строки для вас автоматически.

(get-help).count

1

Один из способов решения этой проблемы - разделение на концах строк. Я также пропускаю пустые строки в конце. (Этот шаблон разделения работает и с текстом Unix / OSX.)

((get-help) -split '\r?\n').Where({ $_ -like '*SEE ALSO*' },'SkipUntil') | where { $_ } 

  SEE ALSO:
      about_Updatable_Help
      Get-Help
      Save-Help
      Update-Help

Или:

((get-help) -split '\r?\n').Where({ $_ -match 'SEE ALSO' },'SkipUntil').Where{ $_ }
1 голос
/ 06 апреля 2020

В этом случае вам даже не нужно Out-String, но я буду придерживаться вашего примера:

$myString = (Get-Help | Out-String)
$mystring -match "(?ms)^.*(SEE\sALSO.*)$" | Out-Null
$Matches[1]

Ключ в регулярном выражении - (?ms). m включает многострочный поиск, а s позволяет использовать подстановочные знаки в нескольких строках (другими словами: включая разрывы строк). Результат оператора -match передается в Out-Null, чтобы не видеть его в терминале. Вы могли бы хотеть оценить это все же. Если $true, $Matches[1] будет содержать желаемую строку.

...