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