尝试使用顺序前缀*递归重命名时,Powershell出错*

尝试使用顺序前缀*递归重命名时,Powershell出错*,powershell,recursion,sequential-number,Powershell,Recursion,Sequential Number,在文件名中添加顺序前缀没有问题。下面的内容在有问题的顶级目录中非常有用 $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++)

在文件名中添加顺序前缀没有问题。下面的内容在有问题的顶级目录中非常有用

$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}
非常希望获得一些指导,了解如何使用这两个代码片段中的第一个来查找所有子目录中的所有文件,并使用前面的序列号重命名它们。

请这样尝试:

Get-ChildItem $path -recurse -file | Where Name -NotMatch '^\d{4}\s+' | 
    Rename-Item -NewName {"{0} $($_.name)" -f $count++} -whatif
当您提供
$\uuuu
作为参数(不是管道对象)时,会将其分配给类型为string的Path参数。PowerShell试图将FileInfo对象转换为字符串,但不幸的是,嵌套文件夹中文件的“ToString()”表示形式只是文件名,而不是完整路径。您可以通过执行以下命令看到这一点:

Get-ChildItem $path -recurse -file | Where Name -NotMatch '^\d{4}\s+' | ForEach {"$_"}

解决方案是A)将对象导入重命名项,或B)使用
FullName
属性,例如
Rename Item-LiteralPath$\FullName…

或C)将对象导入ForEach并使用$\MoveTo()非常感谢Keith,我将其更改为{{0}$($\u.name)”成功。我无法处理的部分是语法:A)将对象导入重命名项。如果我使用
ForEach对象-Process{Rename item{{{0}$($\.FullName)”-f$count++}-whatif}
-whatif reports“无法计算参数'Path',因为它的参数被指定为脚本块”。添加-LiteralPath将生成“找不到NamedParameterNotFound"。非常感谢您的建议。在场景A中,您不需要使用
Foreach
直接通过管道进入Rename Item命令,因为它接受管道输入。诀窍是您需要访问NewName参数参数中的管道对象。这就是您使用scriptblock来实现的。请参见上面我的第一个示例。这用于PowerShell V3及以上版本的rks。感谢您快速返回并给出清晰的解释。至关重要的是,发现我在这台计算机上的V2上。在该模式下,A)访问子目录中的所有文件,但$count不会增加,因此所有文件都有相同的前缀。我将在另一台计算机上让您知道。对于V2,请使用
$global:count++