Переименовать имена файлов в PowerShell - PullRequest
0 голосов
/ 22 марта 2019

Я хотел бы переименовать имена файлов отредактированных фотографий, чтобы они были в последовательности Windows Explorer.

Исходное имя файла выглядит примерно так: IMG_1981.jpg и после того, как вы отредактировали его, оно сохраняется как: IMG_E1981.jpg.

Чего я хочу добиться - это удалить E из отредактированного имени файла и добавить некоторый прирост после имени файла. Например, IMG_E1981.jpg меняется на IMG_1981a.jpg или IMG_1981(1).jpg, а также на счетчик приращений при наличии подходящего имени файла. Например, IMG_1981(2), IMG_1981(3) и т. Д.

Какой-нибудь совет относительно простого .ps сценария для достижения этой цели?

Ответы [ 2 ]

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

Большое спасибо @Razorfen.Ваш код абсолютно идеален.Ваше решение удалило «E» из имени файла и проверит, существует ли файл с таким же именем, и добавляет приращение _1.Абсолютно идеально!Большое спасибо.

Я использую пакетный файл для вызова сценария .PS1.При этом содержимое пакетного файла:

PowerShell.exe -Executionpolicy Bypass -Command "& '%~dpn0.ps1'"

При этом содержимое вашего кода в файле .ps1 (с некоторыми незначительными изменениями)

$img_path = ".\"
$rename_path = ".\"

foreach ($img in (Get-ChildItem "$img_path\IMG_E*.jpg")) {
    # note the single quotes at the end - otherwise you need to escape the $-sign
    $new_name = $img.Name -replace "_E(\d\d\d\d)", '_$1'

    # no image with that name exists
    if (!(Test-Path "$rename_path\$new_name")) {
        Copy-Item $img "$rename_path\$new_name"
    } else {
        # image-name already used
        $i = 1
        $inc_name = $new_name -replace ".jpg", "_$i.jpg"
        # creating a new image-name by appending _1, _2, etc. until
        # the name is not already used
        while (Test-Path "$rename_path\$inc_name") {
            Write-Host "Found $inc_name"
            $i++
            $inc_name = $new_name -replace ".jpg", "_$i.jpg"
        }
        Copy-Item $img "$rename_path\$inc_name"
    }
}
del IMG_E*.jpg
# deletes IMG_E*.jpg file as a new renamed copy was created above

del *.AAE
# deletes all *.AAE file from directory
0 голосов
/ 22 марта 2019

Не зная о вашем текущем подходе (обратите внимание на комментарий Герхарда), вы можете попробовать что-то вроде следующего

Для приведенного ниже тест-скрипта я создал новый каталог, содержащий скрипт и подкаталог images. Эта папка содержит другой каталог с именем renamed. Это позволяет нам взглянуть на оригинальные файлы, не переименовывая их

$img_path = "$PSScriptRoot\images"
$rename_path = "$PSScriptRoot\images\renamed"

foreach ($img in (Get-ChildItem "$img_path\*.jpg")) {
    # note the single quotes at the end - otherwise you need to escape the $-sign
    $new_name = $img.Name -replace "_E(\d\d\d\d)", '_$1'

    # no image with that name exists
    if (!(Test-Path "$rename_path\$new_name")) {
        Copy-Item $img "$rename_path\$new_name"
    } else {
        # image-name already used
        $i = 1
        $inc_name = $new_name -replace ".jpg", "_$i.jpg"
        # creating a new image-name by appending _1, _2, etc. until
        # the name is not already used
        while (Test-Path "$rename_path\$inc_name") {
            Write-Host "Found $inc_name"
            $i++
            $inc_name = $new_name -replace ".jpg", "_$i.jpg"
        }
        Copy-Item $img "$rename_path\$inc_name"
    }
}

Имейте в виду, что это, безусловно, не идеальный способ решения этой проблемы. Пожалуйста, попробуйте объяснить вашу текущую проблему немного подробнее.

Поскольку вы говорите, что хотите добавить что-то вроде (0) или (1) к имени файла, если оно уже существует: почему должны уже существовать? Не стесняйтесь поделиться демо-каталог-контент: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...