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{ $_ }
我想用这个问题的答案中给出的方法:
但是我没有从 "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{ $_ }