2

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

这是问题所在。导入自定义模块并运行 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 编号放入一个数组或对象中,当我需要删除它们时,我可以引用并使用它来循环遍历它们。

我向开发人员询问了他模块的更新版本,但新版本产生了相同的结果。我想在我再纠缠他之前确保我的代码是正确的。

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

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
4

2 回答 2

2

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

于 2013-01-16T01:19:28.233 回答
2

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

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

于 2013-01-16T17:34:44.977 回答