我可以批量重命名目录中的文件或用计数替换每个文件名,但我需要两者合并。
批量重命名(保留原始名称的前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 }
你误解了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 }
要计算$ count,你必须使用循环。
$count = 1
Get-ChildItem * | foreach-object { Rename-Item -NewName { $_.BaseName.Split('-')[0] -f
count++ + $_.Extension } }
%是您在“添加计数”方法中使用的foreach-object cmdlet的别名。只是添加到你失败的尝试。