在 powershell 中批量重命名文件并为每个文件名添加一个计数

Bulk rename files in powershell and add a count to each filename

我可以批量重命名目录中的文件或用计数替换每个文件名,但我需要将两者结合起来。

批量重命名(保留原名的前2个字符):

Get-ChildItem * |  
    Rename-Item -NewName { $_.BaseName.Split('-')[0] + $_.Extension }

(部分硬编码解决方案,我知道!)

或者,添加计数:

$count = 1
Get-ChildItem * | % { Rename-Item $_ -NewName (‘{0}.xlsx’ -f $count++) }

(我什至不梦想尾随 0)

我试图将两者结合起来,但无济于事。我做错了什么?

我失败的尝试:

$count = 1 
Get-ChildItem * |
    Rename-Item -NewName { $_.BaseName.Split('-')[0] -f $count++ + $_.Extension }

要计算 $count,您必须使用循环。

$count = 1 
Get-ChildItem * | foreach-object { Rename-Item -NewName { $_.BaseName.Split('-')[0] -f 
 count++ + $_.Extension } }

% 是您在 "add count" 方法中使用的 foreach-object cmdlet 的别名。 刚刚将其添加到您失败的尝试中。

您误解了 format operator 的工作原理。您需要一个带有占位符 ({0}) 的格式字符串才能使该运算符工作。我还建议在该表达式周围放置分组括号,即使在这种情况下不需要这样做。保险起见。

('foo {0} bar' -f $some_var) + $other_var

话虽如此,您显然希望将计数器变量的值附加到原始文件名的片段,而不是将该片段用作格式字符串。为此,您可以简单地将计数器连接到片段,就像处理扩展一样。

为了使计数器正常工作,您还需要指定正确的范围。每次重命名文件时,您使用它的方式都会在脚本块的本地范围内定义一个新变量 $counter ,因此父范围中的变量 $counter 永远不会递增。使用 script:global: 范围修饰符来获取您实际打算使用的变量。

$count = 1
Get-ChildItem * |
    Rename-Item -NewName { $_.BaseName.Split('-')[0] + $script:count++ + $_.Extension }

如果您确实想使用格式运算符而不是字符串连接 (+),您可以像这样使用它:

$count = 1
Get-ChildItem * |
    Rename-Item -NewName { '{0}{1}{2}' -f $_.BaseName.Split('-')[0], $script:count++, $_.Extension }