2012-04-10 5 views
6

Ich ziehe meine Haare hier raus, weil ich einfach nicht scheinen kann, dass dies funktioniert, und ich kann nicht herausfinden, wie man dieses Thema googelt. Ich verwende Powershell 2.0. Hier ist mein Skript:Powershell Invoke-Command wird keine Variable für -ComputerName-Parameter aufnehmen?

$computer_names = "server1,server2" 
Write-Output "Invoke-Command -ComputerName $computer_names -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
}" 
Invoke-Command -ComputerName $computer_names -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
} 

Der letzte Befehl gibt den Fehler:

Invoke-Command : One or more computer names is not valid. If you are trying to 
pass a Uri, use the -ConnectionUri parameter or pass Uri objects instead of 
strings. 

Aber wenn ich den Ausgang des Write-Output-Befehl an die Shell und führen Sie das Kopieren, es funktioniert gut. Wie kann ich die String-Variable in etwas umwandeln, das Invoke-Command akzeptiert? Danke im Voraus!

Antwort

5

Sie haben Ihr Array falsch deklariert. Setzen Sie ein Komma zwischen Streichern und Pipe an for-each wie:

$computer_names = "server1", "server2"; 

$computer_names | %{ 
    Write-Output "Invoke-Command -ComputerName $_ -ScriptBlock { 

    ...snip 
+0

Das ist es, danke! Ich habe nicht gedacht, dass ich einfach nur ein Für-jedes laufen sollte. Das ist eine Abkürzung, die ich nicht gesehen habe. Aber ich vermied es, ein Array zu deklarieren, weil ich nicht dachte, dass Invoke-Command -ComputerName einen braucht - stattdessen braucht es eine Liste von Computernamen, die durch ein Komma, keine Leerzeichen getrennt sind. Liege ich falsch? – erictheavg

+0

Reagieren auf mich selbst: Es sieht so aus. Ich lese gerade die Hilfe zu diesem Befehl und es sagt, es erwartet eine Zeichenfolge []. Ich ging allein von den Beispielen und machte eine schlechte Annahme. – erictheavg

0

haben Sie versucht:

$computer_names = "server1" , "server2" 

foreach ($computer in $computer_names) 
{ 
Write-Output "Invoke-Command -ComputerName $computer -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
}" 
Invoke-Command -ComputerName $computer -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
} 
} 
6

Jamey und user983965 korrekt sind, dass Ihre Erklärung falsch ist. Allerdings ist foreach hier nicht zwingend erforderlich. Wenn Sie nur Ihre Array-Deklaration wie dieses Problem zu beheben, wird es funktionieren:

$computer_names = "server1","server2" 
Invoke-Command -ComputerName $computer_names -ScriptBlock { 
    Get-WmiObject -Class Win32_LogicalDisk | 
    sort deviceid | 
    Format-Table -AutoSize deviceid, freespace 
} 
+0

Eine weitere Möglichkeit, das Array auf diese Weise zu füllen, wenn Sie bereits eine Variable namens '$ computers' mit Computerobjekten befüllt haben (z. B. mit 'get-adcomputer' ist' $ computer_names = $ computers.name'). –

0

Wenn Sie eine array von Computern aus Active Directory auch wenn es darum geht - wie folgt aus:

$computers = Get-ADComputer -filter {whatever} 

Stellen Sie sicher, die Sie auswählen erinnern/die Ergebnisse ... wie folgt erweitern:

$Computers= Get-ADComputer -filter * | Select-Object -ExpandProperty Name 

Then ...

Invoke-Command -ComputerName $Computers -ScriptBlock {Do Stuff} 
Verwandte Themen