2010-10-22 88 views
1

我需要在需要提升权限的几台Windows 2008服务器上完成一系列任务,因此我必须创建一系列计划任务,我正在通过psexec运行。由于它们必须按顺序运行,因此我找到并修改了一个“停顿”的powershell脚本,直到在远程计算机上完成预定任务。我遇到的问题是,当我在远程机器上使用psexec启动脚本时,一旦它完成运行(由控制台输出中的消息指示),PowerShell.exe不会干净地退出,而是挂起并保持整个处理。在延迟脚本退出后,我需要powershell退出,但即使使用退出关键字,它仍会保留在内存中,并阻止该进程完成。我并不十分PowerShell的经历,所以我会附上我的脚本的情况下,我在做一些愚蠢的事情在里面:由PSExec触发的Windows powershell脚本在运行完成时不会终止Powershell进程

while($true) { 
$status = schtasks /query /tn "AutoDeploy"| select-string -patt "AutoDeploy" 
if($status.tostring().substring(64,7) -eq "Running") { "Waiting for task to complete..." } else { break } 
start-sleep -s 5 
} 
"Task complete." 
exit 

预先感谢任何见解。

回答

1

这对我的作品(使用不同的任务名称),不挂PSEXEC:

$taskName = "AutoDeploy" 
while (1) 
{ 
    $stat = schtasks /query /tn $taskName | 
       Select-String "$taskName.*?\s(\w+)\s*$" | 
       Foreach {$_.Matches[0].Groups[1].value} 
    if ($stat -ne 'Running') 
    { 
     "Task completed" 
     break 
    } 
    "Waiting for task to complete" 
    Start-Sleep 5 
} 
+0

虽然这并没有解决我的具体问题,这是一个更优雅的解决方案,我执行到位我的。 – 2010-10-25 19:29:47

+0

我在通过SSH运行一些PowerShell脚本时遇到了一些麻烦,PowerShell在完成最后一个命令(但仅限于某些脚本)后会挂起。我通过将powershell.exe的stdin挂到nul来解决这个问题。所以有些东西等着stdin,但我不知道是什么。 – JasonMArcher 2010-10-26 03:05:48

+0

由于远程执行powershell都在我们网络的上下文中,我可以远程查询计划任务的状态,所以我发现在本地运行脚本而不是通过psexec运行脚本会产生更加一致和可靠的输出。这效果更好,所以我猜psexec正在期待什么。 – 2010-10-26 13:12:55