重命名项目: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
导致 安静的无操作 如果 文件 被重命名为 同名,在目录上尝试相同的名称会导致您看到的错误。
- 这个令人惊讶的差异是 GitHub issue #14903 的主题。
这适用于名称 不 包含子字符串 '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
这会将子目录重命名为 test1
、test2
、...
对于这种技术的解释(需要 Get-Variable
call), see this answer.
如果您想预览将要进行的重命名操作,您可以添加-WhatIf
common parameter 到 Rename-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
"
我正在使用 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
导致 安静的无操作 如果 文件 被重命名为 同名,在目录上尝试相同的名称会导致您看到的错误。
- 这个令人惊讶的差异是 GitHub issue #14903 的主题。
这适用于名称 不 包含子字符串 '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
这会将子目录重命名为 test1
、test2
、...
对于这种技术的解释(需要 Get-Variable
call), see this answer.
如果您想预览将要进行的重命名操作,您可以添加-WhatIf
common parameter 到 Rename-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
"