重命名项目:Powershell 中的源路径和目标路径必须不同错误

Rename-Item : Source and destination path must be different error in Powershell

我正在使用 Powershell 并尝试 return 一个目录的子项,它恰好是一个子目录,然后使用 Rename-Item cmdlet 将子目录名称重命名为其他名称。

我觉得下面的代码应该可以工作:

Get-ChildItem "C:\Users\Admin\Desktop\mydirectory\subdirectory" | Rename-Item -NewName {$_.Name -replace 'test'} 

但是我收到这个错误:

Rename-Item : Source and destination path must be different.

我在这里错过了什么? 提前致谢!

由于您使用的是 Get-ChildItem 而没有将结果限制为 文件 (通过 -File 开关),因此文件 和directories 可以在输出项中。

虽然 Rename-Item 导致 安静的无操作 如果 文件 被重命名为 同名,在目录上尝试相同的名称会导致您看到的错误。

这适用于名称 包含子字符串 'test' 的所有项目,在这种情况下
操作按原样传递输入字符串。

如果您只想重命名 文件 ,解决方案是简单地 添加 -File开关:

Get-ChildItem -File "C:\Users\Admin\Desktop\mydirectory\subdirectory" |
  Rename-Item -NewName { $_.Name -replace 'test' } 

如果目录(也)是目标,在您的情况下,您需要明确过滤掉输入不会发生实际重命名的项目:

Get-ChildItem -Directory -Filter *test* "C:\Users\Admin\Desktop\mydirectory\subdirectory" |
  Rename-Item -NewName { $_.Name -replace 'test' } 

-Filter *test* 确保仅输出包含单词 'test' 的子目录,这保证了实际的重命名发生(但请注意,如果子目录的 entire 名称是 'test',因为这会使脚本块 return 空字符串 ).


如果您只是想单个子目录重命名为固定的新名称,您根本不需要延迟绑定脚本块:

# NOTE: Works only if only a SINGLE subdirectory is returned.
Get-ChildItem -Directory "C:\Users\Admin\Desktop\mydirectory\subdirectory" |
  Rename-Item -NewName 'test'

如果您有 多个 子目录并且您希望将 序列 编号合并到新名称中 ,你又需要一个延迟绑定脚本块:

$num = 0
Get-ChildItem -Directory "C:\Users\Admin\Desktop\mydirectory\subdirectory" |
  Rename-Item -NewName { 'test' + ++(Get-Variable -Scope 1 num).Value } -WhatIf

这会将子目录重命名为 test1test2、...
对于这种技术的解释(需要 Get-Variable call), see this answer.


如果您想预览将要进行的重命名操作,您可以添加-WhatIf common parameterRename-Item 调用,它将显示每个输入文件 重命名为什么。

但是,由于 传递给 -NewName returning 与以前相同的名称

例如,名为 foo 的输入文件将 不会 重命名,因为 'foo' -replace 'test' returns 'foo' 未修改,其中 -WhatIf 将显示如下(添加换行符以提高可读性)——注意目标路径和目标路径是如何相同的:

What if: Performing the operation "Rename File" on target "
Item: C:\path\to\foo 
Destination: C:\path\to\foo
"