Команда Invoke-Command Powershell не будет принимать переменную для параметра-ComputerName?

я вытаскиваю свои волосы здесь, потому что я просто не могу заставить это работать, и я не могу понять, как google эту проблему. Я запускаю Powershell 2.0. Вот мой скрипт:

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

последняя команда выдает ошибку:

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.

но когда я копирую вывод команды Write-Output в оболочку и запускаю ее, она работает просто отлично. Как я могу привести строковую переменную к тому, что Invoke-Command примет? Заранее спасибо!

4 ответов


вы неправильно объявили свой массив. Поставьте запятую между строками и передайте ее для-каждой, как:

$computer_names = "server1", "server2";

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

    ...snip

Джейми и user983965 правы, в том, что ваше заявление неверно. Однако foreach здесь не обязательно. Если вы просто исправить объявление массива, как это, он будет работать:

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

вы пробовали:

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

если вы получаете array компьютеры Active Directory тоже - такой:

$computers = Get-ADComputer -filter {whatever} 

убедитесь, что вы не забыли выбрать / развернуть результаты... вот так:

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

затем...

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