но я не могу заставить его удалить скобки из имени файла. Таким образом, в моем каталоге тестирования файлы изменились на следующие
Doc1-doc(1.0).doc ----- Doc1-doc(). Doc
Это потому, что replace
использует регулярное выражение и скобки (группа захвата) должны быть экранированы. Самый простой способ избежать всего текста - использовать метод [regex]::Escape :
gi * | % { rni $_ ($_.Name -replace [regex]::Escape('(1.0)'), '') }
Обратите внимание, что простое удаление всего в скобках создаст конфликты для файлов, таких как Doc1-test(1.1).doc
и Doc1-test(1.0).doc
- они оба будут сопоставлены с Doc1-test.doc
.
Вот моя версия с регулярным выражением, которая будет совпадать только с разделенными точками цифрами в скобках в конце имени файла без расширения. Я не обрабатываю конфликты имен файлов в этом коде, потому что я не знаю желаемого результата.
# Get all objects in current directory that match wildcard: *(*.*).doc
Get-ChildItem -Path '.\' -Filter '*(*.*).doc' |
# Skip folders, because XXX(1.1).doc is a valid folder name
Where-Object {!$_.PSIsContainer} |
# For each file
ForEach-Object {
# New file name =
# File Directory + (File name w\o extension with regex pattern (\(\d+\.\d+\))$ replaced with empty string) + File extension
# Note, that it will create confilcts for files such as Doc1-test(1.1).doc and Doc1-test(1.0).doc,
# both of them will end with name Doc1-test.doc
$NewFileName = Join-Path -Path $_.DirectoryName -ChildPath (($_.BaseName -replace '(\(\d+\.\d+\))$', [string]::Empty) + $_.Extension)
# Basic logging
Write-Host "Renaming: $($_.FullName) -> $NewFileName"
# Rename file.
Rename-Item -Path $_.FullName -NewName $NewFileName
}
Объяснение регулярного выражения (\(\d+\.\d+\))$
1st Capturing group (\(\d+\.\d+\))
\( matches the character ( literally
\d+ match a digit [0-9]
Quantifier: + Between one and unlimited times,
as many times as possible, giving back as needed [greedy]
\. matches the character . literally
\d+ match a digit [0-9]
Quantifier: + Between one and unlimited times,
as many times as possible, giving back as needed [greedy]
\) matches the character ) literally
$ assert position at end of the string