2

カスタムモジュールからの出力を使用して、できればオブジェクトを変数に入れるにはどうすればよいですか?

これが問題です。カスタム モジュールをインポートしてコマンドレットを実行すると、常に同じ情報が出力され、変数への格納やパイプラインへの挿入が拒否されます。パイプラインまたは変数に入れようとすると、元の出力が再現され、変数またはパイプライン シンボルが無視されます。

例:

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

「$aはnullです」というコメントで証明したように、コマンドレットは値を返さないため、結果を出力するためにWrite-Hostを使用していると思います。FormatStartData結果を出力する前にFormat-Tableを使用した場合、およびその他のformatdataオブジェクトを含む配列を受け取ることになります。

結果を保存してパイプできるようにするには、スクリプトコマンドレットの場合はWrite-Outputを使用する必要があり、バイナリコマンドレット(.dllモジュール)を使用している場合はWriteObject(そうだと思います)を使用する必要があります。要約すると、モジュールを更新する必要があります。

于 2013-01-16T17:34:44.977 に答える
2

開発者はおそらく独自の出力をフォーマットしているようです。それか、Write-Host を使用しています。私は前者を疑っていますが、どちらの場合でも、彼らが望むことを行うための規定の方法は、Format-* または Write-Host を介してオブジェクトを実行せずにオブジェクトを出力することです。適切なデフォルトのフォーマット表示が必要な場合は、フォーマット ファイルを作成し、ファイル内のモジュールのフィールド.ps1xmlを使用または使用する必要があります。Update-FormatDataFormatsToProcess.psd1

于 2013-01-16T01:19:28.233 に答える