【问题标题】:How can I use variables in long PowerShell command without breaking the command如何在长 PowerShell 命令中使用变量而不破坏命令
【发布时间】:2021-01-29 07:06:59
【问题描述】:

我想使用 ffmpeg 将 .m4a 文件转换为 .mp3 文件。

我可以为每个文件都输入,但是输入起来很费劲。

ffmpeg -i '.\song.m4a' -ac 2 -b:a 192k '.\song.mp3'

有没有办法通过 powershell 使用变量来做到这一点? 例如:

ffmpeg -i $v -ac 2 -b:a 192k $v.mp3

问题在于,-ac 标志被作为路径的一部分,而不是 ffmpeg 的一部分。

有没有办法在 powershell 中解决这个问题?
或者这可以用数组来完成吗?如果我使用 $v=Get-ChildItem -Name 并在 ffmpeg 命令中使用 foreach 循环遍历数组。

我对 PowerShell 很陌生,没有太多经验,但在我看来应该可以做到。

如果能得到任何帮助,我将不胜感激。

【问题讨论】:

  • 不确定“-ac 标志被作为路径的一部分”是什么意思?你试过了吗?如果您尝试并遇到错误或意外行为,请发布完整的错误消息和/或描述行为:)

标签: windows powershell ffmpeg


【解决方案1】:

如果你只做Get-Childitem -Name,你最终会得到song.m4a.mp3,除非你用替换语句等来处理它。如果你把它保留为一个对象,那么你可以引用名称,然后再引用基本名称。

get-childitem -Filter *.m4a |
    foreach {ffmpeg -i “$($_.name)“ -ac 2 -b:a 192k “$($_.basename).mp3”}

我尚未对此进行测试,因此您可能需要调整引号。

【讨论】:

  • 效果很好,谢谢。 “$($_.basname).mp3”对扩展名的重命名对吗?
  • 你明白了! Basename 是没有扩展名的文件名,然后手动指定 mp3。
【解决方案2】:

注意:

  • 你真正的问题不是-ac,而是参数$v.mp3

  • 虽然直接解决方法是"$v.mp3" - 即简单地双引号 你的论点 - 这将导致文件扩展名加倍 (.mp4.mp3),对于Doug Maurer's answer 提供了修复。

以下主要关注PowerShell如何解释命令行参数,例如$v.mp3


为了将$v.mp3 解释为变量$v 的值作为一个整体 后跟逐字文本.mp3,您必须双引号参数("$v.mp3"),如js2010's answer所示。

  • PowerShell 中的双引号内插字符串称为可扩展字符串,语法规则在this answer 中介绍。

不带引号的参数经常,但并不总是,隐式被视为可扩展字符串,而是单个变量引用,例如@ 987654334@ 甚至是子表达式,例如 $($v.BaseName)($v.BaseName) 987654337@ 这里 - 是一个值得注意的例外,被解释为

  • 因此,PowerShell 将.mp3 部分解释为属性访问:也就是说,它尝试返回存储在变量$v 中的对象的名为mp3 的属性的值;如果$v 包含一个字符串,则不会有这样的属性,这意味着表达式的计算结果为$null,并且根本没有任何参数传递给外部程序(ffmpeg)。

  • PowerShell 如何处理未引用命令行参数中的变量引用和子表达式的规则很复杂

    • 请参阅 this answer 了解全面的概述。
    • 因此,如果您知道您的论点应该是一个混合变量引用和逐字部分的字符串,最简单的方法就是始终使用双引号。李>

【讨论】:

    【解决方案3】:

    $v.mp3 似乎不起作用。将变量设置为“song.mp3”。或者使用双引号“$v.mp3”。

    echoargs $v.mp3   # no output
    
    
    echoargs "$v.mp3"
    Arg 0 is <song.mp3>
    

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多