gpt4 book ai didi

powershell - Powershell中的行继续中间字符串

转载 作者:行者123 更新时间:2023-12-05 02:14:26 25 4
gpt4 key购买 nike

我正在尝试在具有两个相同捕获卡的系统上编写一个 FFmpeg 命令,因此我必须使用它们的“备用名称”,否则 FFmpeg 不明白我在调用哪个。

唯一的问题是备用名称非常长,尤其是通过 dshow 同时调用音频和视频时:

-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global":audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}"

我想在调用音频之前打破这个“字符串”中线,以使其更具可读性:

-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"`
:audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}"

但是反引号在这种情况下似乎不起作用,我猜是因为它与字符相邻?如果 I 和反引号前的空格会破坏字符串并且 FFmpeg 会出错:

    -i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" `
:audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}"

有没有办法在 Powershell 中将它拆分成多行?

编辑 - 全功能命令:

ffmpeg -y -hide_banner -thread_queue_size 9999 -indexmem 9999 -guess_layout_max 0 -f dshow -rtbufsize 2147.48M `
-video_size 1920x1080 -framerate 60 `
-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global":audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}" `
-thread_queue_size 9999 -indexmem 9999 -guess_layout_max 0 -f dshow -rtbufsize 2147.48M `
-video_size 1920x1080 -framerate 60 `
-i video="@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&24df76f&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global":audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0A494693-5F33-4304-88D7-394757E09648}" `
-map 0:0,0:1 -map 0:1 -map 1:0,1:1 -map 1:1 -c:v h264_nvenc -r 60 -rc-lookahead 120 -forced-idr 1 -strict_gop 1 `
-sc_threshold 0 -flags +cgop -force_key_frames "expr:gte(t,n_forced*2)" -preset: llhp -pix_fmt yuv420p -b:v 250M `
-minrate 250M -maxrate 250M -bufsize 250M -c:a aac -ar 44100 -b:a 384k -ac 2 -af "aresample=async=250" -vsync 1 `
-max_muxing_queue_size 9999 -f segment -segment_time 600 -segment_wrap 9 -reset_timestamps 1 `
-segment_format_options max_delay=0 C:\Users\Jordan\Videos\FFmpeg\FFmpeg%02d.ts

我的目标是打破我对视频/音频设备的要求,以更好地适应该街区的其余部分。

最佳答案

"..." 字符串中的一行末尾或 PowerShell 中的字符串之间使用 ` 效果相同例如,在 Bash 中使用 \ 作为 line continuation 会:

虽然 ` 确实在 PowerShell 中启用行继续,但如果放在一行的最后:

  • 一个跨行的"..."字符串中使用时,` 转义换行符,不删除它,这实际上是一个无操作,因为换行符在 PowerShell 字符串中文字不需要转义。

  • 在您的尝试中,当使用between 应构成单个参数的字符串(将直接放置的字符串在一行中彼此相邻,例如 video="...":audio="..."),` 有效地充当一个参数分隔符,因此您不能以这种方式拆分应该成为单个字符串的内容。[1]

简而言之:在 PowerShell 中

  • 只能在参数之间使用续行

  • 为了将单个参数分布在多行中,您需要使用表达式 ((...));允许表达式跨多行而无需续行。


在您的情况下,一个选择是将字符串部分指定为数组 的元素,这些元素稍后加入 以形成单个字符串。

使用一个简化的例子;请注意 -join 技术如何与使用行结束符 ` 共存,以将命令分散到多行参数之间:

ffmpeg -framerate 60 `
-i (@(
'video=@device_pnp_\\?\1'
'audio=@device_cm_2'
) -join ':') `
-f dshow

这将转换为以下单行执行:

ffmpeg -framerate 60 -i video=@device_pnp_\\?\1:audio=@device_cm_2 -f dshow

请注意,您的原始参数内部引号 (video="...":audio="...") 被使用,因为它通常不被使用没有必要(尽管某些程序,如 msiexec,遗憾地需要它)。

或者,如果您不介意在除最后一个以外的每个子字符串中包含 :,您可以使用 + 进行字符串连接,如 Ted Shaneyfelt's answer指出:

ffmpeg -framerate 60 `
-i (
'video=@device_pnp_\\?\1:' +
'audio=@device_cm_2'
) `
-f dshow

PowerShell 按需自动将外部程序的参数加双引号,即如果它们包含 PowerShell 认为不在嵌入 双引号内的空格。参见 this answer了解更多信息,包括何时可能出现问题。


另一种替代方法预先构造(仅)长参数并通过变量引用它们:

$inputSpec = @(
'video=@device_pnp_\\?\1'
'audio=@device_cm_2'
) -join ':'

ffmpeg -framerate 60 -i $inputSpec -f dshow

要通常将命令的参数分布在多行中而不必在行尾使用 ` between arguments,在 中构造参数>array 在前面,然后使用 splatting 传递它:

# Construct an array containing all arguments.
# Note: Each parameter (+ operand, if any) is placed on its own line
# here for clarity, but you're free to choose as many or few
# lines desired.
$ffmpegArgs = @(
'-y'
'hide_banner'
'-thread_queue_size', '9999'
'-indexmem', '9999'
'-guess_layout_max', '0'
'-f', 'dshow'
'-rtbufsize', '2147.48M'
'-video_size', '1920x1080'
'-framerate', '60'
'-i', (@(
'video=@device_pnp_\\?\usb#vid_07ca&pid_0570&mi_00#7&3886ab1a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global'
'audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{0E6F0DEF-2B29-4117-8D30-13F01160AC5B}'
) -join ':')
)

# ...

# Pass the array via splatting - note the '@'
# (Since ffmpeg is an *external program*, passing the array
# directly, as $ffmpegArgs would work too.)
ffmpeg @ffmpegArgs

注意:

  • Splatting 的主要用例是启用命令参数的编程构造,并且需要不同的语法,如图所示。

  • This - ultimately rejected - RFC proposal提出了新的语法,这将使使用常规参数语法的多行延续更容易,而不需要在每个内部行的末尾使用 `;拒绝的决定是here .


[1] 有关 PowerShell 如何解析复合标记的更多信息,请参阅 this GitHub issue .

关于powershell - Powershell中的行继续中间字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53575865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com