Benutzer mit den meisten Antworten
Einsatz von Variablen - Anfängerfrage(n)

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.InvokeCommandCommandNun 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?
- Bearbeitet Enrico Stephan Dienstag, 13. Januar 2015 17:47
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
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
-
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
-
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
-
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.
- Bearbeitet Enrico Stephan Donnerstag, 15. Januar 2015 09:01
-
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
-
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