是否有一个命令来移动项目(或者只是重命名,因为源和目标都在一个文件夹中)并强制覆盖适用于任何项目类型(叶子,容器)?
背景:我正在编写一个脚本,用相应的相对符号链接替换所有硬链接和连接。示例代码:
mkdir C:\Temp\foo -ErrorAction SilentlyContinue
'example' > C:\Temp\foo\bar.txt
cd C:\Temp
New-Item -ItemType Junction -Name bar -Target C:\Temp\foo
New-Item -ItemType SymbolicLink -Name bar2 -Target '.\foo'
# Produces error: Rename-Item : Cannot create a file when that file already exists.
Rename-Item -Path 'C:\Temp\bar2' -newName 'bar' -force
# Unexpected behaviour: moves bar2 inside bar
Move-item -Path 'C:\Temp\bar2' -destination 'C:\Temp\bar' -force
# This works as per https://github.com/PowerShell/PowerShell/issues/621
[IO.Directory]::Delete('C:\Temp\bar')
Rename-Item -Path 'C:\Temp\bar2' -newName 'bar'
我认为您正在寻找可以选择覆盖文件和合并目录的 UI 体验。这些只是复杂的错误处理机制,可以解决您所看到的相同错误,这要感谢 Microsoft 深思熟虑的工程师。
mkdir C:\Temp\foo -ErrorAction SilentlyContinue 'example' > C:\Temp\foo\bar.txt cd C:\Temp New-Item -ItemType Junction -Name bar -Target C:\Temp\foo New-Item -ItemType SymbolicLink -Name bar2 -Target '.\foo' # Produces error: Rename-Item : Cannot create a file when that file already exists. Rename-Item -Path 'C:\Temp\bar2' -newName 'bar' -force
这是有道理的。您有两个不同的对象,因此它们“不能”具有相同的标识符。这就像试图指向两个不同的物体
# Unexpected behaviour: moves bar2 inside bar
Move-item -Path 'C:\Temp\bar2' -destination 'C:\Temp\bar' -force
这并不意外。当您为目标指定目录时,它会将其视为移动项目应放置在其中的目标目录。
# This works as per https://github.com/PowerShell/PowerShell/issues/621
[IO.Directory]::Delete('C:\Temp\bar')
Rename-Item -Path 'C:\Temp\bar2' -newName 'bar'
请注意,这与 System.IO 中的 .NET 方法的行为相同这本质上就是深思熟虑的 Microsoft 工程师通过他们的 UI 为您完成的用于合并文件夹和覆盖文件的操作。