Jump to content

PowerShell: Invoke-Command liefert einzelne Objekte


Direkt zur Lösung Gelöst von cj_berlin,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Unterhalb des Registrierungsschlüssel HKEY_CURRENT_USER\TEST befinden sich mehrere Unterschlüssel, deren Namen durchnummeriert sind.  Per Invoke-Command frage ich die Unterschlüsseln von mehreren Remotemaschinen ab. Leider bekomme ich jeder einzelne Objekt, und nicht wie erwartet, die Sammlung zurück. Die Varianten, den Inhalt der Pipeline in einer Variablen  zu speichern noch jedes Objekt einer ArrayList hinzufügen, brachten das gewünschte Ergebenis. Führe ich den Skriptblock lokal aus, funktioniert es erwartungsgemäß.

 

Wie muss ich mein Skript abändern, damit  ichdie Sammlung und nicht jedes einzelne Ojekt von den remote abgefragten Computern erhalte?

 

$params = @{
    ComputerName = Get-ADComputer -Filter 'Name -like "test*' | Select-Object -ExpandProperty Name
    ScriptBlock  = {
        $regKey    = 'Registry::HKEY_CURRENT_USER\TEST'

        $test = New-Object -TypeName System.Collections.ArrayList
        # $test = Get-ChildItem -Path $regKey -Recurse -ErrorAction SilentlyContinue | 
        Get-ChildItem -Path $regKey -Recurse -ErrorAction SilentlyContinue | 
        ForEach-Object {
            $null = $test.Add(
                [pscustomobject]@{
                    Version = [int]($PSItem | Select-Object -ExpandProperty PSChildName)
                    IsValid = [boolean]$PSItem.GetValue('IsValid', $false)
                })
        }

        $test

    }
    Credential   = Get-Credential -Message 'Please enter your credentials'
    AsJob        = $true
}

$job = Invoke-Command @params
Wait-Job -Job $job
Receive-Job -Job $job -Keep 

 

Geschrieben

Nur damit ich es richtig verstehe:

 

Der Job gibt pro Zielcomputer ein Array zurück. Und weil es mehrere Jobs sind, hast Du anschließend ein "Array von Arrays", aber nicht wie erwartet verschachtelt (ein Array, in dem jedes Element wiederum ein Array ist), sondern alles flat. Entspriicht eigentlich genau meiner Erwartung :-) Wenn Du das anders haben willst, kannst Du vermutlich die Jobs einzeln abholen - ich hab nie mit Jobs gearbeitet, daher wenig Erfahrung, ich verwende nahezu nur Runspaces.

 

Das Hinzufügen eines Arrays zu einem Array kann kompliziert sein :-) 

Geschrieben (bearbeitet)

Das ist halt nicht gottgegeben, sondern Snover-/Payette-gegeben. Wenn ich sage, ich gebe eine Collection zurück, von einem bestimmten Typ, ist es keine überzogene Erwartung, dass PowerShell sie nicht in ihren internen Array-Typ wandelt und dann mit anderen ähnlichen Ergebnissen zusammenrührt. Ja, wir wissen, dass das so ist, aber wir wissen ja auch, dass PowerShell viele Quirks hat, die nur mit "ist halt so" zu erklären sind.

bearbeitet von cj_berlin
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...