2016-09-09 7 views
1

Ich bekomme seltsames Verhalten von einer Funktion (Invoke-EXOScommand) in einem Modul, das ich geschrieben habe (https://github.com/joxz/PSEXOS). Das Modul wurde entwickelt, um über JSONRPC mit meinen Netzwerk-Switches verbunden zu werden.Objekt Verhalten unterscheidet sich beim Aufruf von Modul

Der Fehler und Arbeitsszenarien sind sowohl im Kern mit der json: https://gist.github.com/joxz/195d6ec6d211f6e00421cf13436411fd

So weit so gut, ich bin eine JSON als Antwort bekommen und wandeln es mit ConvertFrom-Json zu Powershell-Objekte.

{ 
    "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" 
    } 
    ] 
} 

Wenn ich Kopieren/Einfügen der Funktion in einem Powershell-Fenster funktioniert wie beabsichtigt:

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 
========= ===== =========== =========== =========== =========== =========== =========== =========== =========== 

Wenn ich mein Modul installieren und rufen Sie die Funktion, die ich ein Parsing-Fehler erhalten:

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 

In beiden Fällen habe ich "CLIoutput" als eine NoteProperty, also warum wird es nicht erkannt, wenn es vom Modul aufgerufen wird? Ist das ein Problem mit dem Umfang? Alle Funktionen sind in der .psm1-Datei mit Punkten versehen.

Auch die 2 anderen Funktionen im Modul (Get-Vlans, Get-VlanPortInfo) in einer smiliar Weise entworfen und Arbeit tun ...

+0

Können Sie Ihren Code in vereinfachter Weise in dieser Frage zu stellen? Also müssen die Leute den Links nicht folgen und wenn andere nach dieser Frage suchen, wird es irgendwann keine Probleme mit toten Links geben. – Hayt

+0

Sicher! Das ganze Projekt mag ein bisschen viel sein, aber diese 2 Beispiele können es abdecken ... – joxz

+0

Hast du an deinem Code herumgebastelt/die Funktion im Modul bearbeitet? Versuchen Sie Caching-Probleme zu beseitigen, indem Sie das Modul entfernen und mit -Force erneut importieren. Ich habe in der Vergangenheit unter diesem Problem gelitten. Sie können bestätigen, dass das importierte Modul tatsächlich die neueste Version Ihrer Funktion ausführt, indem Sie "Get-Command |" ausführen fl 'und es sollte den Inhalt der Funktion auf dem Bildschirm ausgeben. Bemerkenswert für den Fall, dass "Get-Vlans", "Get-VlanPortInfo" funktionieren, enthalten sie nicht die problematische $ CLIoutput. – Robin

Antwort

1

Sehen Sie sich Ihre JSON: result Eigenschaft ein Array ist, wo erste Objekt haben CLIoutput Eigenschaft, während Sekunde nicht tut. Die Referenzierungseigenschaft, die nicht existiert, verursacht einen Fehler im strikten Modus (Set-StrictMode -Version Latest Zeile in Ihrer PSEXOS.psm1 Datei). Meine Vermutung ist, dass Sie vergessen haben, diese Zeile zu Ihrer interaktiven PowerShell-Sitzung hinzuzufügen, sodass sie nicht im strikten Modus ausgeführt wird und nur $null für nicht vorhandene Eigenschaft zurückgibt. Es sieht aus wie Sie nur das erste Element des result Array verweisen müssen:

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

Sie hatten Recht. '$ clioutput = $ responseobj.result [0] .CLIoutput' löste es. Ich kann es immer noch nicht verstehen. '$ responseobj.result | get-member "zeigte CLIoutput eindeutig als NoteProperty. Vielen Dank! – joxz

+0

@joxz Aber '$ responseobj.result [1] | get-member zeigt die Eigenschaft 'CLIoutput' nicht an. – PetSerAl

Verwandte Themen