2

我迷失了简单的重命名项目。需要将文件夹的名称更改为“01”、“02”、“03”......尝试了一切,但最后我得到了这个“项目不存在”。对不起,愚蠢的问题,但我整天都在寻找解决方案。

PS C:\Users\admin> 
$nr = 1

Dir E:"Data-test" | %{Rename-Item $_ -NewName (‘{0}’ -f $nr++)}

Rename-Item : Cannot rename because item at 'ert' does not exist.
At line:3 char:23
+ Dir E:"Data-test" | %{Rename-Item $_ -NewName (‘{0}’ -f $nr++)}
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
 
Rename-Item : Cannot rename because item at 'ukh' does not exist.
At line:3 char:23
+ Dir E:"Data-test" | %{Rename-Item $_ -NewName (‘{0}’ -f $nr++)}
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
 
Rename-Item : Cannot rename because item at 'yph' does not exist.
At line:3 char:23
+ Dir E:"Data-test" | %{Rename-Item $_ -NewName (‘{0}’ -f $nr++)}
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
4

2 回答 2

2

你的脚本工作正常。(至少是第一个变体。)您只能运行一次,因为您重命名了它正在使用的文件(即“Data-Test”)。我刚刚在我的 E: 驱动器上创建了一个 Data-Test 文件并运行了你的脚本一次没有问题。然后,在第二次尝试时,它无法工作,因为它第一次工作。

如果您正在使用名为“Data-Test”的目录的内容,则需要在 $_ 后面加上 .FullName。(例如:重命名项目 $_.FullName -NewName ...)

见图片:
看图片

如果它仍然不起作用,请确保在 E: 驱动器的 CWD 中有一个名为“Data-Test”的文件/文件夹。在该位置放置一个反斜杠将保证您在根目录下工作。(例如:E:\Data-Test)

于 2020-12-30T20:27:29.797 回答
2

user14915444 的有用答案提供了关键指针:

问题是Windows PowerShell会根据文件而不是完整路径Get-ChildItem对( dir) 输出对象进行字符串化,因此需要使用 ;$_.FullName而不仅仅是$_; 该问题已在PowerShell [Core] v6.1+中得到修复- 有关详细信息,请参阅此答案

但是,在您的情况下,可以通过使用延迟绑定脚本块Get-ChildItem将输出直接传送到 来完全避免该问题,这也可以加快操作:Rename-Item

[ref] $nr = 1
Get-ChildItem E:Data-test | Rename-Item -NewName { '{0}' -f $nr.Value++ } -WhatIf

注意:上面命令中的-WhatIf常用参数是预览操作。-WhatIf 一旦您确定该操作将执行您想要的操作,请删除。

注意[ref]变量的使用,它允许从延迟绑定脚本块内部增加输入对象的序列号。这是必要的,因为延迟绑定脚本块在调用者作用域的ForEach-Object作用域中运行 - 与传递给( %) 和Where-Object( ?) 的脚本块不同。
有关此差异的讨论,请参阅GitHub 问题 #7157

于 2020-12-30T20:55:18.263 回答