如何使用自定义模块的输出放入变量(最好是对象)。
这是问题所在。导入自定义模块并运行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
答案 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。总结一下:他们应该更新他们的模块。