修剪文件名以使其少于100个字符

时间:2019-04-16 09:26:58

标签: powershell rename trim

我在多个目录中获得了以下文件:

File 1: Normal file 1.txt
File 2: Normal file 1(1).txt
File 3: Normal file 1 longer file.txt
File 4: Normal file 1 longer file even longer.txt
File 5: Normal File 1 longer file(1).txt

我想将文件修整到±150个字符(以后可以设置值)。对于结尾为(1),(2),(12)的文件,我目前手头有以下解决方案。

gci -File -Recurse |
    Where BaseName -match '^(.{140})..*(\(\d+\))$' |
    Rename-Item -NewName {$Matches[1] + $Matches[2] + $_.Extension} -WhatIf

这很好,因为不会出现重复的文件名。

但是,如果我将以下脚本用于没有(1),(2),(12)的文件,则它将失败。因为例如,如果我将文件3修剪到“普通文件1”,我会得到它已经存在的错误。

为此使用的代码:

gci -File -Recurse |
    Where BaseName -match '^(.{140})' |
    Rename-Item -NewName {$Matches[1] + $_.Extension} -WhatIf

我当时正在考虑使用我用于其他用途的代码来解决此问题,但直到现在仍无法正常工作。我可能碰巧一个(1)的文件也已经存在。

Get-ChildItem -File -Recurse |
    where BaseName -match '^(.{140})' |
    Group-Object { $_.DirectoryName + "\" + $Matches[1].TrimEnd() + $_.Extension } |
    foreach {
        $fi = [IO.FileInfo]::New($_.Name)
        $i = 0
        $_.Group | Rename-Item -NewName {
            do {
                $newName = $fi.DirectoryName + "\" + $fi.BaseName + $(if($i){"($i)"}) + $fi.Extension
                $script:i++
            } while (Test-Path $newName)
            $newName
        } -Whatif
    }

我发现目录中是否包含以下文件:

Filename 1 - 45781.txt 
Filename 1(2).txt
Filename 1(3).txt
Filename 1(4).txt
Filename 1(5).txt
Filename 1(1).txt

脚本将重命名文件,例如:

Filename 1.txt 
Filename 1(5).txt
Filename 1(6).txt
Filename 1(7).txt
Filename 1(8).txt
Filename 1(9).txt

0 个答案:

没有答案