2012-04-10 7 views
6

Wyciągam tu włosy, ponieważ po prostu nie mogę tego zmusić do pracy i nie mogę wymyślić, jak google to rozwiązać. Używam Powershell 2.0. Oto mój skrypt:Powershell's Invoke-Command nie przyjmie zmiennej dla parametru -ComputerName?

$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 
} 

Ostatnia komenda daje błąd:

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. 

Ale kiedy skopiować dane wyjściowe polecenia Write-Output do powłoki i uruchom, że to działa dobrze. Jak mogę rzucić zmienną łańcuchową na coś, co zaakceptuje Invoke-Command? Z góry dziękuję!

Odpowiedz

5

Użytkownik zadeklarował tablicę niepoprawnie. Postawić przecinek między strunami i rury go do for-each jak:

$computer_names = "server1", "server2"; 

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

    ...snip 
+0

To się udało, dzięki! Nie myślałem, że po prostu uruchomię na to wszystko. To skrót, którego nie widziałem. Ale unikałem deklarowania tablicy, ponieważ nie sądziłem, że Invoke-Command -KomputerName ją bierze - zamiast tego pobiera listę nazw komputerów oddzielonych przecinkami, bez spacji. Czy się mylę? – erictheavg

+0

Odpowiadając na siebie: tak to wygląda. Po prostu przeczytałem pomoc dotyczącą tego polecenia i stwierdziłem, że oczekuje ciągu znaków []. Wyszedłem z przykładów sam i zrobiłem złe założenie. – erictheavg

0

próbowałeś:

$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 i user983965 są poprawne, w deklaracji, że jest źle. Jednak tutaj nie jest obowiązkowe foreach. Jeśli po prostu naprawić deklarację tablicy tak, to będzie działać:

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

Innym sposobem na wypełnienie tablicy tak, aby działało w ten sposób, jeśli już zapełniono zmienną zwaną '$ computers' z obiektami komputerowymi (na przykład użycie' get-adcomputer' to '$ nazwa_komputera = $ komputery.nazwa'. –

0

jeśli jesteś coraz array komputerów z Active Directory też - jak to:

$computers = Get-ADComputer -filter {whatever} 

Upewnij się, że należy pamiętać, aby wybrać/rozszerzyć wyniki ... tak:

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

Potem ...

Invoke-Command -ComputerName $Computers -ScriptBlock {Do Stuff} 
Powiązane problemy