Powershell复制项目目标不明确

Powershell复制项目目标不明确,powershell,copy-item,Powershell,Copy Item,假设“C:\Temp\first.txt”是一个文件,是否有办法确保 Copy-Item -Path "C:\Temp\first.txt" -Destination "C:\Temp\second.txt" 创建文件“C:\Temp\second.txt”,否则失败?如果目标“C:\Temp\second.txt”已经作为目录存在,我不希望它创建文件“C:\Temp\second.txt\second.txt” 是否存在不易受竞争条件影响的解决方案?您可以使用参数-PassThru运行Cop

假设“C:\Temp\first.txt”是一个文件,是否有办法确保

Copy-Item -Path "C:\Temp\first.txt" -Destination "C:\Temp\second.txt"
创建文件“C:\Temp\second.txt”,否则失败?如果目标“C:\Temp\second.txt”已经作为目录存在,我不希望它创建文件“C:\Temp\second.txt\second.txt”


是否存在不易受竞争条件影响的解决方案?

您可以使用参数
-PassThru
运行
Copy Item
,并在结果的目录路径与目标文件夹相同时引发错误:

$src = 'C:\Temp\first.txt'
$dst = 'C:\Temp\second.txt'
try {
    $f = Copy-Item -Path $src -Destination $dst -PassThru
    if ($f.DirectoryName -eq $dst) {
        throw "$dst already exists as a folder."
    }
} catch {
    Remove-Item $f
    throw $_
}

除此之外,我想不出任何不具备比赛条件的东西。这也有一个缺点,即拷贝会被创建,如果在错误的位置创建,则会被删除。

您需要使用带有if语句的命令测试路径。您能否详细说明您希望避免的竞争条件?如果我测试目标以确保它不是目录,然后将文件复制到目标,在测试之后和复制之前,很可能会将目标创建为目录。结果将创建“C:\Temp\second.txt\second.txt”。