none
Einsatz von Variablen - Anfängerfrage(n) RRS feed

  • Frage

  • Hallo PS User,

    Ich bin noch blutiger Anfänger so please go easy on me.

    Idee war es ein kleines Script selbst zu bauen um mich mit dem Einsatz von Variablen vertraut zu machen.
    Leider scheine ich da noch nicht richtig unterwegs zu sein.

    Erste Variable die ich angelegt habe:

    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"

    funktioniert alleingestellt.

    Verschachtelt in Variable 2 schon nicht mehr:

    $AddFeatures = Add-WindowsFeature -ConfigurationFilePath $ConfigFile

    Also habe ich es bei

    $AddFeatures = Add-WindowsFeature -ConfigurationFilePath "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"

    belassen. Diese Zeile funktioniert.

    Ein Absetzen von

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { $AddFeatures } -Credential ad\Hanspaul

    führt aber auch zu

    Invoke-Command : The value of the FilePath parameter must be a Windows PowerShell script file. Enter the path to a file with a .ps1 file name extension and try the command again.
    Parameter name: filePath
    At line:1 char:1
    + Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 $AddF ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Invoke-Command], ArgumentException
        + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.InvokeCommandCommand

    Nun ist -ScriptBlock keine Variable und die Fehlermeldung insofern für mich schlüssig.

    Ausgeführt als:

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { Add-WindowsFeature -ConfigurationFilePath "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml" } -Credential ad\Hanspaul

    funktioniert es...quasi Folgerichtig.

    Aber ich habe beim herumprobieren auch nicht wirklich herausgefunden wie ich da besser vorgehen sollte.

    Am nächsten käme ja noch

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -OutVariable $AddFeatures -Credential ad\Hanspaul

    aber dann:

    Invoke-Command : Parameter set cannot be resolved using the specified named parameters.

    Sieht so aus als habe ich da ein Verständnisproblem.
    Kann mir da wer auf die Sprünge helfen?



    Dienstag, 13. Januar 2015 17:43

Antworten

  • Hallo Enrico!


    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"

    funktioniert alleingestellt.

    Verschachtelt in Variable 2 schon nicht mehr:

    $AddFeatures = Add-WindowsFeature -ConfigurationFilePath $ConfigFile



    Ich glaube du hast hier einen großen Denkfehler.
    In der oben gezeigten Zeile wird das Cmdlet Add-WindowsFeature sofort ausgeführt! Mit dem Parameter -ConfigurationFilePath und dem Wert der in der Variable $ConfigFile steht.
    Das Ergebnis von der Ausführung wird in der Variablen $AddFeatures abgelegt.
    Ich denke du versuchst die Kommandozeile als Text in der Variablen $AddFeatures  abzulegen.
    Das geht so:

    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"
    $AddFeatures = "Add-WindowsFeature -ConfigurationFilePath $ConfigFile"


    Nun steht alles als Text in der Variablen $AddFeatures.

    Den Text mit der Befehlszeile kann man nun mit dem & Zeichen ausführen lassen.

    & $AddFeatures

    Das macht alles keine Sinn und ist in PowerShell nicht so vorgesehen.

    Ein Scriptblock ist dafür da, die Kommandos aufzunehmen die ausgeführt werden sollen.

    Der Scriptblock wird zum Zielrechner übertragen und dort ausgeführt.

    Etwa so:

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { Add-WindowsFeature -ConfigurationFilePath  "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml" } -Credential ad\Hanspaul

    Wenn du dem Scriptblock von 'aussen' einene Wert zuführen willst musst du dies über den Parameter -ArgumentList machen.

    Hier hast du zwei möglichkeiten, die angereichten Argumenten innerhalb des Scriptblockes zu verarbeiten.
    Mit der Automatisch erzeugten Variablen $Args wird die Position der Argumente benutzt um die Argumente zuordnenen zu können:

    # Alle Services auflisten die mit dem Buchstaben S anfangen, ausser den Service mit dem Namen Spooler
    # 'S*' ist an der Position (Index) 0 in der Agumentliste, 'Spooler' ist an der Position 1 (Index) in der Liste 
    Invoke-Command -ScriptBlock { Get-Service -Name $Args[0] -Exclude $Args[1] } -ArgumentList 'S*','Spooler'

    Besser ist es Mann benutzt benannte Argumente da kann man nicht so leicht durcheinander kommen. BHier muss man im Scriptlock den param() block nutzen.

    # Alle Services auflisten die mit dem Buchstaben S anfangen, ausser den Service mit dem Namen Spooler
    # 'S*' am Index 0 in der Agumentliste geht in den Parameter $Name, 'Spooler' am Index 1 in der Agumentliste geht in den Parameter $Exclude
    # Die Parameter aus dem param() Block können mit ihrem Namen im Scripblock verwendet werden 
    Invoke-Command -ScriptBlock { param ($Name, $Exclude) Get-Service -Name $Name -Exclude $Exclude] } -ArgumentList 'S*','Spooler'

    Dein Befehl müsste demnach so aussehen:
    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"
    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($ConfigFile) Add-WindowsFeature -ConfigurationFilePath $ConfigFile } -ArgumentList $ConfigFile -Credential ad\Hanspaul


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort markiert Enrico Stephan Donnerstag, 15. Januar 2015 11:34
    Donnerstag, 15. Januar 2015 06:46

Alle Antworten

  • Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { $AddFeatures } -Credential ad\Hanspaul

    Hier ist dein Problem das du die Variable an die Remotesession erst übergeben musst. Der Computer (also zb Hyper-V-08) kennt die Variable nicht die du auf deinem PC angelegt hast. 

    Probiers mit:

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures);$AddFeatures } -Credential ad\Hanspaul -ArgumentList $AddFeatures 

    oder du packst in die Variable $AddFeatures noch die geschweiften Klammern rein und lässt sie stattdessen hie raus:

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock $AddFeatures -Credential ad\Hanspaul

    Dann musst du den Parameter bzw die Variable nicht übergeben.

    Hilft dir das?

    Warum $AddFeatures = Add-WindowsFeature -ConfigurationFilePath $ConfigFile 

    nicht geht kann ich dir grad auch nicht sagen... was kommt denn für ein Fehler?

    Sanfte Grüße,

    Sebastian ;)


    • Bearbeitet Reittier Mittwoch, 14. Januar 2015 09:29
    Mittwoch, 14. Januar 2015 09:27
  • Warum $AddFeatures = Add-WindowsFeature -ConfigurationFilePath $ConfigFile 

    nicht geht kann ich dir grad auch nicht sagen... was kommt denn für ein Fehler?


    Das geht. da habe ich mich vertan. ;)
    Mittwoch, 14. Januar 2015 15:55
  • Ich habe etwas rumexperimentiert aber so richtig knülle wird das nicht.

    Der beschriebene Weg von dir via Param hat nicht gefruchtet. Ich bekomme dabei diese Ausgabe:

    PS C:\Users\Enrico.Stephan> Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures);$AddFeatures } -Credential ad\Hanspaul -ArgumentList $AddFeatures
    
    Success Restart Needed Exit Code      Feature Result                                PSComputerName                                                                                                    
    ------- -------------- ---------      --------------                                --------------                                                                                                    
    False   No             Failed         {}                                            Hyper-V-10                                                                                                        
    False   No             Failed         {}                                            Hyper-V-08                                                                                                        
    False   No             Failed         {}                                            Hyper-V-09  


    Im Vergleich mit einer "normalen" Eingabe ohne $AddFeatures

    PS C:\Users\Enrico.Stephan> Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { Add-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools -restart } -Credential ad\Hanspaul
    
    Success Restart Needed Exit Code      Feature Result                                PSComputerName                                                                                                    
    ------- -------------- ---------      --------------                                --------------                                                                                                    
    True    No             NoChangeNeeded {}                                            Hyper-V-10                                                                                                        
    True    No             NoChangeNeeded {}                                            Hyper-V-08                                                                                                        
    True    No             Success        {SNMP Tools, SNMP Service, SNMP WMI Provider} Hyper-V-09   

    Ich habe die $configFile erstmal weggelassen da etwas doppelt gemoppelt und benutze der einfacheithalber erstmal keine config file.

    Dabei fällt mir auf, das auf meinem lokalen Rechner schon beim erstellen der $AddFeatures gleich losgerannt wird zur Installation was dann mangels rechten fehlschlägt. Sollte sowas passieren? Macht doch garkeinen Sinn beim Variablen definieren schon loslegen zu wollen?!

    $AddFeatures = Add-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools -restart

    PS C:\Users\Enrico.Stephan> $AddFeatures = Add-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools -restart
    Add-WindowsFeature : You do not have adequate user rights to make changes to the target computer. If you are already a member of the Administrators group on the target computer, the changes might 
    have failed because of security restrictions imposed by User Account Control. Try running Install-WindowsFeature in a Windows PowerShell session that has been opened with elevated rights (Run as 
    administrator).
    At line:1 char:16
    + ... dFeatures = Add-WindowsFeature SNMP-Service,SNMP-WMI-Provider -Includ ...
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : PermissionDenied: (@{Vhd=; Credent...Name=localhost}:PSObject) [Install-WindowsFeature], Exception
        + FullyQualifiedErrorId : Provider_UserIsNotAdmininistrator,Microsoft.Windows.ServerManager.Commands.AddWindowsFeatureCommand

    Mittwoch, 14. Januar 2015 16:03
  • Dabei fällt mir auf, das das TechNet Forum echt unglaublich viel Platz rechts und links im Fenster verschwendet. 0o

    (1920er Auflösung)

    Mittwoch, 14. Januar 2015 16:04
  • Hallo Enrico!


    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"

    funktioniert alleingestellt.

    Verschachtelt in Variable 2 schon nicht mehr:

    $AddFeatures = Add-WindowsFeature -ConfigurationFilePath $ConfigFile



    Ich glaube du hast hier einen großen Denkfehler.
    In der oben gezeigten Zeile wird das Cmdlet Add-WindowsFeature sofort ausgeführt! Mit dem Parameter -ConfigurationFilePath und dem Wert der in der Variable $ConfigFile steht.
    Das Ergebnis von der Ausführung wird in der Variablen $AddFeatures abgelegt.
    Ich denke du versuchst die Kommandozeile als Text in der Variablen $AddFeatures  abzulegen.
    Das geht so:

    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"
    $AddFeatures = "Add-WindowsFeature -ConfigurationFilePath $ConfigFile"


    Nun steht alles als Text in der Variablen $AddFeatures.

    Den Text mit der Befehlszeile kann man nun mit dem & Zeichen ausführen lassen.

    & $AddFeatures

    Das macht alles keine Sinn und ist in PowerShell nicht so vorgesehen.

    Ein Scriptblock ist dafür da, die Kommandos aufzunehmen die ausgeführt werden sollen.

    Der Scriptblock wird zum Zielrechner übertragen und dort ausgeführt.

    Etwa so:

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { Add-WindowsFeature -ConfigurationFilePath  "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml" } -Credential ad\Hanspaul

    Wenn du dem Scriptblock von 'aussen' einene Wert zuführen willst musst du dies über den Parameter -ArgumentList machen.

    Hier hast du zwei möglichkeiten, die angereichten Argumenten innerhalb des Scriptblockes zu verarbeiten.
    Mit der Automatisch erzeugten Variablen $Args wird die Position der Argumente benutzt um die Argumente zuordnenen zu können:

    # Alle Services auflisten die mit dem Buchstaben S anfangen, ausser den Service mit dem Namen Spooler
    # 'S*' ist an der Position (Index) 0 in der Agumentliste, 'Spooler' ist an der Position 1 (Index) in der Liste 
    Invoke-Command -ScriptBlock { Get-Service -Name $Args[0] -Exclude $Args[1] } -ArgumentList 'S*','Spooler'

    Besser ist es Mann benutzt benannte Argumente da kann man nicht so leicht durcheinander kommen. BHier muss man im Scriptlock den param() block nutzen.

    # Alle Services auflisten die mit dem Buchstaben S anfangen, ausser den Service mit dem Namen Spooler
    # 'S*' am Index 0 in der Agumentliste geht in den Parameter $Name, 'Spooler' am Index 1 in der Agumentliste geht in den Parameter $Exclude
    # Die Parameter aus dem param() Block können mit ihrem Namen im Scripblock verwendet werden 
    Invoke-Command -ScriptBlock { param ($Name, $Exclude) Get-Service -Name $Name -Exclude $Exclude] } -ArgumentList 'S*','Spooler'

    Dein Befehl müsste demnach so aussehen:
    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"
    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($ConfigFile) Add-WindowsFeature -ConfigurationFilePath $ConfigFile } -ArgumentList $ConfigFile -Credential ad\Hanspaul


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort markiert Enrico Stephan Donnerstag, 15. Januar 2015 11:34
    Donnerstag, 15. Januar 2015 06:46
  • Hallo Peter,

    Danke für die Antwort. :)

    Ich geh mal Schritt für Schritt durch... :)

    $AddFeatures = "Add-WindowsFeature -ConfigurationFilePath $ConfigFile"

    Hier hat sich ein Anfängerfehler eingeschlichen den ich nicht gesehen habe.
    Das da "" fehlt habe ich nicht gesehen.
    Ich habe halt mit $today = Get-Date gegengecheckt und mich gewundert...

    Ok... geklärt... ;)

    Mein Beispiel an sich ist etwas doppelt gemoppelt.

    $AddFeatures kann ja den Config File Pfad gleich selbst beinhalten.
    Des Lernens willen dachte ich halt, probiere es gleich mal in Nummer größer. :D

    Basis:

    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"
    
    
    $AddFeatures = "Install-WindowsFeature -ConfigurationFilePath $ConfigFile"

    Also...

    Dein Vorschlag des Befehls ala

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($ConfigFile) Add-WindowsFeature -ConfigurationFilePath $ConfigFile } -ArgumentList $ConfigFile -Credential ad\Hanspaul


    funktioniert grundsätzlich. Ich bekomme zwar einen PreRequfehler Hyper-V aber das ist ein anderen Thema. Ich sehe das es funktioniert.

    Wenn ich es also recht verstehe, kann ich innerhalb von

    -ScriptBlock { Install-WindowsFeature -ConfigurationFilePath ... }

    Nicht komplett Variablen besetzen sondern muss da irgendwie zwingend mit echtem ScriptBlock arbeiten den ich dann teilweise mit Variablen anreichen kann?!

    Ein austauschen gegen $AddFeatures

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures) $AddFeatures } -ArgumentList $AddFeatures -Credential ad\Hanspaul

    ergibt jedenfalls nur

    PS C:\Users\Enrico.Stephan> Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures) $AddFeatures } -ArgumentList $AddFeatures -Credential ad\Hanspaul
    Install-WindowsFeature -ConfigurationFilePath \\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml
    Install-WindowsFeature -ConfigurationFilePath \\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml
    Install-WindowsFeature -ConfigurationFilePath \\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml
    Ich dachte ja es wäre halt irgendwie möglich nur $Addfeatures da hineinzupacken damit ich nur jeweils einmal die Variablen definiere und zwar ganz oben im Script.
    Damit täte ich mir ja spätere aufwendigere Anpassunegn ersparen wenn ich mal längere Scripts baue.




    Donnerstag, 15. Januar 2015 08:58
  • Alle deine Schlussfolgerungen sind richtig, bis auf die letzte.

    Stell dir vor du machst ein Foto von einem Apfel. Jest hast du das For von dem Apfel in der hand. kannst du den Apfel essen?

    Genau so ist es wenn man eine Befehlszeile in einen Text verpackt oder umwandelt.
    In diesem Fall muss man PowerShell explizit sagen sagen das der Text als einen Befehl enthält.

    Die macht man mit dem & Zeichen oder mit dem Cmdlet Invoke-Expression.

    So würde es gehen ist aber Unsinn, da man den Scriptblock direkt in die Geschweiftenklammern {} schreiben:

    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"
    $AddFeatures = "Add-WindowsFeature -ConfigurationFilePath $ConfigFile"
    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures) & $AddFeatures } -ArgumentList $AddFeatures -Credential ad\Hanspaul

    Oder so:

    $ConfigFile = "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml"
    $AddFeatures = "Add-WindowsFeature -ConfigurationFilePath $ConfigFile"
    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures) Invoke-Expression -Command $AddFeatures } -ArgumentList $AddFeatures -Credential ad\Hanspaul


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort markiert Enrico Stephan Donnerstag, 15. Januar 2015 11:34
    • Tag als Antwort aufgehoben Enrico Stephan Donnerstag, 15. Januar 2015 11:39
    Donnerstag, 15. Januar 2015 11:17
  • Ich verstehe das die Variablen erstmal auf den Host rüber wandern müssen. Danke für die Hilfe.

    Die von dir genannten Beispiele werfen aber Fehlermeldungen.

    Da du da schreibst "So würde es gehen ist aber Unsinn, da man den Scriptblock direkt in die Geschweiftenklammern {} schreiben:"  bin ich mir nicht ganz sicher ob das nur theoretische Beispiele sind. ;)

    PS C:\Users\Enrico.Stephan> Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures) & $AddFeatures } -ArgumentList $AddFeatures -Credential ad\Hanspaul
    The module 'Add-WindowsFeature -ConfigurationFilePath ' could not be loaded. For more information, run 'Import-Module Add-WindowsFeature -ConfigurationFilePath '.
        + CategoryInfo          : ObjectNotFound: (Add-WindowsFeat..._V_Standard.xml:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CouldNotAutoLoadModule
        + PSComputerName        : Hyper-V-08
     
    The module 'Add-WindowsFeature -ConfigurationFilePath ' could not be loaded. For more information, run 'Import-Module Add-WindowsFeature -ConfigurationFilePath '.
        + CategoryInfo          : ObjectNotFound: (Add-WindowsFeat..._V_Standard.xml:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CouldNotAutoLoadModule
        + PSComputerName        : Hyper-V-09
     
    The module 'Add-WindowsFeature -ConfigurationFilePath ' could not be loaded. For more information, run 'Import-Module Add-WindowsFeature -ConfigurationFilePath '.
        + CategoryInfo          : ObjectNotFound: (Add-WindowsFeat..._V_Standard.xml:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CouldNotAutoLoadModule
        + PSComputerName        : Hyper-V-10
     
    
    PS C:\Users\Enrico.Stephan> Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { param($AddFeatures) Invoke-Expression -Command $AddFeatures } -ArgumentList $AddFeatures -Credential ad\Hanspaul
    A positional parameter cannot be found that accepts argument 'Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml'.
        + CategoryInfo          : InvalidArgument: (:) [Install-WindowsFeature], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.Windows.ServerManager.Commands.AddWindowsFeatureCommand
        + PSComputerName        : Hyper-V-09
     
    A positional parameter cannot be found that accepts argument 'Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml'.
        + CategoryInfo          : InvalidArgument: (:) [Install-WindowsFeature], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.Windows.ServerManager.Commands.AddWindowsFeatureCommand
        + PSComputerName        : Hyper-V-10
     
    A positional parameter cannot be found that accepts argument 'Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml'.
        + CategoryInfo          : InvalidArgument: (:) [Install-WindowsFeature], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.Windows.ServerManager.Commands.AddWindowsFeatureCommand
        + PSComputerName        : Hyper-V-08

    Also schlussendlich zusammenfassend:

    Mensch würde also schlicht

    Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { Install-WindowsFeature -ConfigurationFilePath "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml" } -Credential ad\Hanspaul

    schreiben weil die anderen "Umwege" ähnlich lang und kompliziert sind aber grundsätzlich möglich. Richtig verstanden?

    Ich habe noch eine Abwandlung drin die funktioniert.
    Da mir -Credential ad\HansPaul zu aufwendig war immer neu einzugeben und ich gestern $cred = Get-Credential "gelernt" habe, sieht das jetzt insgesamt so aus:

    $cred = Get-Credential
    PS C:\Users\Enrico.Stephan> Invoke-Command -ComputerName Hyper-V-08, Hyper-V-09, Hyper-V-10 -ScriptBlock { Install-WindowsFeature -ConfigurationFilePath "\\fs-01\Admin Folder\Deployment\Hyper-V-Hosts\Failover_Hyper_V_Standard.xml" } -ArgumentList $cred
    
    Success Restart Needed Exit Code      Feature Result                                PSComputerName                                                                                                    
    ------- -------------- ---------      --------------                                --------------                                                                                                    
    True    No             NoChangeNeeded {}                                            Hyper-V-10                                                                                                        
    True    No             NoChangeNeeded {}                                            Hyper-V-08                                                                                                        
    False   Maybe          Failed         {}                                            Hyper-V-09                                                                                                        
    A prerequisite check for the Hyper-V feature failed.
    1. Hyper-V cannot be installed: A hypervisor is already running.
        + CategoryInfo          : InvalidOperation: (Hyper-V:ServerComponentBuilder) [Install-WindowsFeature], Exception
        + FullyQualifiedErrorId : Alteration_PrerequisiteCheck_Failed,Microsoft.Windows.ServerManager.Commands.AddWindowsFeatureCommand
        + PSComputerName        : Hyper-V-09

    Donnerstag, 15. Januar 2015 11:54