繁体   English   中英

使用 PowerShell 解析 Win32 可执行输出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM