2016-09-09 6 views
1

書いたモジュール(https://github.com/joxz/PSEXOS)の関数(Invoke-EXOScommand)から何らかの奇妙な動作が発生しています。このモジュールは、JSONRPC経由で私のネットワークスイッチに接続するように設計されています。モジュールから呼び出されたときのオブジェクトの動作が異なります

エラーや作業のシナリオはJSONとの主旨の両方である:https://gist.github.com/joxz/195d6ec6d211f6e00421cf13436411fd

これまでのところは良い、私はレスポンスとしてJSONを取得し、PowerShellのオブジェクトにConvertFrom-JSONでそれを変換しています。

{ 
    "id": "10", 
    "jsonrpc": "2.0", 
    "result": [ 
    { 
     "CLIoutput": "Port  Link  Tx Pkt  Tx Byte  Rx Pkt  Rx Byte  Rx Pkt  Rx Pkt  Tx Pkt 
    Tx Pkt\n   State  Count  Count  Count  Count  Bcast  Mcast  Bcast  M 
cast\n========= ===== =========== =========== =========== =========== =========== =========== =========== ===========\n1 
     R    0   0   0   0   0   0   0   0\n======== 
= ===== =========== =========== =========== =========== =========== =========== =========== ===========\n   > in 
Port indicates Port Display Name truncated past 8 characters\n   > in Count indicates value exceeds column width. 
Use 'wide' option or '0' to clear.\n   Link State: A-Active, R-Ready, NP-Port Not Present, L-Loopback\n" 
    }, 
    { 
     "show_ports_stats": { 
     "dot1dTpPortInDiscards": 0, 
     "dot1dTpPortInFrames": 0, 
     "dot1dTpPortMaxInfo": 1500, 
     "dot1dTpPortOutFrames": 0, 
     "linkState": 0, 
     "port": 1, 
     "portList": 1, 
     "portNoSnmp": 1, 
     "rxBcast": 0, 
     "rxByteCnt": 0, 
     "rxMcast": 0, 
     "rxPktCnt": 0, 
     "txBcast": 0, 
     "txByteCnt": 0, 
     "txMcast": 0, 
     "txPktCnt": 0 
     }, 
     "status": "SUCCESS" 
    } 
    ] 
} 

意図したとおり、私はコピーしていたとき/ PowerShellウィンドウに関数を貼り付け、それは動作します:

私は私のモジュールをインストールし、私はパースエラーを取得する関数を呼び出す
VERBOSE: 

    TypeName: System.Management.Automation.PSCustomObject 
Name  MemberType Definition 
----  ---------- ---------- 
Equals  Method  bool Equals(System.Object obj) 
GetHashCode Method  int GetHashCode() 
GetType  Method  type GetType() 
ToString Method  string ToString() 
CLIoutput NoteProperty string CLIoutput=Port  Link  Tx Pkt  Tx Byte  Rx Pkt  Rx Byte  Rx 
Pk... 


Port  Link  Tx Pkt  Tx Byte  Rx Pkt  Rx Byte  Rx Pkt  Rx Pkt  Tx Pkt  Tx Pkt 
      State  Count  Count  Count  Count  Bcast  Mcast  Bcast  Mcast 
========= ===== =========== =========== =========== =========== =========== =========== =========== =========== 

VERBOSE: 

    TypeName: System.Management.Automation.PSCustomObject 
Name  MemberType Definition 
----  ---------- ---------- 
Equals  Method  bool Equals(System.Object obj) 
GetHashCode Method  int GetHashCode() 
GetType  Method  type GetType() 
ToString Method  string ToString() 
CLIoutput NoteProperty System.String CLIoutput=Port  Link  Tx Pkt  Tx Byte  Rx Pkt  Rx Byte 
... 


Property 'CLIoutput' cannot be found on this object. Make sure that it exists. 
At C:\maintenance\PSEXOS\Functions\Invoke-EXOScommand.ps1:114 char:9 
+   $clioutput = $responseobj.result.CLIoutput 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], PropertyNotFoundException 
    + FullyQualifiedErrorId : PropertyNotFoundStrict 

どちらの場合も、私は「CLIoutput」をNotePropertyとして持っているので、モジュールから呼び出されたときになぜそれが認識されないのですか?これは範囲の問題ですか?すべての機能は.psm1ファイルにドット区切りされています。また

モジュールで2つのその他の機能は、(取得-VLANのは、Get-VlanPortInfo)をsmiliarように設計し、仕事を...あなたのJSONで

+0

この問題では単純な方法でコードを記述できますか?だから人々はリンクをたどる必要はありませんし、他の人がこの質問を探すときには、ある時点で死んだリンクに関する問題はありません。 – Hayt

+0

プロジェクト全体が多少あるかもしれませんが、その2つの例はそれをカバーしているかもしれません。 – joxz

+0

あなたのコードを編集したり、モジュール内の関数を編集したことはありますか?モジュールを削除して-Forceで再インポートすることで、キャッシュの問題を解消してください。私は過去にこの問題に苦しんできました。 'Get-Command | 'を実行すると、インポートされたモジュールが実際にあなたの関数の最新バージョンを実行していることを確認できます。関数の内容を画面にダンプする必要があります。 'Get-Vlans'、' Get-VlanPortInfo'がうまくいっているのに、問題のある$ CLIoutputが含まれていないことに注意する価値があります。 – Robin

答えて

1

見ている:resultプロパティは配列の最初のオブジェクトでありますCLIoutputプロパティがありますが、2番目のプロパティはありません。存在しないReferencingプロパティは、厳密モード(行のPSEXOS.psm1ファイル内)でエラーを引き起こします。私の推測では、対話型のPowerShellセッションにこの行を追加するのを忘れてしまったため、厳密なモードではなく、単に既存のプロパティではなく$nullを返します。 result配列の最初の要素だけを参照する必要があるようです:

$clioutput = $responseobj.result[0].CLIoutput 
+0

あなたは正しいです。 '$ clioutput = $ responseobj.result [0] .CLIoutput'はそれを解決しました。それでも私の頭を掴むことはできません。 '$ responseobj.result | get-member'はCLIoutputをNotePropertyとして明確に示しました。ありがとうございました! – joxz

+0

@joxzしかし、 '$ responseobj.result [1] | get-member'は 'CLIoutput'プロパティを表示しません。 – PetSerAl

関連する問題