PowerShell массовая замена конкретного символа и переименование расширения файла - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно массово переименовать файлы в общей папке, в которой

  1. содержит определенный символ, а именно тильда ~ и
  2. имеют расширение файла заглавными буквами или его нетвообще.

Цель состоит в том, чтобы заменить тильду простым -, сохранить расширение файла, если оно есть, но преобразовать его в строчные буквы.

Я успешно справился с первой частью сценария, которая находит файлы

$PATH = "\\<Fileservername>\<Folder>\"
$pattern = "*~*"
Get-ChildItem $PATH -Recurse | where {$_.Name -like $pattern}

. Я борюсь со второй частью сценария переименования.Здесь я нашел две темы:

Мне не удалось адаптировать эти решения к моим потребностям, и могут быть предприняты дополнительные шаги для преобразования указанного имени файла из заглавных букв в строчные или пропуска, если файл не имеет расширения файла.

Примером может быть переименование ACUJLH~H в ACUJLH-H и KYA3BM~Q.PDF в KYA3BM-Q.pdf.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вот мой вклад.Я добавил переключатель -File в командлет Get-ChildItem, чтобы он мог искать только файлы и не пытался обрабатывать имена каталогов.Кроме того, я изменил шаблон замены на ~+, поэтому файлы с повторяющимися тильдами будут заменены одним символом -.(KYA3BM~~~~Q.PDF становится KYA3BM-Q.pdf)

$path = "D:\Code\PowerShell\StackOverflow"
$pattern = "*~*"
Get-ChildItem $path -Recurse -File | Where-Object {$_.Name -like $pattern} |
    ForEach-Object {
        $directory = $_.DirectoryName                # or [System.IO.Path]::GetDirectoryName($_.FullName)  or use Split-Path $_.FullName -Parent
        $filename  = $_.BaseName -replace '~+', '-'  # or [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -replace '~+', '-'
        $extension = $_.Extension                    # or [System.IO.Path]::GetExtension($_.Name)
        if (![string]::IsNullOrEmpty($extension)) { $filename += $extension.ToLower() }
        $newname = Join-Path -Path $directory -ChildPath $filename
        Rename-Item -LiteralPath $_.FullName -NewName $newName -Force
    }
0 голосов
/ 05 октября 2018

Вам нужно будет отфильтровать файлы, которые соответствуют вашим критериям.Затем с помощью ForEach-Object сравните расширения и создайте новые имена файлов для каждого найденного элемента.Наконец, используя командлет Rename-Item, вы вносите изменения.

$PATH = '\\<Fileservername>\<Folder>\'    
Get-ChildItem $PATH -Recurse -Include '*~*' | ForEach-Object {
        [String]$Extension = [System.IO.Path]::GetExtension($_)
        [String]$NewFileName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -replace '~','-'
        if ($Extension){ $NewFileName += $Extension.ToLower() }
        Rename-Item $_.FullName $(Join-Path ([System.IO.Path]::GetDirectoryName($_)) $NewFileName) -Force
    }
...