我从来没有使用过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
属性,如下所示。 - 使用
- 这是必要的,因为延迟绑定脚本块在子作用域中运行,不幸的是,[1]使得在块内创建的变量在每次调用后都超出作用域。
$i = 1
Get-ChildItem *.jpg | Rename-Item -NewName {
$_.Name -replace '-NewImage-', ('-D{0}-' -f (Get-Variable i).Value++)
} -WhatIf
备注:上面命令中的-WhatIf
common参数预览操作。删除-WhatIf
,一旦你确定操作将做你想要的。
注意:上面的解决方案很简单,但由于重复的Get-Variable
调用,有些效率低下-查看这个答案以获得更有效的替代方案。
[1]这与传递给Where-Object
和ForEach-Object
的脚本块的行为形成对比。关于这个问题的讨论,请参阅GitHub issue #7157。
[2]如果没有-Scope
参数,如果Get-Variable
没有在当前作用域中找到变量,它会在祖先作用域中寻找变量,从父作用域开始——在这种情况下是调用者的作用域。您可以使用-Scope 1
更明确地表示调用的意图,它从父作用域开始查找。