Powershell:如何在 'Out-String' 和 'Get-Content' 字符串变量类型之间轻松切换?

Powershell: how to easily switch between 'Out-String' and 'Get-Content' string variable types?

我想用这个问题的答案中给出的方法:

但是我没有从 "Get-Content" 得到我的字符串;我从 "Out-String" 得到它。如何将 "Out-String" 变量转换为 "Get-Content" 格式而不需要 "Set-Content"/"Get-Content" 临时文件?或者如何在不进行转换的情况下获得相同的最终结果?

'Out-String' 或 'Get-Content' returns 的变量上的 "Get-Member" 一个 System.String 的 TypeName 但你不能使用他们以同样的方式...

这是我一直试图理解的简化代码 - 让我们使用它:

# 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

在这种情况下,你甚至不需要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] 将包含您想要的字符串。

问题是 get-help(没有参数)或 out-string 正在输出一个多行字符串(具有 windows 行结尾)。我什至尝试了 out-string -stream。这对于 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{ $_ }