我正在编写一个脚本来在播放器中播放某些文件。我使用 Get-ChildItem 来获取文件名数组。然后我想使用 Start-Process 来播放这些文件。但是,如何将这些文件名添加到播放器程序的参数中?
我用过Start-Process -FilePath "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" -ArgumentList $selected_items,但似乎不起作用,文件也无法播放。
请注意,文件名中有空格。
就语法而言,您的方法应该有效,但由于不幸的错误而无效,该错误仍然存在于 PowerShell 7.2 中- 请参阅GitHub 问题 #5576。
虽然将参数数组传递给' Start-Processs参数确实会导致数组元素作为单独的参数-ArgumentList传递(这通常是外部 CLI 期望多个文件参数的方式),但当命令行时,不会应用带有空格的元素周围必要的双引号最终用于调用的是在幕后构造的。
另外,为了稳健性,您应该使用.FullName存储在中的对象的属性$selected_items,以确保传递完整路径,因为 - 在Windows PowerShell中,在某些情况下 -Get-ChildItem的输出对象可能仅字符串化为文件名- 请参阅此答案。
解决方法:将单个参数传递给-ArgumentList,在其中使用嵌入式双引号对所有传递参数进行编码。
Start-Process `
-FilePath "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" `
-ArgumentList ($selected_items.ForEach({ '"{0}"' -f $_.FullName }) -join ' ')
Run Code Online (Sandbox Code Playgroud)
退一步说:
如果PotPlayerMini64.exe是 Windows GUIStart-Process (子系统)应用程序,则根本不需要,因为即使是直接调用也会异步执行(即,程序将启动,并且控制权将立即返回到 PowerShell;相反,如果您想等待程序退出,使用Start-Process -Wait)。
& "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" $selected_Items.FullName
Run Code Online (Sandbox Code Playgroud)
请注意,在此类直接调用中,PowerShell确实根据需要在幕后执行必要的双引号。
注意:我不清楚PotPlayerMini64.exe 单独传递多个文件路径是否也会开始播放- 下一节中的替代解决方案可能会确保这一点。
基于剪贴板的替代解决方案:
根据可用PotPlayerMini64.exe的命令行选项[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
Run Code Online (Sandbox Code Playgroud)
有与文件参数相关的选项,例如/new、/insert和/add,但我不清楚它们是否(或者像您的尝试一样完全省略它们)是否自动开始播放(可能取决于应用程序的持久配置)。
[1] 请注意,这不是官方文档;我找不到后者。
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |