我有一个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.
非常感谢任何帮助。
答案 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属性,我可以继续执行我的代码以及其他并行任务。