[Powershell]: la seconda esecuzione di Copy-Item crea una sottocartella (5.1.17763.1007)

Aug 24 2020

Dopo aver cercato un wile ho bisogno di pubblicare la mia domanda qui: voglio fare un compito semplice:

copy-item -path "C:\Folder Copied" -destination "C:\Folder Copied_New" -recurse

Supponendo che la directory "Folder Copied_New" esista in "C:", PS creerà una cartella e copierà la cartella (e il suo contenuto) "C:\Folder Copied" in "Folder Copied_New"

TUTTAVIA, se esegui il comando una seconda volta, accade quanto segue:

Powershell ha creato: "C:\Folder Copied_New\Folder Copied" (anche il contenuto "Test.txt" è stato copiato in questa cartella appena creata...

La terza volta che esegui il comando, dirà che la cartella esiste già...

Quindi la mia domanda: dopo aver eseguito il comando una seconda volta, PS dovrebbe generare un errore, "Folder Copied_New". Come lo faccio?

Ho provato a copiare e rinominare la nuova cartella, usando e NON usando "" nei percorsi, ma non ha funzionato. Penso di usare -Testpath, ma ho pensato di chiedere alla comunità un approccio più semplice (BestPractice).

Grazie in anticipo per la lettura e i consigli!

Ben spiegato in un'altra domanda ma stesso problema

Risposte

1 T-Me Aug 24 2020 at 22:26

Questo comportamento è l'impostazione predefinita:

Diciamo che vuoi copiare e rinominare un elemento, quindi stai facendo questo:

Copy-Item -path source.txt -Destination destination.txt

Ti aspetti un file denominato destination.txtcon il contenuto di source.txt.

Se vuoi copiare un file ma senza rinominarlo fai così:

Copy-Item -path source.txt -Destination C:\test

Ti aspetti che il file source.txtappaia in formato C:\test. Se C:\testnon esistesse verrà creato.

Ora proviamo a copiare una cartella mentre la destinazione non esiste.

Copy-Item -path C:\test -Destination D:\toast 

La destinazione non esisteva, quindi l'hai creata copiando la cartella di origine nella destinazione. Il contenuto della destinazione sarà lo stesso della fonte. La cartella D:\toastè la stessa di C:\testma è stata rinominata nel processo.
Tuttavia, se fornisci un percorso di destinazione in cui si troverà l'oggetto di origine (cartella), si troverà lì.

 Copy-Item -path C:\test -Destination D:\toast 

D:\toastesisteva dalla nostra azione precedente, quindi C:\testverrà creata una copia di:D:\toast\test

2 LievenKeersmaekers Aug 24 2020 at 15:20

Non una risposta ma troppo tempo per scrivere nei commenti. Puoi eseguire il seguente script e mostrarci l'output?

$root = "$($env:TEMP)\test"
$source = "$($root)\Logfiles"
$destination = "$($root)\Drawings\Logs"

# Verify folders don't exist yet
if (Test-Path $source) {Throw}
if (Test-Path $destination) {Throw}

# Set up
New-Item $source, $destination -ItemType Directory -Force | Out-Null # Create folders
New-Item "$($source)\testfile" -ItemType File -Force | Out-Null # Create a testfile

# Show files/folders before copy
Write-Output "Before copy"
Get-ChildItem $root -Recurse | select fullname

# Copy first time
Copy-Item -path $source -destination $destination -Recurse -ErrorAction Continue
Write-Output "After first time copy"
Get-ChildItem $root -Recurse | select fullname

# Copy second time
Copy-Item -path $source -destination $destination -Recurse -ErrorAction Continue
Write-Output "After second time copy"
Get-ChildItem $root -Recurse | select fullname

# Copy third time
Copy-Item -path $source -destination $destination -Recurse -ErrorAction Continue
Write-Output "After third time copy"
Get-ChildItem $root -Recurse | select fullname

# Clean up
Remove-Item $source, $destination -Force -Recurse | Out-Null

Sul mio computer, non osservo alcun comportamento anomalo. La cartella di origine viene copiata nella destinazione dopo la prima volta. La seconda manche non cambia nulla, né la terza manche.