等待进程结束

时间:2013-11-19 17:02:39

标签: powershell powershell-v4.0

我有一个powershell脚本,它会自动打印Foxit文件夹中的所有.pdf文件。我已经等到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.

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

我想我明白了。如果我用Invoke-WmiMethod启动它,我可以获取进程ID并等待它,然后让它超时。

$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

这似乎非常有效。

答案 1 :(得分: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

答案 2 :(得分:0)

我遇到了同样的问题,发现了一个稍微simpler solution,它也捕获了子进程的输出。 -PassThru参数是关键,因为它为cmdlet启动的每个进程返回一个进程对象。

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

答案 3 :(得分:0)

我更喜欢这种样式,以更好地控制在外部进程运行时执行的操作:

$waitTime = 60
$dism = Start-Process "$env:windir\system32\dism.exe" -ArgumentList "/Online /Cleanup-Image /ScanHealth" -PassThru -WindowStyle Hidden
while (!$dism.HasExited -or $waitTime -gt 0) {sleep -Seconds 1; $waitTime--}
"done."

通过检查HasExited属性,我可以继续执行我的代码以及其他并行任务。