Powershell 重命名名称中间带有序号的文件

Powershell rename files with sequential numbers in the middle of name

我从来没有使用过 powershell 或任何 cmd 行来尝试重命名文件,所以我也不太了解一般的脚本编写。 我已经在重命名有问题的文件方面取得了一些成功,但仍停留在最后一块拼图上。

原始文件名:

NEE100_N-20210812_082245.jpg

NEE101_E-20210812_083782.jpg

NEE102_W-20210812_084983.jpg

我成功地将它们更改为 AT-###-N-......jpg 使用:

Rename-Item -NewName {$_.name -replace "NEE\d\d\d_", "AT-112-"}

这是他们之后的样子: AT-112-N-20210812_082245.jpg

AT-112-E-20210812_083782.jpg

AT-112-W-20210812_084983.jpg

但是现在,我有几个文件如下所示:

AT-112-NewImage-20210812_083782.jpg

AT-112-NewImage-20210812_093722.jpg

我想将它们更改为:

AT-112-D1-20210812_083782.jpg

AT-112-D2-20210812_093722.jpg

...等等。

我在这里尝试了一些方法来尝试做到这一点。例如用“D”替换“NewImage”,然后使用类似 this 的东西(不准确,只是一个例子):

$i = 1
Get-ChildItem *.jpg | %{Rename-Item $_ -NewName ('19981016_{0:D4}.jpg' -f $i++)}

但这没有用。我见过使用顺序编号的脚本,这些编号作为后缀或前缀添加。但是如果我想在名称中间有序列号,我不知道该怎么做。

希望这是有道理的,如果我需要更多详细说明,请告诉我。谢谢!

  • 您需要使用表达式(在(...)内)作为您的-replace替换操作数 以便合并一个动态值,例如您案例中的序列号。

  • 为了使用在 的多次调用中保持状态的变量({ ... },被传递的到 -NewName 参数),您需要 调用者的 作用域中创建变量,并 在那里明确引用它:

    • 这是必要的,因为延迟绑定脚本会在 子范围 中阻塞 运行,不幸的是,[1]以便在每次调用后块中创建的任何变量都超出范围。
    • 使用Get-Variable获取对调用者(父)作用域中变量对象的引用[2],并使用其 .Value 属性,如下所示。
$i = 1
Get-ChildItem *.jpg | Rename-Item -NewName {
  $_.Name -replace '-NewImage-', ('-D{0}-' -f (Get-Variable i).Value++)
} -WhatIf

注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf

注意:由于重复 Get-Variable 调用,上述解决方案很简单,但效率有些低 - 请参阅 this answer 了解更有效的替代方案。


[1] 这与传递给 Where-ObjectForEach-Object 的脚本块的行为形成对比。有关此有问题的差异的讨论,请参阅 GitHub issue #7157

[2] 没有 -Scope 参数,如果 Get-Variablecurrent 范围内找不到变量,它在 ancestral 作用域中查找变量,从父作用域开始 - 在本例中为调用者的。您可以使用 -Scope 1 使调用的意图更明确,这会从父作用域开始查找。