Come posso copiare una directory, sovrascrivendone il contenuto se esiste usando Powershell?


9

Ho una directory Source con alcuni file al suo interno, che vorrei copiare in una cartella Destination. La destinazione potrebbe esistere e potrebbe contenere già dei file. Tutti i file con lo stesso nome di quelli in Source devono essere sovrascritti.

Se eseguo questo in Powershell:

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

Quindi la prima riga crea la cartella .\Destinatione le copia .\Source, che è quello che vorrei ripetere per la prossima volta. Tuttavia, la seconda riga viene invece copiata .\Sourcenella nuova .\Destinationcartella (creazione .\Destination\Source), quindi la terza riga viene sovrascritta .\Destination\Sourcenuovamente.

Come posso farlo agire come nel primo caso per tutto il tempo? Cioè, sovrascrivere .\Destinationinvece di copiarvi?


Puoi chiarire? vuoi copiare il contenuto di "sorgente" in "destinazione"? e non copiare la cartella "sorgente" in "destinazione"?
BroScience,

Sì, è corretto. La cartella "destinazione" potrebbe non esistere, quindi voglio che venga creata se non viene chiusa.
Douglas,

Potrebbe valere la pena considerare robocopy come alternativa. Puoi ancora chiamarlo da PowerShell se necessario. if existsGestirà facilmente il problema e non richiederà di eliminare forzatamente la tua destinazione in modo ricorsivo, il che comporta i suoi pericoli.
Jeremy,

Strettamente correlata domanda SO: stackoverflow.com/q/47964451/45375
mklement0

Risposte:


7

Quindi il problema è quello

cp -r -fo foo bar

funziona solo se barnon esiste e

cp -r -fo foo/* bar

funziona solo se baresiste. Quindi, per aggirare il problema, è necessario assicurarsi che baresista prima di fare qualsiasi cosa

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

3

Se si desidera solo copiare il contenuto della cartella "sorgente", utilizzare

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

1
Funziona solo se destinationesiste già.
Steven Penny,

3

La risposta di Steven Penny https://superuser.com/a/742719/126444 non elimina il contenuto originale della directory di destinazione, ma solo l'aggiunta. Avevo bisogno di sostituire completamente la cartella di destinazione con il contenuto della fonte e creato 2 funzioni:

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

Diciamo che hai la seguente struttura di Directories

  • radice

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

    In La cartella principale è possibile ottenere i risultati desiderati con la seguente sequenza di comandi:

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

Verrà copiato solo c.txt

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.