[Powershell]: la seconda esecuzione di Copy-Item crea una sottocartella (5.1.17763.1007)
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
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.txt
con 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.txt
appaia in formato C:\test
. Se C:\test
non 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:\test
ma è 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:\toast
esisteva dalla nostra azione precedente, quindi C:\test
verrà creata una copia di:D:\toast\test
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.
