Переименование файлов Powershell, невозможно переименовать файл не существует - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь рекурсивно удалить "- 13234" из группы файлов.И если файл уже присутствует после удаления этой части, он должен добавить (1), (2) и так далее после нового имени файла.

Я протестировал его на небольшом наборе файлов, и он работал нормально.Теперь я попробовал его на тестовом наборе большего размера, и он выдал несколько ошибок.

Например: невозможно переименовать файл не существует Пример: невозможно создать файл, когда файл уже существует

Для многихфайлы, похоже, что у него все хорошо на самом деле.

$files = Get-ChildItem <location> -recurse -file | sort name | group-object -property {$_.fullname -replace "(.*)-.*?(\..*?)$",'$1$2'}
$files | foreach {
    $inc = 0

    if ($_.count -gt 1) {
        rename-item -literalpath $_.group[0].fullname -NewName (($_.group[0].basename -replace "(.*)-.*?$",'$1') + $_.group[0].extension)
        $inc++

    for ($i = $inc; $i -lt $_.count; $i++) {

        rename-item -literalpath $_.group[$i].fullname -NewName (($_.group[$i].basename -replace "(.*)-.*?$",'$1') + "($i)" + $_.group[$i].extension)
    }
    }
    else {
        rename-item -literalpath $_.group.fullname -NewName (($_.group.basename -replace "(.*)-.*?$",'$1') + $_.group.extension)   
}
}

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Я бы сделал что-то вроде этого:

$Path = '<PATH TO THE ROOTFOLDER WHERE THE FILES TO RENAME ARE FOUND>'

Get-ChildItem -Path $Path -Filter '*-*' -File -Recurse | ForEach-Object {
    # obtain the new file basename
    $newBaseName = ($_.BaseName -split '-')[0].Trim()
    $extension   = $_.Extension    # this includes the dot
    $folder      = $_.DirectoryName

    # get an array of all filenames (name only) of the files with a similar name already present in the folder
    $allFiles = @(Get-ChildItem $folder -Filter "$newBaseName*$extension" -File | Select-Object -ExpandProperty Name)
    # for PowerShell version < 3.0 use this
    # $allFiles = @(Get-ChildItem $folder-Filter "$newBaseName*$extension" | Where-Object { !($_.PSIsContainer) } | Select-Object -ExpandProperty Name)

    # construct the new filename
    $newFileName = $newBaseName + $extension

    if ($allFiles.Count) {
        $count = 1
        while ($allFiles -contains $newFileName) {
            $newFileName = "{0}({1}){2}" -f $newBaseName, $count++, $extension
        }
    }

    Write-Host "Renaming '$($_.FullName)' to '$newFileName'"
    $_ | Rename-Item -NewName $newFileName -Force
}

Надеюсь, что поможет

0 голосов
/ 06 марта 2019

Если следующие файлы находятся в одном каталоге, сценарий, вероятно, не будет работать.

1 - 13234.txt
1.txt

Сначала сценарий пытается изменить «1 - 13234.txt» на «1. txt».Вам лучше сначала проверить наличие файла.

Get-ChildItem -File -Recurse |
where BaseName -match "(.*)-" |
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
    } -PassThru
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...