通过重新格式化现有文件名重命名文件 - 将占位符替换为与-replace运算符一起使用的替换字符串

IHa*_*ons 2 powershell replace rename file

我有一些像这样的视频文件: VideoName_s01e01.mp4季节和剧集是变量.我想在s??和之间添加一个下划线("_")e??.

我一直在使用进行重命名,我有一个起点:

GCI $path -filter '*_s??e??*' -rec |  Ren -new { $_.name -replace '_s[0-9][0-9]', '_s[0-9]_[0-9]_' } -passthru    
Run Code Online (Sandbox Code Playgroud)

这实际上重命名了我的文件VideoName_s[0-9]_e[0-9].mp4.

基本上,我正在寻找s??e??我不知道如何在替换部分中使它们成为变量的字符.

我认为最好的方法是:

  1. 找到e??s??(我们称之为X)的位置.
  2. 将字符串拆分为X-3.
  3. 将字符串连接_到中间的" ".

mkl*_*nt0 7

Martin Brandl的回答提供了一个优雅而有效的解决方案,但值得深入挖掘:

PowerShell的-replaceoperator(... -replace <search>[, <replace>]):

  • 正则表达式作为其第一个操作数,<search>即搜索表达式,并且总是匹配全局(查找所有匹配项).

  • 支持对第二个操作数中捕获(并且未捕获)正则表达式的引用'bar' -replace '[ra]', '@',即替换字符串(替换字符串).

用于引用正则表达式捕获的"替换语言" 'b@@'本身不是正则表达式 - 不会发生匹配,仅支持对正则表达式匹配结果的引用.

值得注意的是,

为方便起见,这里有支持'b'参考(摘自上面链接的页面,增加了重点和注释):

  • <replace>(例如,{ ... })...包括'bar' -replace '[ra]', { '{' + $_.Value + '}' }替换字符串中由捕获组匹配的最后一个子字符串,其中number是十进制值.

    • 注释:

      • 'b{a}{r}'在正则表达式中包括带括号的子表达式隐式地创建了一个捕获组(捕获组).默认情况下,此类捕获组是未命名的,必须由它们的'bar' -replace '[ra]', '{$&}'基于(十进制)索引引用,这些索引反映它们在正则表达式中出现的顺序,因此'b{a}{r}'指的是正则表达式中第一个组捕获的-replace内容,第二个捕获的内容, ...

      • 还支持用于消除数字消歧的形式(例如)(例如,以确保即使遵循,例如,使用也可以识别).-ireplace-creplace<replace>Get-Help about_comparison_operators-replace

      • 您可以命名捕获组并按名称引用它们,而不是依赖索引来引用未命名的捕获组- 请参阅下一点.

      • 如果您对捕获组匹配的内容不感兴趣,可以选择通过将其转换为非捕获组来忽略它Regex.Replace().

  • <replace>...包括由替换字符串中指定的命名组匹配的最后一个子字符串.$number

  • $1... 在替换字符串中包含单个number文字.

  • (...)...包含替换字符串中整个匹配的副本.

  • 1...包含替换字符串中匹配输入字符串的所有文本.

  • $1...包含替换字符串中匹配输入字符串的所有文本.

  • $2...包括替换字符串中捕获最后一个.[这使您无需了解最后一组特定的索引.]

  • ${number}... 在替换字符串中包含整个输入字符串.

最后,请注意:

  • ${1}总是匹配全局,因此如果输入字符串包含多个匹配项,则上述替换项适用于每个匹配项.

  • 这是一般最好使用$1(引号)的正则表达式和替换字符串双方,因为单引号字符串是不可扩展(非插值),从而避免使用PowerShell的自己的前期扩展相混淆000-prefixed令牌和对${1}000字符的解释.
    如果确实需要包含PowerShell变量,则有三个选项:

    • 使用(?:...)(扩展字符串)和用于正则表达式引擎的${name} -escape (?<name>...)实例; 例如, 在下面的例子中:,产生类似的东西$$
      "$"$&

    • 使用string concatenation($`)从文字片段和变量引用构建字符串; 例如:
      $'

    • 使用$+,字符串格式化运算符字符串连接; 例如:
      $_

  • 既然你需要使用-replace逃脱文字'...'替换字符串,用下面的习惯使用一个变量,你要使用其值从字面上:

    • $
    • 这依赖于执行文字子串替换的` 方法. 另外,在简单的情况下,此方法是一种替代方法,但请注意,默认情况下它是区分大小写的.
      "..."
    • 或者,使用嵌套`调用,但由于需要转义,语法很棘手:
      $