语法-明智地,你的方法应该工作,但不,由于不幸的错误,仍然存在于 PowerShell 7.2 中 - 请参阅 GitHub issue #5576。
-
虽然将一个数组参数传递给Start-Process的-ArgumentList参数确实会导致数组元素作为单个参数传递(这通常是外部CLI 需要多个文件参数),在构建最终用于调用的命令行时,不应用元素周围的必要双引号在幕后。
-
此外,为了稳健性,您应该使用存储在$selected_items 中的对象的.FullName 属性,以确保通过完整路径,因为 -在 Windows PowerShell 中,根据情况 - Get-ChildItem 的输出对象可能仅字符串化为文件 name - 请参阅 this answer。
解决方法:将单个参数传递给-ArgumentList,您可以在其中编码所有传递参数,使用嵌入式双引号。
Start-Process `
-FilePath "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" `
-ArgumentList ($selected_items.ForEach({ '"{0}"' -f $_.FullName }) -join ' ')
退后一步:
如果PotPlayerMini64.exe 是Windows GUI(-子系统)应用程序,则根本不需要Start-Process,因为即使直接调用也会起作用异步(即,程序将启动,控制权将立即返回 PowerShell;相反,如果您想等待程序退出,请使用Start-Process -Wait)。
& "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" $selected_Items.FullName
请注意,在这样的直接调用中,PowerShell确实根据需要在幕后执行必要的双引号。
注意:我不清楚将多个文件路径传递给PotPlayerMini64.exe单独是否也开始播放 - 下一节中的替代解决方案可以确保这一点。
基于剪贴板的替代解决方案:
根据PotPlayerMini64.exe 的available command-line options[1]判断,以下可能有效(我无法亲自验证):
/clipboard :将剪贴板中的内容附加到播放列表中并立即开始播放。
# Copy the full names of the files of interest to the clipboard.
Set-Clipboard -Value $selected_items.FullName
# Launch the player and tell it to start playback of the files on the clipboard.
# Parameters -FilePath and -ArgumentList are positionally implied.
Start-Process 'C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe' /clipboard
有一些与文件参数相关的选项,例如 /new、/insert 和 /add,但我不清楚它们是否 - 或者完全省略它们,就像你的尝试一样 - 自动 开始播放(可能取决于应用程序的持久配置)。
[1] 注意这不是官方文档;我找不到后者。