ディレクトリをコピーして、Powershellを使用してディレクトリが存在する場合はその内容を上書きするにはどうすればよいですか?


9

いくつかのファイルを含むディレクトリSourceがあり、それをDestinationフォルダーにコピーしたいと思います。宛先が存在する可能性があり、ファイルがすでに存在している可能性があります。ソース内のファイルと同じ名前のファイルは上書きする必要があります。

これをPowershellで実行すると:

Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse

次に、最初の行でフォルダー.\Destinationを作成.\Sourceしてコピーします。これを次回繰り返します。ただし、2行目.\Sourceが新しい.\Destinationフォルダにコピーされ(作成中.\Destination\Source)、3行目が.\Destination\Source再度上書きされます。

最初のケースのように常に動作させるにはどうすればよいですか?つまり.\Destination、コピーする代わりに上書きしますか?


明確にできますか?「ソース」のコンテンツを「宛先」にコピーしますか?フォルダ「source」を「destination」にコピーしませんか?
BroScience 2013年

それは正解です。「宛先」フォルダが存在しない可能性がありますので、存在しない場合は作成してください。
ダグラス

代替としてロボコピーを検討する価値があるかもしれません。必要であれば、Powershellから呼び出すこともできます。これはif exists問題を簡単に処理し、宛先を強制的に再帰的に削除する必要もありません。これには独自の危険が伴います。
ジェレミー

密接に関連したSOの質問:stackoverflow.com/q/47964451/45375
mklement0 2018

回答:


7

だから問題は

cp -r -fo foo bar

bar存在しない場合にのみ機能し、

cp -r -fo foo/* bar

bar存在する場合にのみ機能します。したがって、回避barするには、何かを行う前に存在を確認する必要があります

md -f bar
cp -r -fo foo/* bar

3

「ソース」フォルダのコンテンツのみをコピーする場合は、

copy-item .\source\* .\destination -force -recurse

1
これは、destinationすでに存在する場合にのみ機能します。
Steven Penny

3

Steven Pennyの回答https://superuser.com/a/742719/126444はターゲットディレクトリの元のコンテンツを削除せず、追加するだけです。ターゲットフォルダーをソースのコンテンツで完全に置き換える必要があり、2つの関数を作成しました。

function CopyToEmptyFolder($source, $target )
{
    DeleteIfExistsAndCreateEmptyFolder($target )
    Copy-Item $source\* $target -recurse -force
}
function DeleteIfExistsAndCreateEmptyFolder($dir )
{
    if ( Test-Path $dir ) {
    #http://stackoverflow.com/questions/7909167/how-to-quietly-remove-a-directory-with-content-in-powershell/9012108#9012108
           Get-ChildItem -Path  $dir -Force -Recurse | Remove-Item -force -recurse
           Remove-Item $dir -Force

    }
    New-Item -ItemType Directory -Force -Path $dir
}

1

次のディレクトリ構造があるとします。

  • ルート

    • folder_a
      • a.txt
      • b.txt
      • c.txt
    • folder_b
      • a.txt
      • b.txt

    ルートフォルダーでは、次の一連のコマンドを使用して、必要な結果を得ることができます。

    $files = gci ./folder_b -name
    cp ./folder_a/*.txt -Exclude $files ./folder_b

c.txtのみがコピーされます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.