在 Powershell 中的一组计算机上运行 Invoke-Command

在 Powershell 中的一组计算机上运行 Invoke-Command

我想获取Test-Path另一个查询返回的计算机列表的结果(或最终能够运行任何命令),但我得到的返回信息是错误的

这是我的代码

$AD_list = (Get-ADComputer -Filter *).Name
$py_path = "C:\Python39"
Invoke-Command -ArgumentList ($AD_list) -ScriptBlock {
  foreach ($machine in $AD_list) {
    Test-Path $py_path
  } 
} 

尝试过将其$AD_list作为$args[0]位置参数传递或声明,param([System.Collections.ArrayList]$AD_list)但没有成功

我感谢任何线索或反馈。

答案1

Invoke-Command 本身已经接受主机数组:

$hosts = ("hostA", "hostB", "hostC")

$results = Invoke-Command $hosts {Test-Path $using:py_path}

请注意,您需要$using:X从脚本块内部引用“外部”变量。

整个脚本块已在每台机器上运行,因此如果foreach需要,则需要将其定位外部脚本块的外部,而不是内部。例如:

foreach ($host in $hosts) { icm $host {Test-Path...} }

类似地,这里也可以使用%或:ForEach-Object

$hosts | % { icm $_ {Test-Path...} }

答案2

我最终在 foreach 中使用了 Invoke-Command,它对我有用

$AD_list = (Get-ADComputer -Filter *).Name

foreach ($machine in $AD_list) {

$result = Invoke-Command -ComputerName $machine -ScriptBlock { 

Test-Path "C:\Python39" -ErrorAction SilentlyContinue

}

Write-Host "Results for $machine"

Write-Host $result

} 

相关内容