我正在尝试在 48 台计算机的列表上执行一个 cmd 文件。我不想按顺序执行并等待完成,因为每个 cmd 大约需要 10 分钟才能完成。WinRM 不是一个选项。WMI 也不是。PSExec是一个选项....但我似乎无法让它在 Start-Job 中工作。
我正在做类似的事情:
$sb = {
param
(
$computer = "serverw01",
$userid = "domain2\serviceid",
$password = 'servicepw',
$command = "cd /d d:\ && updateAll.cmd"
)
d:\eps\pstools\PsExec.exe -u $userid -p $password "\\$($computer)" cmd /c $command
}
foreach ($computer in Get-Content "D:\Data\serverlist.txt") {
Start-Job $sb -ArgumentList $computer
}
这创造了一堆工作......但永远不会完成,如果我在其中任何一个上接受工作,我就会回来
PS> get-job | receive-job -Keep
+ CategoryInfo : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
如果我运行如下函数,它执行得很好:
& $sb -computer "serverw01"
启动脚本在 Server 2008r2 机器上的 Powershell v2.0 中运行我在使用域管理员用户 ID 登录时在 domain2 的机器上尝试过它(结果相同)。