在PowerShell中重命名文件名

时间:2019-03-22 11:21:21

标签: powershell

我想重命名已编辑照片的文件名,以便它们按Windows资源管理器顺序显示。

原始文件名是这样的:IMG_1981.jpg,并且在编辑后,文件名另存为:IMG_E1981.jpg

我要实现的是从编辑的文件名中删除E,并在文件名后添加一些增量。就像IMG_E1981.jpg变成IMG_1981a.jpgIMG_1981(1).jpg一样,如果文件名匹配,也要递增计数。例如IMG_1981(2)IMG_1981(3)等。

有没有关于简单的.ps脚本的建议来实现这一目标?

2 个答案:

答案 0 :(得分:0)

在不了解您当前使用方式的情况下(请注意Gerhard的评论),您可以尝试执行以下操作

对于以下测试脚本,我创建了一个新目录,其中包含该脚本和一个子目录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)之类的文件,如果文件名已经存在:为什么,该文件名应该已经存在吗?随时共享演示目录内容:-)

答案 1 :(得分:0)

非常感谢@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