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

Jamey и user983965 верны, потому что ваше заявление неверно. тем не мение foreach здесь не обязательно. Если вы просто исправите объявление массива следующим образом, оно будет работать:

$computer_names = "server1","server2"
Invoke-Command -ComputerName $computer_names -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}

Ты пытался:

$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 
}
}
Другие вопросы по тегам