Я получил следующие файлы в нескольких каталогах:
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
Это прекрасно работает, потому что не будет, что у меня будет дубликат файлаnames.
Но если я использую следующий скрипт для файлов без (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