2

Ich habe Probleme mit Powershell 5-Klassen und -Objekttypen beim erneuten Importieren von deserialisierten Objekten mit dem Import-CliXml-Befehl.Deserialisierte Objekttypprobleme - speziell bei Powershell 5-Klassen und Import-CliXml

Ich habe ein Objekt vom Typ Computer, und ich wünschte, das als XML speichern und wieder importieren dann dies das nächste Mal das Skript ausgeführt wird

class Computer 
{ 
    $Private:hostname 
    $Private:ipAddress 

    Computer([String] $hostname, [String] $ipAddress) 
    { 
     $this.hostname = $hostname 
     $this.ipAddress = $ipAddress 
    } 
    static [Computer] reserialize([PSObject] $deserializedComputer) 
    { 
     return [Computer]::new($deserializedComputer.hostname, $deserializedComputer.ipAddress) 
    } 
} 

ich exportieren und importieren Sie das Objekt mit dem folgenden:

$computer = [Computer]::new("test-machine", "192.168.1.2") 
$computer | Export-CliXml C:\Powershell\exportTest.xml 
$deserializedComputer = Import-CliXml C:\Powershell\exportTest.xml 

Ich verstehe, dass wenn dieses Objekt reimportiert wird, es deserialisiert wird und im Grunde nur ein Datencontainer (des Typs [Deserialized.Computer]) ist. Ich versuche herauszufinden, wie man dieses Objekt eincheckt, bevor ich versuche, es mit meiner reserialize-Methode zu reserialisieren.

Zum Beispiel, wenn ich versuche, und gegossenes $ deserializedComputer es sagt mir, dass:

Cannot convert value "Computer" to type "Computer". Error: "Cannot convert the "Computer" value of type "Deserialized.Computer" to type 
"Computer"." 

Ich verstehe, warum dies nicht gegossen werden kann, ich bin nur die Fehlermeldung mit, dass das Objekt darauf hinzuweisen, Wissen hat, dass es vom Typ ist [Deserialized.Computer]

ich nichts zurück von $ deserializedComputer.getMember finden(), die, dass es [Deserialized.Computer] ist vom Typ anzeigt, wird die einzige Information, die ich finden kann, dass es vom Typ [PSObject], wie kann ich überprüfen, ob dieses Objekt tatsächlich vom Typ [Deserialized.C ist Computer]?

Ich sollte diesen Typ hinzufügen [Deserialized.Computer] nicht zur Laufzeit existieren, so kann ich dies nicht in meinem Code verwenden, um direkt, sonst würde ich einfach nutzen:

$deserializedComputer.getType() -eq [Deserialized.Computer] 
+1

'$ deserializedComputer' ist ein' [psobject] 'mit' PSTypeNames' Blatt Wert auf 'Deserialized.Computer'. Siehe '$ deserializedComputer.psobject.TypeNames' –

Antwort

2

Verwendung (Hinweis: gm ist die Alias ​​für Get-Member)

$type = $deserializedComputer | gm | Select -Property TypeName -First 1 

dann sollten Sie in der Lage sein, den Wert für den Zugriff wie

$type.TypeName 

Sie können auch sicherstellen, überprüfen geben, dass es ein Computer mithilfe ist

$deserializedComputer.ToString() 

Oder wenn Sie eine andere Art und Weise verwenden

[type]$deserializedComputer.ToString() 

Edit:

Sie können es durch die folgende

# you can also use $deserializedComputer.ToString() -eq [Computer].ToString() 
if ([type]$deserializedComputer.ToString() -eq [Computer]) 
{ 

} 

Your Full-Klasse würde in etwa so aussehen:

class Computer 
{ 
    $Private:hostname 
    $Private:ipAddress 

    Computer(){} 

    Computer([String] $hostname, [String] $ipAddress) 
    { 
     $this.hostname = $hostname 
     $this.ipAddress = $ipAddress 
    } 
    static [Computer] reserialize([PSObject] $deserializedComputer) 
    { 
    # you can also use $deserializedComputer.ToString() -eq [Computer].ToString() 
    if ([type]$deserializedComputer.ToString() -eq [Computer]) 
    { 
     return [Computer]::new($deserializedComputer.hostname, $deserializedComputer.ipAddress) 
    } 
    return [Computer]::new() 
    } 
} 

Und

/Importieren Exportieren
$filePath = "C:\Powershell\exportTest.xml" 

$computer = [Computer]::new("test-machine", "192.168.1.2") 
$computer | Export-CliXml $filePath 
$deserializedComputer = Import-CliXml $filePath 

Und neu serialisieren Methode

[Computer]::reserialize($deserializedComputer) 
Verwandte Themen