PowerShell中xpdf的pdftotext.exe能否接受变量作为路径参数?
解决PowerShell调用pdftotext时变量参数传递失败的问题
先看你遇到的错误输出:
.\pdftotext.exe : pdftotext version 4.00 At C:\Users\eakinsa\Desktop\Style Guide Report\styleGuideReport.ps1:62 char:88 + ... Style Guide Report\Includes\bin32\"; .\pdftotext.exe $selectedFile }) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (pdftotext version 4.00:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError
别担心,pdftotext完全支持PowerShell变量作为参数,你这个问题的核心是变量作用域的锅——$selectedFile在okButton的点击事件里根本没被正确读取到,相当于给pdftotext传了个空参数,所以它才输出了版本信息,被PowerShell误判成了错误。
为啥会这样?PowerShell事件脚本块的作用域坑
你看代码里,$selectedFile = $browse.FileName是写在BrowseButton.Add_Click()的脚本块里的,这个变量属于局部作用域,只能在那个点击事件的代码块内部用。当你点okButton的时候,它的脚本块找不到有效的$selectedFile,自然传不出正确的路径。
怎么解决?把变量放到脚本作用域
最简单的办法是把$selectedFile定义成脚本作用域的变量,这样所有事件脚本块都能访问到它:
具体修改步骤:
- 在脚本最开头先声明脚本作用域的变量:
$script:selectedFile = $null
- 修改BrowseButton的点击事件,把选中的路径赋值给这个脚本变量:
$BrowseButton.Add_Click({ $browse.ShowDialog() | Out-Null $script:selectedFile = $browse.FileName })
- 调整okButton的点击事件,用脚本变量,同时直接指定pdftotext的完整路径(比cd切换目录更靠谱,还能避免路径空格问题):
$okButton.Add_Click({ # 先判断有没有选文件 if ([string]::IsNullOrEmpty($script:selectedFile)) { [System.Windows.Forms.MessageBox]::Show("先选个PDF文件呀!", "提示", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Warning) return } $pdftotextPath = "C:\Users\eakinsa\Desktop\Style Guide Report\Includes\bin32\pdftotext.exe" # 给路径加引号,防止路径有空格时出错 & $pdftotextPath "$script:selectedFile" })
额外加个小优化
给文件选择框加个PDF过滤,避免用户选错文件:
$browse.Filter = "PDF文件 (*.pdf)|*.pdf|所有文件 (*.*)|*.*"
这样改完之后,变量就能正确传递给pdftotext,不会再弹出那个版本信息的错误啦。
内容的提问来源于stack exchange,提问作者A. Eakins
相关产品推荐
相关产品推荐

