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

问题描述 投票:0回答:1

有一堆视频文件,它们都在基本文件名末尾但通常在扩展名之前包含 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

regex powershell file-rename lowercase rename-item-cmdlet
1个回答
0
投票

似乎在您的代码中您想使用 替换为脚本块,但在这种情况下并不是真正需要,您可以做的是添加一个额外的过滤器以仅获取那些实际上具有大写

P
的文件,然后您可以使用 automatic
$Matches
变量
进行替换:

$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()) }
© www.soinside.com 2019 - 2024. All rights reserved.