Команда 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}