我有一个运行ffmpeg的ps1脚本,我试图提示修剪开始时间,然后运行ffmpeg命令。我需要在powershell中使用或类似于%~
的东西。
到目前为止,我已经尝试在另一篇文章中建议的字符串中转义%
。即“%~”),但无济于事。以及谷歌省略了特殊字符从我的搜索查询,所以它没有给我带来很多信息,试图找到它的对应物在PS。
所以我的问题是,我可以在PS中使用什么来代替%~1
和%~dnp
?
验证码:
$start = Read-Host -prompt "trim start (ex. 00:00:00)"
Start-Process ffmpeg -ArgumentList "-i `"%~1`" -ss $start `"%~dnp`""
Read-Host -Prompt "Press Enter to exit"
2条答案
按热度按时间omqzjyyz1#
补充briantist's helpful answer:
tl;dr
Start-Process
启动 * 外部控制台应用程序 *,除非您明确希望它们在 * 单独的窗口 * 或 * 作为不同的用户 * 中运行-请参阅this answer了解背景信息,并参阅GitHub docs issue #6239了解何时使用Start-Process
以及何时不使用Start-Process
的指导。Start-Process
调用 synchronous,i.即,要等待它完成,请添加-Wait
交换机。Start-Process
是 * 不 * 需要的,请使用 * 直接调用 *,如下所示(如果可执行文件名或路径被引用或包含变量引用,请将调用操作符&
放在它前面)。%~1
和%~dpn1
(根据您的问题更正)只能在 * 批处理文件 * 中工作,而不能在PowerShell脚本中工作(有关详细信息,请参阅底部部分)。%1
(或%V
)占位符始终是从其调用菜单命令的文件系统项的完整路径。定义要放置在注册表中的命令行,如下所示:
Read-Host -Prompt "Press Enter to exit"
来防止窗口在完成后关闭的替代方案,您可以将-NoExit
放在-File
之前,这样可以保持会话活动,从而在传递给-File
的脚本文件退出后窗口打开。然后将PowerShell脚本重新定义为(
$args[0]
是cmd.exe
的%~1
的PowerShell等效物):参数传递和-expansion的背景知识:
%1
是调用快捷菜单的文件系统项 * 的 * 完整路径 * 的占位符***(其他形式是%L
和%V
,后者是唯一一种也适用于 * 背景 * 快捷菜单定义的形式,即%1
。即在文件资源管理器窗口的背景中单击时起作用的快捷菜单项,隐式地针对 * 目录 *)。"%1"
(或者,更普遍地,"%V"
),i。e.将占位符显式包含在"..."
中,作为存储在注册表中的命令行的一部分。*.cmd
,.bat
)中,由cmd.exe
解释,%1
引用调用时传递的 * 第一个参数**-它可能是也可能不是文件系统路径,也可能不是 * 完整 * 路径(%2
引用 * 第二个 * 参数,...,而%0
指的是手头的批处理文件,反映了调用的路径 *)。*如果参数是用
"..."
括起来传递的,则%1
* 包含 * 双引号,但您可以使用%~1
删除它们。~
的参数中,后面可以跟一个(组合) 字母 *,表示路径**的 * 组件 *,特别是驱动器规格的d
。(例如,d:
),p
用于完整的驱动器相对路径,以\
(e.g,\Windows\System32\
),n
用于 base 文件名(即文件名 * 不带扩展名 *(e.例如,foo
),以及用于扩展的x
(例如,foo
)。例如,.txt
)-运行cmd /c call /?
了解详细信息和附加字母。~
一样,结果字符串中的所有双引号都 removed。"one two.txt"
作为第一个参数传递,并且当前目录是C:\path\to
,则%~dpn1
将扩展为逐字的C:\path\to\one two
。*PowerShell脚本(
*.ps1
)中:$args
**变量包含作为 array 传递的(位置)参数,其元素 never 包含任何在命令行上传递的(未转义的)封闭"..."
。$args[0]
相当于cmd.exe
的%~1
**(注意索引0
是指 first 元素,因为PowerShell是基于此构建的。NET,其数组索引基于0
)。cmd.exe
样式的参数扩展(如%~dpn1
) 没有 * 直接PowerShell等效项-您必须改用PowerShell的cmdlet和运算符。Convert-Path
,从PowerShell 7开始。3.3,只支持 * 现有 * 路径(有关背景信息,请参阅this answer):cmd.exe
的%0
来引用正在运行的批处理文件/脚本本身,但是有两个 * 自动变量 *:$PSScriptRoot
包含运行脚本所在的 directory 的完整路径。$PSCommandPath
包含运行脚本 * 本身 * 的完整路径。33qvvth12#
直接的等价物可能是使用
$args
来访问传入的参数。例如,你可以执行$args[0]
来得到%~1
的等价物。%~1
中的波浪号~
删除了周围的引号,这不是您在从PowerShell脚本中的参数或参数阅读时需要担心的事情。参数
您可能希望显式地为脚本定义参数,而不是
$args
,这可以通过脚本顶部的param()
块来完成。你甚至可以把你的开始时间作为一个参数,然后提示它是否为空。拨打电话:
(if你离开
-Start
了,它会提示)请注意,
%~dnp
本身可能无效。那里应该有个号码吗或者如果你在FOR
循环中使用它的话是一个字母?现在我将忽略它,并为目的地取一个新参数。我还将
Start-Process
调用改为使用数组形式的参数,因为我觉得这样更简洁,但如果愿意,也可以将其改回一个大字符串。阅读更多关于高级函数的内容,了解如何使参数成为强制参数(如果缺少参数,将自动提示输入参数),验证值,设置类型等。
引用
$args
and Parameters