如何用PowerShell创建可跳转到指定页码的PDF快捷方式
用户需要创建PDF文档的快捷方式,双击时能直接在PDF阅读器中打开到指定页码。手动操作可实现:右键PDF文件→点击「创建快捷方式」→打开快捷方式属性对话框→将目标字段替换为PDFXEdit /a page=87 "C:\temp\sample.pdf"。
但使用自定义PowerShell函数Set-Shortcut执行命令后,生成的快捷方式目标字段为"C:\temp\sample.pdf" PDFXEdit /a page=87,双击仅能打开PDF却无法跳转到指定页码。用户需解决两个问题:
- 如何通过PowerShell创建正确的跳转快捷方式
- 能否让
.lnk文件向默认PDF程序传递文件路径和任意参数
附用户使用的Set-Shortcut函数代码:
function Set-Shortcut{ param( [Parameter(ValueFromPipelineByPropertyName)] [String]$Path = $pwd, [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline)] [String] $Target, [Parameter(ValueFromPipelineByPropertyName)] [String] $Arguments, [Parameter(ValueFromPipelineByPropertyName)] [String] $IconPath ) process{ if (-not(get-item -path $path).PSIsContainer){Write-Error 'Only directories allowed as destination Path' -ErrorAction Stop} $path = join-path -path $path -ChildPath ((get-item -path $target).BaseName + '.lnk') $WshShell = New-Object -ComObject WScript.Shell $Shortcut = $WshShell.CreateShortcut($Path) $Shortcut.TargetPath = $Target Switch ($PSBoundParameters.keys){ 'Arguments' {$Shortcut.Arguments = $Arguments} 'IconPath' {$Shortcut.IconLocation = $IconPath} } $Shortcut.Save() return (Get-Item $Path) } }
一、创建正确的PDF跳转快捷方式
问题核心是快捷方式的目标与参数完全颠倒:手动操作时,目标是PDF阅读器程序(如PDFXEdit.exe),参数是带页码参数的PDF路径;而你调用Set-Shortcut时,把PDF文件设为了目标,阅读器和页码参数当成了Arguments,导致逻辑错误。
修正步骤
- 确认PDF阅读器的完整路径,比如
PDFXEdit.exe的默认路径为C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe - 调用
Set-Shortcut时,将阅读器路径设为Target,页码参数+PDF路径设为Arguments,同时指定快捷方式的保存目录。
示例命令:
Set-Shortcut -Target "C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" -Arguments "/a page=87 `"C:\temp\sample.pdf`"" -Path "C:\temp"
注意:Arguments中的PDF路径需要转义双引号,用
`"包裹,或用单引号包裹整个参数串。
验证效果
生成的快捷方式目标字段会变为:"C:\Program Files\Tracker Software\PDF Editor\PDFXEdit.exe" /a page=87 "C:\temp\sample.pdf"
双击即可直接打开PDF到指定页码。
二、向默认PDF程序传递参数的可行性
直接通过.lnk文件向默认PDF程序传递参数不可行,原因如下:
- 默认PDF程序是通过系统扩展名关联(
.pdf关联到对应阅读器)启动的,当双击PDF文件或用快捷方式指向PDF时,系统只会调用默认阅读器并传入PDF路径,不会传递额外参数。 - 要传递参数,必须明确指定阅读器程序作为快捷方式的目标,再将参数(含PDF路径)传入,如上述修正方案。
若想动态使用默认阅读器,可先获取其路径再构建快捷方式:
# 获取默认PDF程序的路径 $defaultPdfReader = (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice").ProgId $readerPath = (Get-ItemProperty -Path "HKCR:\$defaultPdfReader\shell\open\command")."(Default)" -replace '"(.*)".*', '$1' # 创建带页码参数的快捷方式 Set-Shortcut -Target $readerPath -Arguments "/a page=87 `"C:\temp\sample.pdf`"" -Path "C:\temp"
注意:不同阅读器的参数格式可能不同,比如Adobe Acrobat的参数格式为
/A "page=87" "C:\temp\sample.pdf",需对应调整Arguments内容。
三、优化Set-Shortcut函数(可选)
原函数可增加自定义快捷方式名称的参数,避免默认使用目标文件名:
function Set-Shortcut{ param( [Parameter(ValueFromPipelineByPropertyName)] [String]$Path = $pwd, [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline)] [String]$Target, [Parameter(ValueFromPipelineByPropertyName)] [String]$Arguments, [Parameter(ValueFromPipelineByPropertyName)] [String]$IconPath, [Parameter(ValueFromPipelineByPropertyName)] [String]$ShortcutName ) process{ if (-not(get-item -path $path).PSIsContainer){Write-Error 'Only directories allowed as destination Path' -ErrorAction Stop} # 自定义快捷方式名称,否则用目标文件的BaseName if (-not $ShortcutName) { $ShortcutName = (get-item -path $target).BaseName + '.lnk' } elseif (-not $ShortcutName.EndsWith('.lnk')) { $ShortcutName += '.lnk' } $path = join-path -path $path -ChildPath $ShortcutName $WshShell = New-Object -ComObject WScript.Shell $Shortcut = $WshShell.CreateShortcut($Path) $Shortcut.TargetPath = $Target if ($PSBoundParameters.ContainsKey('Arguments')) { $Shortcut.Arguments = $Arguments } if ($PSBoundParameters.ContainsKey('IconPath')) { $Shortcut.IconLocation = $IconPath } $Shortcut.Save() return (Get-Item $Path) } }
使用示例:
Set-Shortcut -Target $readerPath -Arguments "/a page=87 `"C:\temp\sample.pdf`"" -Path "C:\temp" -ShortcutName "SamplePDF_Page87.lnk"
内容的提问来源于stack exchange,提问作者Ralf_Reddings

