Powershell重命名文件时,文件名中间有序号



我从来没有使用过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 "NEEddd_", "AT-112-"}

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

- 112 - e - 20210812 - _083782.jpg

- 112 w - 20210812 - _084983.jpg

现在,我有一些像这样的文件:

- 112 - newimage - 20210812 - _083782.jpg

- 112 - newimage - 20210812 - _093722.jpg

,我想把它们改成:

- 112 - d1 - 20210812 - _083782.jpg

- 112 - d2 - 20210812 - _093722.jpg

…等等。

我在这里尝试了一些事情来尝试做到这一点。例如替换"NewImage"与"D"然后使用像这样的东西(不准确,只是一个例子):

$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

备注:上面命令中的-WhatIfcommon参数预览操作。删除-WhatIf,一旦你确定操作将做你想要的。

注意:上面的解决方案很简单,但由于重复的Get-Variable调用,有些效率低下-查看这个答案以获得更有效的替代方案。


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

[2]如果没有-Scope参数,如果Get-Variable没有在当前作用域中找到变量,它会在祖先作用域中寻找变量,从父作用域开始——在这种情况下是调用者的作用域。您可以使用-Scope 1更明确地表示调用的意图,它从父作用域开始查找。

最新更新