2013-11-19 5 views
0

У меня есть сценарий powershell, который автоматически распечатает все .pdf-файлы в папке с Foxit. У меня он установлен, чтобы ждать, пока Foxit не выйдет, пока сценарий не продолжится. Время от времени сценарий приостанавливается и ждет, даже если Foxit уже вышел. Есть ли способ сделать это тайм-аут через определенное количество времени?Ждать завершения процесса

Вот код, у меня есть:

Start-Process $foxit -ArgumentList $argument -Wait 
Move-Item $filePath $printed[$location] 
Add-Content "$printLogDir\$logFileName" $logEntry 

Я попытался рекомендации here и они не похоже на работу. Например, если я:

$proc = Start-Process $foxit -ArgumentList $argument 
$proc.WaitForExit() 
Move-Item $filePath $printed[$location] 
Add-Content "$printLogDir\$logFileName" $logEntry 

я получаю:

You cannot call a method on a null-valued expression. 

Любая помощь будет принята с благодарностью.

ответ

1

Я думаю, что я понял это. Если я начну с Invoke-WmiMethod, я могу получить идентификатор процесса и дождаться его, а затем попросить его тайм-аут.

$proc = Invoke-WmiMethod -Class win32_process -Name create -ArgumentList "$foxit $argument" 
Wait-Process -Id $proc.ProcessId -Timeout 120 
Move-Item $filePath $printed[$location] 
Add-Content "$printLogDir\$logFileName" $logEntry 

Это, кажется, работает довольно последовательно.

0

Один из способов реализации тайм-аут, чтобы использовать фоновое задание:

$Job = start-job -ScriptBlock { write-output 'start';Start-Sleep -Seconds 15 } 

$timeout = New-TimeSpan -Seconds 10 
$timer = [diagnostics.stopwatch]::StartNew() 

    While ($timer.Elapsed -le $timeout) 
    { 
    if ($Job.State -eq 'Completed') 
    { 
     Receive-Job $Job 
     Remove-Job $Job 
     Return 
    } 
    Start-Sleep -Seconds 1 
    } 
     write-warning 'Job timed out. Stopping job' 
     Stop-Job $Job 
     Receive-Job $Job 
     Remove-Job $Job 
+0

Использование работы backgroud не работало для меня. Я не совсем уверен, почему, но я думаю, что это связано с переменными, которые не переходят к заданию. –

0

Я столкнулся с этой проблемой и нашел немного simpler solution, который также отображает выходные данные дочернего процесса. Аргумент -PassThru является ключевым, поскольку он возвращает объект процесса для каждого процесса, который запускает командлет.

$proc = Start-Process $foxit -ArgumentList $argument -PassThru 
Wait-Process -Id $proc.Id -Timeout 120 
Move-Item $filePath $printed[$location] 
Add-Content "$printLogDir\$logFileName" $logEntry 

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

  • Нет связанных вопросов^_^