我想重命名文件夹中的所有文件。如果出现问题,我制作了一个带有链接文件的测试文件夹,用于案例的原始文件。 我在谷歌搜索了几个小时,并制作了一个带有几个代码片段的脚本。
这是我的剧本:
$i = 1
cd "C:\Users\myname\Desktop\test"
get-childitem -filter "*" | %{rename-item $_ -newname ('filename_s01e{0:D3}.lnk' -f $i++)}
当我启动脚本时,我收到一条错误,即无法重命名,因为该项目不存在于 originalfilename .lnk
我试图更改过滤器和文件名,但我不知道为什么它会丢失这些项目。
请求帮助!
答案 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++)
}