代码之家  ›  专栏  ›  技术社区  ›  Vicky Dev

如何使用Powershell和Regex更改文件名部分大小写?

  •  1
  • Vicky Dev  · 技术社区  · 2 周前

    有一堆视频文件,它们都在基本文件名的末尾但通常在扩展名之前包含1080P/720P,但我们可以假设所有文件名在基本名称的任何位置都有两个文件中的任何一个。

    现在我想重命名文件,这样只有特定字符串的情况发生变化,意味着只有1080P变成1080P或720P变成720P。

    我已经尝试过这个代码,但它一点作用都没有:

    $validExts = '.mkv', '.mp4', '.mov', '.avi', '.wmv', '.webm', '.avchd', '.flv'
    Get-ChildItem -File |
        Where-Object Extension -In $validExts |
        Where-Object Length -Gt 500mb |
        Rename-Item -NewName {
            ($_.BaseName -replace '^.*(1080P|720P)$', $_.Value.ToLower())
        }
    ### Also tried with ^.*(1080P|720P).*$, but doesn't work either
    ### Even if I put it like this `...{$_.Value.ToLower()}`, 
    ###  it only produces unexpected weird results like 
    ###  "ISLAND OF THE DOLLS 2023 ENGLISH 1080P.Value.ToLower()"
    

    实例 输入 ISLAND OF THE DOLLS 2023 ENGLISH 1080P.mkv 输出 ISLAND OF THE DOLLS 2023 ENGLISH 1080p.mkv

    1 回复  |  直到 2 周前
        1
  •  2
  •   Santiago Squarzon    2 周前

    似乎在你的代码中你想使用 replacement with a scriptblock 但在这种情况下并不是真正需要的,相反,您可以添加一个额外的过滤器,只获取那些实际具有大写字母的文件 P ,则可以使用 automatic $Matches variable 对于更换:

    $validExts = '.mkv', '.mp4', '.mov', '.avi', '.wmv', '.webm', '.avchd', '.flv'
    Get-ChildItem -File |
        Where-Object Extension -In $validExts |
        Where-Object Length -GT 500mb |
        Where-Object Name -CMatch '(?:1080|720)P' | # if there is a match here it gets stored in `$Matches`
        Rename-Item -NewName { $_.Name.Replace($Matches[0], $Matches[0].ToLower()) }
    
        2
  •  0
  •   mklement0    2 周前

    Santiago's helpful answer 显示了一个也向后兼容的解决方案 Windows PowerShell .

    A. PowerShell (Core) 7 基于您自己尝试的解决方案(请注意的附件 $_.Value.ToLower() 在里面 { ... } script block ):

    Get-ChildItem -File |
      Where-Object Extension -In $validExts |
      Where-Object Length -Gt 500mb |
      Rename-Item -NewName {
        ($_.BaseName -creplace '(?<=\b1080|\b720)P', { $_.Value.ToLower() }) + $_.Extension
      }
    
    • -creplace 是这样的吗- 敏感的 的变体 -replace (后者的别名是 -ireplace ).

    • 请注意,任何名称与模式不匹配的输入文件实际上都保持不变。