使用递增的数字重命名文件夹中的所有文件

时间:2013-12-24 13:42:44

标签: powershell

我想重命名文件夹中的所有文件。如果出现问题,我制作了一个带有链接文件的测试文件夹,用于案例的原始文件。 我在谷歌搜索了几个小时,并制作了一个带有几个代码片段的脚本。

这是我的剧本:

$i = 1
cd "C:\Users\myname\Desktop\test"
get-childitem -filter "*" | %{rename-item $_ -newname ('filename_s01e{0:D3}.lnk' -f $i++)}

当我启动脚本时,我收到一条错误,即无法重命名,因为该项目不存在于 originalfilename .lnk

我试图更改过滤器和文件名,但我不知道为什么它会丢失这些项目。

请求帮助!

1 个答案:

答案 0 :(得分:2)

当您使用Rename-item $_发送设置时,第一个位置参数-Path等于$_作为字符串(将是文件名)。 -Path的问题在于它不支持特殊字符,我猜您在文件名中有这些字符。

如果您使用过$_ | Rename-Item,则cmdlet会将FullName属性与cmdlet中的-LiteralPath参数相关联。 -LiteralPath-Path的替代方案,它可以更好地处理特殊字符,因此它被用作管道中参数绑定的默认值。

通过使用下面的方法,我们会告诉您的脚本使用-LiteralPath并将其与文件FullName的完整路径相关联,这将解决您的问题。如果您使用的是foreach循环而不是Get-ChildItem | Rename-Item,则建议使用此cmdlet。

此外,如果您想要文件夹中的所有文件,则无需使用过滤器。试试下面的示例。

$i = 1
cd "C:\Users\myname\Desktop\test"
get-childitem | %{ Rename-Item -LiteralPath $_.FullName -NewName ("filename_s01e{0:D3}.lnk" -f $i++) }

您还可以在Get-ChildItem cmdlet中包含文件夹路径,并在foreach循环中创建变量,如:

Get-ChildItem -Path "C:\Users\myname\Desktop\test" | 
% -Begin { $i = 1 } -Process { 
    Rename-Item -LiteralPath $_.FullName -NewName ("filename_s01e{0:D3}.lnk" -f $i++)
    }