我在多个目录中获得了以下文件:
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