PowerShell foreach循环调用ocrmypdf.exe变量传参问题求解
核心错误说明
原有脚本运行失败的问题点:
- PowerShell中单引号包裹的内容不会做变量解析,
'$source'、'$destfiles'会被识别为固定文本字符串,不会读取变量存储的文件路径数据 - 提前批量生成全量目标路径列表后,循环过程没有做索引对应,很容易出现源文件和目标路径匹配错位
- 执行参数定义在循环外,直接把整个文件数组作为单次调用的参数传入,不符合ocrmypdf单文件处理的调用规则
- 没有提前校验目标输出文件夹是否存在,首次运行时会因为路径不存在触发报错
可直接运行的完整脚本
# 基础路径配置 $sourcePath = 'X:\OCR' $destPath = 'X:\ocr\done' $exePath = 'ocrmypdf.exe' # 自动创建目标文件夹(不存在时才创建) if (-not (Test-Path $destPath -PathType Container)) { New-Item $destPath -ItemType Directory -Force | Out-Null } # 获取目录下所有PDF文件 $pdfList = Get-ChildItem -Path $sourcePath -Filter '*.pdf' -File # 遍历逐个处理PDF foreach ($pdf in $pdfList) { # 拼接当前文件对应的输出路径,避免手动拼接斜杠出错 $currentOutput = Join-Path $destPath $pdf.Name # 调用ocrmypdf执行识别 & $exePath $pdf.FullName $currentOutput }
常用扩展配置
- 需要添加ocrmypdf运行参数时,直接在调用行追加即可,比如启用中英文混合识别、跳过已有文本的PDF,可将调用行修改为:
& $exePath -l chi_sim+eng --skip-text $pdf.FullName $currentOutput - 需要递归处理源目录下所有子文件夹的PDF时,给
Get-ChildItem添加-Recurse参数即可,注意同步调整输出路径生成逻辑保留原有目录结构,避免文件重名覆盖 - 调试阶段可在调用前加一行打印路径,校验源和目标路径是否符合预期:
Write-Host "处理中: $($pdf.FullName) -> $currentOutput"
内容的提问来源于stack exchange,提问作者Geh Kah
相关产品推荐
相关产品推荐

