如何在 PowerShell 脚本中使用 Format-Custom 以自定义格式显示输出?

How to display output in a custom format using Format-Custom, in PowerShell scripting?

Get-CIMInstance -ClassName Win32_Printer | Select-Object Name, @{label="IPAddress";expression={($_.comment | Select-string -Pattern "\d{1,3}(\.\d{1,3}){3}" -AllMatches).Matches.value}}

以上命令给出了以下输出:

Name                          IPAddress      
----                          ---------      
Webex Document Loader         100.100.100.100
OneNote (Desktop)             111.111.111.111
Microsoft XPS Document Writer 120.120.120.120
Microsoft Print to PDF        123.123.123.123
Fax                           127.127.127.127

我正在寻找一些可以通过管道传输到上述命令中的 cmdlet,以便我可以将输出自定义为以下内容:

Webex Document Loader(100.100.100.100), OneNote (Desktop)(111.111.111.111), Microsoft XPS Document Writer(120.120.120.120), Microsoft Print to PDF(123.123.123.123), Fax(127.127.127.127)

提前致谢

PowerShell Core 7.0 可以使用 Join-String:

Get-CIMInstance -ClassName Win32_Printer | 
    Select-Object Name, @{label="IPAddress";expression={($_.comment | Select-string -Pattern "\d{1,3}(\.\d{1,3}){3}" -AllMatches).Matches.value}} |
    Join-String -Property { '{0}({1})' -f $_.Name, $_.IPAddress } -Separator ', '

Join-String cmdlet 用于格式化输入对象并将其连接到单个字符串中。参数 -Separator 应为 self-explanatory。 -Property 的参数指定 calculated property that defines a script block which formats the input object. The format operator -f 用于干净地生成所需的格式。或者,它可以仅使用字符串插值来完成,例如。 G。 "$($_.Name)($($_.IPAddress))" 但我不喜欢所有括号。


PowerShell 版本早于 7.0 的替代解决方案,不提供 Join-String:

(Get-CIMInstance -ClassName Win32_Printer | 
    Select-Object Name, @{label="IPAddress";expression={($_.comment | Select-string -Pattern "\d{1,3}(\.\d{1,3}){3}" -AllMatches).Matches.value}} |
    ForEach-Object {'{0}({1})' -f $_.Name, $_.IPAddress}) -join ', '

此处 -join operator is used to produce a single one-line string. The grouping operator 用于将管道转换为一个表达式,该表达式将所有输出收集到一个数组中,-join 运算符可以将其作为其 left-hand-side 参数。