在start-job中运行时,PSExec永远不会完成

时间:2010-07-01 00:51:17

标签: powershell psexec start-job

我正在尝试在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中的一个盒子上尝试过它(相同的结果)。

4 个答案:

答案 0 :(得分:4)

尝试使用psexec命令,确保包含“-d”以不等待响应,并将计算机变量放在psexec之后:

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

答案 1 :(得分:2)

这个悬而未决的问题出现在Win2003和Win2008服务器上。

大多数人通过回声和管道等解决方法解决了这个问题,以便PowerShell从STDIN获得一些输入。

但是在powershell中存在一个解决方案。只需使用-inputformat none选项启动powershell:

powershell -inputformat none -command ...

答案 2 :(得分:0)

请尝试-accepteula参数到psexec 像

d:\eps\pstools\PsExec.exe -accepteula -u $userid  -p $password

from

答案 3 :(得分:0)

$computerList = Get-Content "D:\Data\serverlist.txt"      
$sb = 
{ 
    param($name)
        }
            $computer = $name
            $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 $computerLinst) {
    Start-Job $sb -ArgumentList $computer
}