gpt4 book ai didi

regex - 将 ls 的结果通过管道传输到 Powershell 中的命令中,使用正则表达式捕获

转载 作者:行者123 更新时间:2023-12-02 22:38:32 24 4
gpt4 key购买 nike

我试图通过将 ls 的结果传输到一个函数中来批量编辑一些视频文件的元数据,该函数在元数据中编辑视频文件的名称。示例:

文件:

  • 我的电影 1 - 1080p DTS 5.1.mkv
  • 我的电影 2 - 720p DTS 2.1.mkv
  • 我的电影 3 - 480p AAC 1.0.mkv

元数据中所需的标题重命名:

  • 我的电影 1
  • 我的电影 2
  • 我的电影 3

我在 PowerShell 中使用 MKVToolNix 的 mkvpropedit 函数,它可用于按以下方式重命名单个文件的标题:

C:\"Program Files"\MKVToolNix\mkvpropedit 'My Movie 1 - 1080p DTS 5.1.mkv' -e info -s title='My Movie 1'

这非常有效,但是我希望能够对整个目录执行此操作,从元数据标题中的破折号中删除所有内容。这是我在下面尝试的代码,将 ls 的结果输送到命令中(我应该提到目录中的每个文件都是我希望编辑的电影文件)并使用正则表达式捕获文件名的所需部分。

ls | C:\"Program Files"\MKVToolNix\mkvpropedit {$_.name} -e info -s title={$_.name -replace('(.+)-.+', '$1')}

据我所知,正则表达式是正确的,但我收到以下错误:

mkvpropedit.exe : The command parameter was already specified. Atline:1 char:6

ls | C:"Program Files"\MKVToolNix\mkvpropedit {$_.name} -e info -s t...~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CategoryInfo : InvalidArgument: (:) [],ParameterBindingException

FullyQualifiedErrorId : ParameterSpecifiedAlready

正如评论中所建议的,我也尝试了一个 foreach 循环:

ls | foreach{C:\"Program Files"\MKVToolNix\mkvpropedit {$_.name} -e info -s title={$_.name -replace('(.+)-.+', '$1')}} 

这产生了同样的错误,目录中的每个文件一次。我在这里做错了什么?有没有更好的方法来达到我想要的结果?谢谢!

最佳答案

看起来您正在尝试使用 delay-bind script blocks(将 { ... } 引用为当前管道输入变量的 $_ block ),但是,直接调用 external可执行文件 例如 mkvpropedit

相反,您必须使用 ForEach-Object 调用并使用基于 $_表达式来表达您的论点:

Get-ChildItem | ForEach-Object {
C:\"Program Files"\MKVToolNix\mkvpropedit $_.name -e info -s title=$($_.name -replace '(.+)-.+', '$1')
}
  • $_.name 将当前管道输入对象的 ( $_ 的) .name 属性作为参数传递。

  • title=$($_.name -replace '(.+)-.+', '$1') 使用 $() subexpression operator 将表达式的结果合并到单个 title=<value> 参数中。

    • 注意:在使用 () 时,grouping operator 本身 足以将表达式的结果作为参数传递,在 复合 参数的情况下,例如 title=<value>起作用,因为 PowerShell 的参数绑定(bind)器将 (...) 表达式视为一个单独的参数
      使用 $() 而不是确实作为复合 token 工作,因为 PowerShell 然后将整个 token 隐式处理,就好像它包含在 "..." 中一样,即将它视为 expandable string

注意:虽然通过 C:\"Program Files"\MKVToolNix\mkvpropedit 调用确实有效,但引用风格是不寻常的;更典型的是,您会将整个路径用引号引起来:
"C:\Program Files\MKVToolNix\mkvpropedit"(或者,假设没有要扩展的变量,用单引号:
'C:\Program Files\MKVToolNix\mkvpropedit'
但是,如果路径作为一个整体被引用和/或包含变量引用,则出于语法原因,您必须通过 & 调用 call operator :
& 'C:\Program Files\MKVToolNix\mkvpropedit' ...

关于regex - 将 ls 的结果通过管道传输到 Powershell 中的命令中,使用正则表达式捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63330998/

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