Powershell - 自定义模块的输出无法使用

时间:2013-01-16 00:40:31

标签: powershell pipeline output cmdlets

如何使用自定义模块的输出放入变量(最好是对象)。

这是问题所在。导入自定义模块并运行cmdlet后,它始终输出相同的信息,并拒绝存储在变量中或放入管道中。尝试放入管道或变量只是重现原始输出并忽略变量或管道符号。

示例:

PS C:\> Get-FCoEPorts -HbaIndex 0
Port List

Index   NodeWWN                         PortWWN                         FCID

-----   -------                         -------                         ----

 0      10:00:A0:36:9F:0B:3E:E9         20:00:A0:36:9F:0B:3E:E9                     0x4A0680

 1      20:A8:00:0D:EC:96:EA:01         00:FC:0E:00:A8:00:80:00                 0x36A00120

 ...

 93*    10:00:A0:36:9F:0B:3E:E9         20:3E:A0:36:9F:0B:3E:E9                 0x4A0764

 94     20:A8:00:0D:EC:96:EA:01         00:FC:0E:00:A8:00:80:00                 0x36A03F20

* - Virtual Ports.

这是预期的输出,但尝试这个:

$a = Get-FCoEPorts -HbaIndex 0

或者这个:

(Get-FCoEPorts -HbaIndex 0).PortWWN

或者这个:

$getports = Get-FCoEPorts -HbaIndex 0 | select -expand PortWWN

每个命令给出与顶部显示的结果相同的结果,并尝试使用引用的变量导致无输出......就像PowerShell忽略除Get-IntelFCoEPorts之外的所有其他命令。 这是我正在使用的代码的问题,还是模块背后的代码可能有问题?

我使用此模块的目的是将PortWWN Numbers放入一个数组或对象中,我可以引用它并在需要删除它时使用它来循环。

我向开发人员询问了他的模块的更新版本,但新版本产生了相同的结果。我想确保我的代码是正确的,然后我再次诅咒他了。

更新: 我试着输出一个没有运气的文件。该文件为空。我也试过开始和停止这样的成绩单:

C:\> $ErrorActionPreference="SilentlyContinue"
PS C:\> Stop-Transcript | out-null
PS C:\> $ErrorActionPreference = "Continue"
PS C:\> Start-Transcript -path C:\Users\Administrator\Desktop\output.txt -append
Transcript started, output file is C:\Users\Administrator\Desktop\output.txt
PS C:\> Get-IntelFCoEPorts -HbaIndex 0
    Index   NodeWWN                         PortWWN                         FCID

-----   -------                         -------                         ----

 0      10:00:A0:36:9F:0B:3E:E9         20:00:A0:36:9F:0B:3E:E9                     0x4A0680

 1      20:A8:00:0D:EC:96:EA:01         00:FC:0E:00:A8:00:80:00                 0x36A00120

 ...

 93*    10:00:A0:36:9F:0B:3E:E9         20:3E:A0:36:9F:0B:3E:E9                 0x4A0764

 94     20:A8:00:0D:EC:96:EA:01         00:FC:0E:00:A8:00:80:00                 0x36A03F20

* - Virtual Ports.
PS C:\> Stop-Transcript
Transcript stopped, output file is C:\Users\Administrator\Desktop\output.txt

输出如此:

PS C:\> Stop-Transcript
Transcript started, output file is C:\Users\Administrator\Desktop\output.txt
PS C:\> Get-IntelFCoEPorts -HbaIndex 0

2 个答案:

答案 0 :(得分:1)

看起来开发人员可能正在格式化他们自己的输出。要么是他们正在使用Write-Host。我怀疑前者,但在任何一种情况下,按照规定的方式做他们想要的是输出对象而不通过Format- *或Write-Host运行它们。如果他们想要一个漂亮的默认格式化显示,那么他们需要创建格式文件.ps1xml并使用Update-FormatData或使用FormatsToProcess文件中的模块.psd1字段。

答案 1 :(得分:1)

由于cmdlet没有返回任何值,因为您使用“$ a is null”注释证明了这一点,我相信他们正在使用Write-Host输出结果。如果他们在输出结果之前使用了Format-Table,那么您将收到一个包含FormatStartData和其他formatdata对象的数组。

为了能够保存和管道结果,如果脚本cmdlet或WriteObject(我认为是),如果他们使用二进制cmdlet(.dll模块),则需要使用Write-Output。总结一下:他们应该更新他们的模块。