2010-07-01 78 views
6

我想在48台计算机的列表上执行一个cmd文件。我不想执行并等待顺序完成,因为每个cmd需要大约10分钟才能完成。 WinRM不是一种选择。 WMI也不是。 PSExec 一个选项....但我似乎无法使其在开始工作内工作。PSExec永远不会完成,当开始工作内运行

我做这样的事情:

$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" 

启动脚本使用PowerShell 2.0版在Ser运行:

如果我运行的功能等它执行就好了ver 2008r2 box 我用域管理员用户标识(同样的结果)登录时在域2中的一个盒子上试过它。

回答

4

试试这个为PSEXEC命令,以确保您有“-d”不等待响应,并把计算机PSEXEC后可变权:

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

谢谢你Lizz。答案似乎是计算机价值的位置。我尝试了使用和不使用-d和/ acceptedteula(我早已接受eula :)),并且启用因素是确保计算机名值是PSEXEC之后的第一个值。 – 2012-08-27 23:09:15

0

请尝试-accepteula参数PSEXEC 像

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

from

+0

感谢您的回应。添加-accepteula产生相同的响应 + CategoryInfo:NotSpecified:(:字符串)[],的RemoteException + FullyQualifiedErrorId:NativeCommandError PSEXEC v1.98 - 执行过程远程 版权(C)2001-2010标记Russinovich 的Sysinternals - www.sysinternals.com – 2010-07-01 16:08:47

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 
} 
2

Win2003和Win2008服务器上出现此悬挂问题。

大多数人都用类似回声和管道的解决方法来解决此问题,以便PowerShell从STDIN获取一些输入。

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

powershell -inputformat none -command ...