6

我正在尝试在 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

4 回答 4

4

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

d:\eps\pstools\psexec "\\$($computer)" /accepteula -u $userid -p $password -d cmd /c $command
于 2012-08-27T22:22:37.957 回答
2

此挂起问题发生在 Win2003 和 Win2008 服务器上。

大多数人通过回显和管道等解决方法解决此问题,以便 powershell 从 STDIN 获取一些输入。

但是powershell中有一个解决方案。只需使用选项 -inputformat none 启动 powershell,例如:

powershell -inputformat none -command ...
于 2014-12-12T20:49:24.960 回答
0

请尝试 psexec 的 -accepteula 参数,例如

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

于 2010-07-01T13:49:29.713 回答
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
}
于 2013-12-18T05:24:45.410 回答