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

问题描述 投票:0回答:2

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

批量重命名(保留原始名称的前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 }
powershell count rename bulk
2个回答
1
投票

你误解了format operator是如何工作的。您需要一个带占位符({0})的格式字符串,以使该运算符有效。我还建议在该表达式周围加上分组括号,即使在这种情况下不需要。只是为了安全起见。

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

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

要使计数器正常工作,您还需要指定正确的范围。每次重命名文件时,您使用它的方式都会在scriptblock的本地范围内定义一个新变量$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 }

-1
投票

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

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

%是您在“添加计数”方法中使用的foreach-object cmdlet的别名。只是添加到你失败的尝试。

© www.soinside.com 2019 - 2024. All rights reserved.