【问题标题】:Powershell rename files with sequential numbers in the middle of namePowershell重命名文件,名称中间有序号
【发布时间】:2021-11-15 05:42:33
【问题描述】:

我从未使用过 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++)}

但这不起作用。我已经看到使用顺序编号的脚本添加为后缀或前缀。但是如果我想在名称中间添加序列号,我不知道该怎么做。

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

【问题讨论】:

    标签: powershell replace sequential


    【解决方案1】:
    • 您需要使用表达式(在(...) 内)作为-replace 替换操作数,以便合并动态值,例如序列号你的情况。

    • 为了使用在多次调用 delay-bind script block{ ... },第一次尝试中传递给 -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 使调用的意图更加明确,这会从父范围开始查找。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多