2010-04-23 2 views

risposta

61

Sì, aggiungere il parametro -Force.

copy-item $from $to -Recurse -Force 
+2

PowerShell è così facile quando si sa che :) – stej

+57

che funziona per intere directory, ma se sto semplicemente copiando i singoli file (in modo da poter avere una st a noi)? Come si copia c: \ test1 \ file.txt in c: \ test2 \ file.txt quando c: \ test2 non esiste? Questo è quello che ho davvero bisogno di sapere come fare. Grazie, Gary –

+30

Mi sono imbattuto in questo stesso problema e l'ho risolto chiamando New-Item prima: 'New-Item -Force $ to' ' Copy-Item -Force $ da $ a' – rjschnorenberg

75

In PowerShell 2.0, non è ancora possibile ottenere il cmdlet Copy-Item per creare la cartella di destinazione, avrete bisogno di codice come questo:

$destinationFolder = "C:\My Stuff\Subdir" 

if (!(Test-Path -path $destinationFolder)) {New-Item $destinationFolder -Type Directory} 
Copy-Item "\\server1\Upgrade.exe" -Destination $destinationFolder 

Se si utilizza -Recurse in Copy-Item creerà tutte le sottocartelle della struttura di origine nella destinazione ma non creerà la cartella di destinazione effettiva, anche con -Force.

+0

Grazie per questa osservazione. Ho ricevuto alcune azioni di copia incoerenti; a volte copiava una sottocartella e talvolta no. Dopo essersi assicurati che la cartella di destinazione esistesse, questa incoerenza era sparita. –

+0

Ho anche riscontrato un comportamento errato quando la cartella di destinazione non esiste – vicancy

7

In PowerShell 3 e versioni successive utilizzo l'elemento Copia con nuovo elemento.

copy-item -Path $file -Destination (new-item -type directory -force ("C:\Folder\sub\sub\" + $newSub)) -force -ea 0 

non l'ho provato in ver 2.

+0

Questo funziona perfettamente per la copia locale, grazie! Non quando si utilizza il comando '-ToSession': '( – Hicsy

0

Ho inciampato qui due volte, e l'ultima volta è stata una situazione unica e anche se ho fosso utilizzando copy-item ho voluto postare la soluzione che ho usato .

Aveva una lista di nient'altro che file con il percorso completo e nella maggior parte dei casi i file non hanno estensioni. l'opzione -Recurse -Force non funzionava per me quindi ho abbandonato la funzione copy-item e ho ricominciato a usare qualcosa di simile usando xcopy perché volevo continuare a farlo con un solo liner. Inizialmente ho legato con Robocopy ma è apparentemente in cerca di un'estensione di file e dal momento che molti dei miei non avevano un'estensione lo consideravano una directory.

$filelist = @("C:\Somepath\test\location\here\file","C:\Somepath\test\location\here2\file2") 

$filelist | % { echo f | xcopy $_ $($_.Replace("somepath", "somepath_NEW")) } 

Spero che aiuti qualcuno.

0
$filelist | % { 
    $file = $_ 
    mkdir -force (Split-Path $dest) | Out-Null 
    cp $file $dest 
    } 
2

Il mio preferito è utilizzare la classe .Net [IO.DirectoryInfo], che si occupa di una parte della logica. In realtà uso questo per molte sfide simili di scripting. Ha un metodo .Create() che crea directory che non esistono, senza errori se lo fanno.

Poiché questo è ancora un problema in due passaggi, utilizzo l'alias di foreach per mantenerlo semplice. Per i singoli file:

[IO.DirectoryInfo]$to |% {$_.create(); cp $from $_} 

Per quanto riguarda il vostro multi partita file/directory, vorrei utilizzare RoboCopy sopra xcopy. Rimuovere il "*" dal tuo da e basta usare:

RoboCopy.exe $from $to * 

è comunque possibile aggiungere il/r (Recurse),/e (Recurse compreso Vuoto), e ci sono 50 altri interruttori utili.

Modifica: Guardando indietro a questo è terso, ma non molto leggibile se non si utilizza il codice spesso.Di solito ce l'ho diviso in due, in questo modo:

([IO.DirectoryInfo]$to).Create() 
cp $from $to 

Inoltre, DirectoryInfo è il tipo della proprietà Parent di FileInfo, quindi se il vostro $ per è un file, è possibile utilizzare insieme:

([IO.FileInfo]$to).Parent.Create() 
cp $from $to 
2
function Copy-File ([System.String] $sourceFile, [System.String] $destinationFile, [Switch] $overWrite) { 

    if ($sourceFile -notlike "filesystem::*") { 
     $sourceFile = "filesystem::$sourceFile" 
    } 

    if ($destinationFile -notlike "filesystem::*") { 
     $destinationFile = "filesystem::$destinationFile" 
    } 

    $destinationFolder = $destinationFile.Replace($destinationFile.Split("\")[-1],"") 

    if (!(Test-Path -path $destinationFolder)) { 
     New-Item $destinationFolder -Type Directory 
    } 

    try { 
     Copy-Item -Path $sourceFile -Destination $destinationFile -Recurse -Force 
     Return $true 
    } catch [System.IO.IOException] { 
     # If overwrite enabled, then delete the item from the destination, and try again: 
     if ($overWrite) { 
      try { 
       Remove-Item -Path $destinationFile -Recurse -Force   
       Copy-Item -Path $sourceFile -Destination $destinationFile -Recurse -Force 
       Return $true 
      } catch { 
       Write-Error -Message "[Copy-File] Overwrite error occurred!`n$_" -ErrorAction SilentlyContinue 
       #$PSCmdlet.WriteError($Global:Error[0]) 
       Return $false 
      } 
     } else { 
      Write-Error -Message "[Copy-File] File already exists!" -ErrorAction SilentlyContinue 
      #$PSCmdlet.WriteError($Global:Error[0]) 
      Return $false 
     } 
    } catch { 
     Write-Error -Message "[Copy-File] File move failed!`n$_" -ErrorAction SilentlyContinue 
     #$PSCmdlet.WriteError($Global:Error[0]) 
     Return $false 
    } 
} 
+0

Welcome to Stack Overflow! Grazie per questo snippet di codice, che potrebbe fornire un aiuto immediato. Una spiegazione adeguata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore educativo mostrando * perché * questa è una buona soluzione al problema e renderebbe più utile ai futuri lettori con domande simili, ma non identiche. Per favore [modifica] la tua risposta per aggiungere una spiegazione e dare un'indicazione di quali limitazioni e ipotesi si applicano. –