0

向文件名添加顺序前缀没有问题。以下在有问题的顶级目录上效果很好。

$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}

真的很想获得一些关于如何让这两个片段中的第一个片段工作以查找所有子目录中的所有文件并在前面加上序号的方式重命名它们的指导。

4

1 回答 1

2

像这样尝试:

Get-ChildItem $path -recurse -file | Where Name -NotMatch '^\d{4}\s+' | 
    Rename-Item -NewName {"{0} $($_.name)" -f $count++} -whatif

当您$_作为参数(不是管道对象)提供时,它被分配给字符串类型的 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 ....

于 2014-05-13T15:21:10.253 回答