PowerShell需求:检测C:\pdf中PDF存在后执行逻辑,否则每15秒重试
我来帮你修复这个问题——原脚本的核心问题是没有先确认并锁定要处理的PDF文件列表,导致在检测到文件后、实际打印前,如果文件被意外删除,就会触发错误。下面是改进后的脚本,完全解决了这个问题,同时让流程更健壮:
改进后的PowerShell脚本
$fileDirectory = "C:\pdf" $checkInterval = 15 # 检测间隔(秒) do { # 第一步:获取目录中所有PDF文件,先缓存到变量里,避免后续文件变动影响处理流程 $pdfFiles = Get-ChildItem -Path $fileDirectory -Filter "*.pdf" -File # 只有当存在PDF文件时,才执行打印、清理等后续操作 if ($pdfFiles.Count -gt 0) { Write-Host "检测到$($pdfFiles.Count)个PDF文件,开始处理..." # 遍历所有缓存的PDF文件并提交打印任务 foreach ($file in $pdfFiles) { try { # 启动打印,隐藏窗口并捕获进程对象 $printProcess = Start-Process -FilePath $file.FullName -Verb Print -WindowStyle Minimized -PassThru -ErrorAction Stop Write-Host "已提交打印任务:$($file.Name)" } catch { Write-Warning "打印文件$($file.Name)失败:$_" } } # 等待打印任务提交完成(可根据你的打印机速度调整等待时间) Start-Sleep -Seconds 2 # 优雅关闭Acrobat Reader进程(优先正常关闭,失败则强制终止) Get-Process -Name AcroRd32 -ErrorAction SilentlyContinue | ForEach-Object { if ($_.CloseMainWindow()) { Write-Host "已正常关闭Acrobat Reader进程:$($_.Id)" } else { $_.Kill() Write-Host "强制终止无响应的Acrobat Reader进程:$($_.Id)" } } Start-Sleep -Seconds 1 # 仅删除目录中的PDF文件,避免误删其他类型文件 try { Remove-Item -Path "$fileDirectory\*.pdf" -Force -ErrorAction Stop Write-Host "已清理所有PDF文件" } catch { Write-Warning "清理PDF文件失败:$_" } } else { Write-Host "未检测到PDF文件,$checkInterval秒后重新检测..." } # 等待下一次检测周期 Start-Sleep -Seconds $checkInterval } while ($true)
关键改进点说明
- 先缓存文件列表:把要处理的PDF文件先存到
$pdfFiles变量中,确保后续操作的是检测到的那批文件,彻底避免“检测到存在但处理时文件已被删除”的问题 - 精准过滤目标文件:用
-Filter "*.pdf"和-File参数,只处理PDF格式的文件,排除文件夹和其他类型文件的干扰 - 添加错误处理机制:通过
try/catch和-ErrorAction参数,捕获打印、删除过程中的异常,避免脚本直接崩溃 - 优化进程关闭逻辑:先尝试正常关闭Acrobat Reader,无法关闭时再强制终止,减少系统资源占用
- 明确的流程分支:只有当确实存在PDF文件时才执行后续操作,否则直接进入等待,避免无效的遍历和清理动作
原脚本的问题分析
原脚本没有先确认文件存在就直接执行遍历,而且在遍历后立刻执行删除操作(虽然在打印之后),如果在遍历文件到启动打印的间隙中文件被删除,就会导致打印失败。改进后的脚本通过先缓存文件列表,从根源上解决了这个时序问题。
内容的提问来源于stack exchange,提问作者Gwill Zx Spectrum
相关产品推荐
相关产品推荐

