向文件名添加顺序前缀没有问题。以下在有问题的顶级目录上工作得很好。
$path="E:\path\newtest1"
$count=4000
Get-ChildItem $path -recurse | Where-Object {!$_.PSIsContainer -and $_.Name -NotMatch '^\d{4}\s+'} | ForEach -Process {Rename-Item $_ -NewName ("$count " + $_.name -f $count++) -whatif}
但如果顶层目录中的子文件夹中有文件,则完全错过了这些文件。 Whatif报告说,对于任何更深层次的文件,它都不存在"。
我已经尝试了以下内容,基于查看其他递归问题的一些页面,但你可能猜到我不知道它在做什么。 Whatif表明它至少会拾取并重命名所有文件。但是下面的内容太多了,每个文件都有多个副本:
$path="E:\path\newtest1"
$count=4000
Get-ChildItem -recurse | ForEach-Object { Get-ChildItem $path | Rename-item -NewName ("$count " + $_.Basename -f $count++) -whatif}
非常希望获得一些指导,了解如何让这两个片段中的第一个用于查找所有子目录中的所有文件,并使用序列号重新命名。
答案 0 :(得分:2)
尝试如下:
Get-ChildItem $path -recurse -file | Where Name -NotMatch '^\d{4}\s+' |
Rename-Item -NewName {"{0} $($_.name)" -f $count++} -whatif
当您提供$_
作为参数(不是管道对象)时,会将其分配给类型为string的Path参数。 PowerShell尝试将该FileInfo对象转换为字符串,但不幸的是" ToString()"嵌套文件夹中文件的表示只是文件名而不是完整路径。您可以通过执行以下内容来查看:
Get-ChildItem $path -recurse -file | Where Name -NotMatch '^\d{4}\s+' | ForEach {"$_"}
解决方案是A)将对象传递给Rename-Item或B)使用FullName
属性,例如: Rename-Item -LiteralPath $_.FullName ...
。