如何重命名/移动项目并覆盖(即使它们存在)(对于文件、文件夹和链接)?

问题描述 投票:0回答:1

是否有一个命令来移动项目(或者只是重命名,因为源和目标都在一个文件夹中)并强制覆盖适用于任何项目类型(叶子,容器)?

背景:我正在编写一个脚本,用相应的相对符号链接替换所有硬链接和连接。示例代码:

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'
powershell file-io
1个回答
3
投票

我认为您正在寻找可以选择覆盖文件和合并目录的 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'

这本质上就是深思熟虑的 Microsoft 工程师通过他们的 UI 为您完成的用于合并文件夹和覆盖文件的操作。

请注意,这与 System.IO 中的 .NET 方法的行为相同

© www.soinside.com 2019 - 2024. All rights reserved.