![](/img/trans.png)
[英]Single space between letters of Win32 executable output in PowerShell
[英]Win32 Executable Output Parsing with PowerShell
我的 $PSVersionTable 输出如下:
Name Value
---- -----
PSVersion 7.0.1
PSEdition Core
GitCommitId 7.0.1
OS Microsoft Windows 10.0.19041
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
如果我输入
wsl -l | Get-Member
输出通知我输出类型是字符串。
如果我输入
(wsl -l).GetType()
输出通知我输出类型是数组。
我看到这个的全部原因是我试图解析该命令的输出,并且在很长一段时间令人沮丧的时候,我认为我正在使用一个带有嵌入式回车/换行符的连续字符串,但看起来我实际上是在处理一个字符串数组。
所以我的问题是:命令周围的括号如何看似改变可执行文件输出的性质? 是不是没有括号,'wsl -l' 的输出一次被流式传输到 Get-Member 一行(数组元素)?
谢谢!
如果要使用Get-Member
按原样检查对象,则不能使用管道,因为管道枚举类集合的对象,然后Get-Member
报告这些对象之间的(不同的)类型集集合的元素。
相反,使用Get-Member -InputObject
,它报告整个集合:
Get-Member -InputObject (wsl -l) # -> shows the members of type System.Object[]
PowerShell的流从外部程序,如输出的标准输出wsl
,一行行。 也就是说,它在接收到每一行时将其发送到管道。
如果将命令的输出分配给变量或将命令括在()
, 分组运算符,则收集流输出:
如果只有一个输出 line ,则返回一个(单个) [string]
实例。
如果有多个输出行,PowerShell会将它们收集在一个常规的、 [object[]]
类型的数组中,在这种情况下,其元素是[string]
实例。
如果您想避免这种歧义并确保结果始终是一个数组,您可以使用@()
, 数组子表达式运算符- @(wsl -l)
- 或者,在分配给变量时,对该变量进行类型约束作为数组 - [array] $out = wsl -l
要获得输出的单个、可能是多行的字符串表示形式,请使用-join
运算符:
(wsl -l) -join "`n" # or use [Environment]::NewLine instead of "`n"
[Environment]::NewLine
返回适合平台的换行符。 / 序列(Unix 上的 LF-only ( "`n"
),Windows 上的 CRLF ( "`r`n"
))。 但是,PowerShell 很乐意在所有平台上接受任何一种形式。
笔记:
Out-String
cmdlet 也会返回单个多行字符串,但它总是添加一个尾随换行符。 (如果您要使用-NoNewLine
,它不会使用任何换行符)。 如果您使用的是PowerShell [Core] v6.2+ ,您也可以使用Join-String
cmdlet :
wsl -l | Join-String -Separator "`n"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.