1. ホーム
  2. powershell

[解決済み] コピーアイテムはデフォルトで上書きをする

2022-03-11 22:24:14

質問

以下のコードから期待する動作は。

  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
    }
    
    

と思っていたのですが、その Copy-Item コマンドレットは、デフォルトで上書きしないようになっています。 -Force フラグを使用します。これは、私が過去に上書きをしたい状況に遭遇したときに見た動作です。

また、もしかしたらと思い、導入したのが foreach しかし、コピーコマンドを単独で、単一のファイルのためにハードコードされたパスで試してみましたが、やはり同じでした。

IDEを再起動したほうがいいのか、それとも私の見過ごしたミスなのか?

解決方法は?

迷ったときは ドキュメント .

-フォース

読み取り専用のファイルまたはエイリアスの上にコピーするなど、他の方法では変更できない項目をコピーできるようにするコマンドレットを許可します。

のデフォルトの動作は Copy-Item は、既存の項目を置き換えるものです。そのため -Force スイッチは、たとえば保存先ファイルに読み取り専用属性が設定されている場合にのみ、置換を強制するものです。

を使用することができます。 -Confirm の前にプロンプトが表示されます。 Copy-Item は操作を実行します。 -WhatIf を実行し、コマンドレットが何を行うかを確認します。