2010-10-22 2 views
1

Мне нужно выполнить ряд задач на нескольких серверах Windows 2008, требующих повышенных разрешений, и поэтому мне пришлось создать серию запланированных задач, которые Я бегу через psexec. Поскольку они должны выполняться последовательно, я обнаружил и модифицировал сценарий powershell, который «останавливается» до тех пор, пока запланированные задачи не будут завершены на удаленных машинах. Проблема заключается в том, что когда я запускаю скрипт с psexec на удаленной машине, как только он завершает работу (указывается сообщением на выходе консоли), PowerShell.exe не выходит из строя, а скорее зависает и удерживает все обработать. Мне нужно, чтобы powershell завершил работу после выхода сценария задержки, но даже с ключевым словом exit в конце он остается в памяти и не позволяет процессу завершить работу. Я не очень опытный с PowerShell, так что я приложу мой сценарий в случае, если я делаю что-то глупое в нем:Скрипт Windows PowerShell, инициированный PSExec, не убивает процесс 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

Хотя это не исправить мой конкретный вопрос, это гораздо более элегантное решение, и я реализовал его на месте мой. –

+0

У меня возникли проблемы с запуском некоторых скриптов PowerShell поверх SSH, где PowerShell зависает после завершения последней команды (но только с некоторыми скриптами). Я работал над проблемой, подключив stdin powershell.exe к nul. Так что что-то ждало на stdin, но я не знаю, что. – JasonMArcher

+0

Поскольку удаленное выполнение powershell было полностью в контексте нашей сети, и я мог удаленно запрашивать статус запланированной задачи, я обнаружил, что запуск скрипта локально, а не через psexec, привел к гораздо более последовательной и надежной работе. Это работало лучше, поэтому я думаю, что psexec ожидал чего-то. –

Смежные вопросы