【问题标题】:Rename-item: Cannot rename because item at ... does not exist [duplicate]重命名项目:无法重命名,因为...处的项目不存在[重复]
【发布时间】:2021-04-07 07:29:56
【问题描述】:

我迷失了简单的重命名项目。需要将文件夹的名称更改为“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

【问题讨论】:

    标签: powershell file-rename rename-item-cmdlet


    【解决方案1】:

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

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

    见图片:

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

    【讨论】:

    • @user14915444 表明签名是不必要的,因为它只是噪音,网络/个人博客被视为垃圾邮件(您可以将其放在您的个人资料中,但不能放在答案中)
    • +1 用于$_.FullName 提示,但请注意问题中的命令(只有一个)not 工作正常,因为它确实触发了 file-name - 仅字符串化。 Windows PowerShell 中存在仅情境名称字符串化问题,但已在 PowerShell [Core] v6.1+ 中修复 - 详情请参阅 this answer
    【解决方案2】:

    user14915444's helpful answer 提供了关键指针:

    问题在于 Windows PowerShell 会根据情况将 Get-ChildItem (dir) 输出对象按文件 name 而不是 完整路径,需要使用$_.FullName 而不仅仅是$_问题已在 PowerShell [Core] v6.1+ 中得到修复 - 详情请参阅 this answer

    但是,在您的情况下,可以通过管道将Get-ChildItem 输出直接 使用delay-bind script block 传送到Rename-Item,从而完全避免该问题,这也加快了操作速度: p>

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

    注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定该操作会执行您想要的操作,请删除 -WhatIf

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-03
      • 2011-01-03
      • 2014-05-14
      • 2016-08-03
      • 2021-09-20
      • 2022-10-13
      • 1970-01-01
      相关资源
      最近更新 更多