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

new*_*man 6 powershell get-childitem rename-item-cmdlet powershell-cmdlet

我正在使用 Powershell 并尝试返回目录的子项(该子项恰好是子目录),然后使用 cmdletRename-Item将子目录名称重命名为其他名称。

我觉得下面的代码应该有效:

Get-ChildItem "C:\Users\Admin\Desktop\mydirectory\subdirectory" | Rename-Item -NewName {$_.Name -replace 'test'} 
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

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

我在这里缺少什么?提前致谢!

mkl*_*nt0 8

由于您使用时Get-ChildItem不将结果限制为文件(通过-File开关),因此文件和目录都可以在输出项中。

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

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

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

Get-ChildItem -File "C:\Users\Admin\Desktop\mydirectory\subdirectory" |
  Rename-Item -NewName { $_.Name -replace 'test' } 
Run Code Online (Sandbox Code Playgroud)

如果目录(也)是目标的,就像您的情况一样,您需要显式过滤掉不会发生实际重命名的输入项

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

-Filter *test*确保仅'test'输出包含该单词的子目录,这保证了实际的重命名发生(但请注意,如果子目录的整个名称为'test',则该命令将失败,因为这将使脚本块返回空字符串)。


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

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

如果您有多个子目录并且想要将序列号合并到新名称中,则再次需要延迟绑定脚本块:

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

这会将子目录重命名为test1, test2, ...
有关此技术的说明(需要调用Get-Variable),请参阅此答案


如果您想预览将要发生的重命名操作,可以将-WhatIf公共参数添加到Rename-Item调用中,该参数将显示每个输入文件被重命名的内容。

但是,您必须从输出中推断出没有实际重命名的情况,因为传递的延迟绑定脚本块返回与之前相同的-NewName名称。

例如,名为的输入文件foo不会重命名,因为'foo' -replace 'test'返回'foo'未修改的内容,它将-WhatIf显示如下(为了可读性添加了换行符) - 请注意目标和目标路径是如何相同的:

What if: Performing the operation "Rename File" on target "
Item: C:\path\to\foo 
Destination: C:\path\to\foo
"
Run Code Online (Sandbox Code Playgroud)