我正在尝试在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的一个盒子上尝试了它。

最佳答案

尝试对psexec命令执行此操作,确保您包含“-d”以不等待响应,并将计算机变量放在psexec之后:

d:\eps\pstools\psexec "\\$($computer)" /accepteula -u $userid -p $password -d cmd /c $command

关于powershell - 在开始作业中运行时PSExec永远不会完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3154449/

10-11 17:07