Близко, но вы хотите убедиться, что совпадение с предыдущим пробелом также совпадает, чтобы удалить его, и вы обязательно должны включить расширение.
Get-ChildItem *.jpg | Foreach-Object {
$currentFile = $_
$renamed = $false
$count = -1
while(-Not $renamed){
$newName = $currentFile.Name -replace '(\s+-.*)*\..*', ''
if( ++$count -gt 0 ){
$newName += "(${count})"
Write-Output "Using name: ${newName}"
}
try {
Rename-Item $_ "${newName}$($currentFile.Extension)" -EA Stop 2>$null
$renamed = $true
} catch {
if( $_.Exception -match "Cannot create a file when that file already exists." ){
Write-Warning "Filename ${newName}$($currentFile.Extension) exists - incrementing filename"
} else {
Write-Error $_
$renamed = $true # set renamed to true because some other error occurred on this file, continue to the next one
}
}
}
}
В основном мы сопоставляемв приведенном выше выражении с помощью оператора -replace
и замените его пустой строкой. "$()"
позволяет нам вычислять выражение в строке и возвращать отображаемую строку с вычисленным значением, а не просто ссылаться на переменную, которую вы можете сделать с помощью "$var"
или "$ {var}". Мы делаем это дважды - один раз для имени файла, а затем снова для восстановления расширения из исходного объекта файла, поскольку -replace
в конечном итоге удаляет расширение из нового имени.
Объяснение регулярного выражения
\s
соответствует любому пробельному символу +
соответствует одному или нескольким предыдущим символам -
в данном случае это литерал -
символ .
соответствует любому символу *
соответствует нулю или более предшествующего символа \.
- это литерал .
. Нам нужно сопоставить это для расширения. ()
означает группу. Думайте об этом как о подвыражении. Вы можете сопоставить группу с квантификаторами (такими как +
или *
), как если бы это был один символ.
Поэтому, чтобы разбить вышеприведенное выражение, мы необязательно сопоставим one or more whitepace characters
(обратите внимание, что *
после группы), затем один -
, за которым следует zero or more additional characters
. Затем мы определим соответствие по расширению, потому что мы хотим, чтобы оно было удалено из нового имени (оно будет добавлено в Rename-Item
).
EDIT
Я пропустил вторую часть, где вы хотелиувеличить имя файла, если оно уже существует. Я не могу придумать простой способ сделать это, но я написал код, который должен работать для вас. Он в основном пытается переименовать, и если это не удается из-за уже существующего файла, он пытается снова и увеличивает счетчик. Обратите внимание, что добавление приращения усложнило код.