如何使用PowerShell循环遍历文件并进行重命名?

21
我想将文件夹中的所有jpg文件重命名为统一的格式,例如Picture00000001.jpg,其中00000001是计数器。
在C#中这很容易实现,但我认为这是PowerShell非常适合处理的基本任务。
我猜应该像这样:
$files = ls *.jpg
$i=0
foreach($f in $files) { Rename-Item $f -NewName "Picture"+($i++)+".jpg" }

但在我开始之前,我想要做两件事情:1)格式化计数器,2)确保这真的是一个好主意。

如果这听起来更像强迫症而不是好主意,请说出来。

2个回答

25

你可以在PowerShell中相对简单地完成这个任务:

ls *.jpg | Foreach -Begin {$i=1} `
   -Process {Rename-Item $_ -NewName ("Picture{0:00000000}.jpg" -f $i++) -whatif}

如果您正在寻找“basename”,并且您正在使用PowerShell 2.0,则只需使用PowerShell添加到每个FileInfo对象的Basename属性:

ls *.jpg | Format-Table Basename

请注意,在PowerShell 1.0中,PowerShell社区扩展添加了相同的Basename属性。

如果意图是在重命名操作期间将计数器字符串附加到文件的基本名称,则可以尝试这样做:

ls *.jpg | Foreach {$i=1} `
   {Rename-Item $_ -NewName ("$($_.Basename){0:00000000#}.jpg" -f $i++) -whatif}

抱歉标题和问题不符,我已经更改了标题。 - Ralph Shillington
哇,你可以单独给 ForEach-Object 提供 beginprocess 脚本块吗?我得重新审视一些高尔夫 PE 问题。 - Joey
嗯,我只是想知道为什么这个能够工作。文档中并没有提到 ForEach-Object-Begin-End 参数是位置参数。是魔法吗? - Joey
1
是的,我曾隐含使用-begin和-process参数,所以我更新了一个示例以明确指出。通常,当您使用Foreach时,您会“位置性地”使用提供的脚本块的-Process参数。不确定Begin/End情况下位置参数的“魔力”是如何工作的,但这种情况一直延续至今。 - Keith Hill
1
啊,我有点困惑。我知道两个(或三个)脚本块的作用很清楚,但是 help % -param begin 只告诉我这里只有“named”一种可能性。在 help % 中也没有关于这种情况的示例或其他文档。这就是我为什么会感到疑惑的原因。但很高兴知道这个方法是可行的。 - Joey

2
尝试以下代码获取无扩展名的文件名:
$f.DirectoryName + "\" + $f.BaseName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接