默认情况下,Copy-Item会被覆盖

Sup*_*tix 8 powershell

我期望从以下代码中获得的行为是:

  1. 获取源目录中的文件列表.
  2. 循环并将每个文件复制到备份目标,只有它尚不存在.

    if (!(Test-Path C:\Folder\Destination)) {
       New-Item -ItemType Directory -Force -Path C:\Folder\Destination
    }
    
    $originalfiles = Get-ChildItem -Path  "C:\Folder\Source"
    $originalfiles
    
    foreach ($file in $originalfiles) {
        Write-Host
        Write-Host File Name: -ForegroundColor DarkYellow
        Write-Host $file.Name
        Write-Host File Path: -ForegroundColor DarkYellow
        Write-Host $file.FullName
    
        $src = $file.FullName
        $dest = "C:\Folder\Destination\$($file.Name)"
    
        Copy-Item $src $dest
    }
    
    Run Code Online (Sandbox Code Playgroud)

Copy-Item除非您指定-Force标志,否则我会认为cmdlet默认为不覆盖.这是我过去在遇到我想要覆盖的情况时会看到的行为.

此外,我认为它可能是foreach循环的介绍,但我尝试使用自己的复制命令,单个文件的硬编码路径,它仍然是相同的.

我应该重新启动IDE还是我忽略了一个错误?

Ans*_*ers 10

如有疑问,请阅读文档

-力

允许cmdlet复制其他无法更改的项目,例如通过只读文件或别名进行复制。

默认行为Copy-Item是替换现有项目。-Force仅当例如目标文件设置了只读属性时,此开关才强制执行替换。

您可以用来-ConfirmCopy-Item执行操作之前获得提示,也可以-WhatIf用来查看cmdlet会做什么。


小智 9

旧的,但是我发现有一个简短的表达式可以做到这一点:

Copy-Item (Join-Path $dir_from "*") $dir_to -Exclude (Get-ChildItem $dir_to)
Run Code Online (Sandbox Code Playgroud)

它将所有文件从复制$dir_from到,$dir_to但不复制(-Exclude部分)名称已经存在的文件$dir_to

  • 如果有人想使用“-recurse”,这是没有用的。 (3认同)

ruf*_*er7 5

它似乎是将Copy-Item项目复制到目标的预期行为,即使它已存在于目标中.我建议测试,如果目标文件路径存在,只复制该文件(如果它尚不存在).

$destinationPath = 'C:\tryout\destination';
if (!(Test-Path $destinationPath)) 
{
   New-Item -ItemType Directory -Force -Path $destinationPath;
}

$sourcePath = 'C:\tryout\source';
$originalfiles = Get-ChildItem -Path $sourcePath;
$originalfiles;

foreach ($file in $originalfiles) 
{
    Write-Host;
    Write-Host File Name: -ForegroundColor DarkYellow;
    Write-Host $file.Name;
    Write-Host File Path: -ForegroundColor DarkYellow;
    Write-Host $file.FullName;

    $src = $file.FullName;
    $dest = "C:\tryout\destination\$($file.Name)";

    if (!(Test-Path $dest))
    {
        Copy-Item $src -Destination $dest;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这并没有考虑到有人想要使用 `-recurse` 的情况。 (2认同)