2010-04-23 17 views

Odpowiedz

61

Tak, dodaj parametr -Force.

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

PowerShell jest tak łatwe, gdy ktoś go zna :) – stej

+57

to działa dla całych katalogów, ale co jeśli ja tylko kopiowanie pojedynczych plików (tak mogę mieć st na nas)? Jak skopiować plik c: \ test1 \ plik.txt do katalogu c: \ test2 \ plik.txt, gdy nie istnieje c: \ test2? Tak naprawdę muszę wiedzieć, jak to zrobić. Dzięki, Gary –

+30

Wpadłem na ten sam problem i rozwiązałem go, najpierw wywołując nowy element: 'New-Item -Force $ to' ' Copy-Item -Force $ od $ to' – rjschnorenberg

75

W PowerShell 2.0, to nadal nie jest możliwe, aby uzyskać z polecenia Kopiuj-Item, aby utworzyć folder docelowy, musisz kodu:

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

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

Jeśli używasz -recurse w Copy-Item utworzy wszystkie podfoldery struktury źródłowej w miejscu docelowym, ale nie utworzy rzeczywistego folderu docelowego, nawet z -Force.

+0

Dzięki za tę obserwację. Mam niespójne działania kopiowania; czasami kopiował podfolder, a czasem nie. Po upewnieniu się, że folder docelowy istnieje, ta niespójność zniknęła. –

+0

Występuje również niewłaściwe zachowanie, gdy folder docelowy nie istnieje – vicancy

7

W PowerShell 3 i powyżej używam Copy-Item z New-Item.

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

nie próbowałem go w ver 2.

+0

Działa to doskonale dla lokalnych kopii dzięki! Nie przy użyciu polecenia '-ToSession' jednak: '( – Hicsy

0

ja potknąłem się tutaj dwa razy, i to po raz ostatni była wyjątkowa sytuacja i choć rowu za pomocą copy-item chciałem zakładać rozwiązanie użyłem .

Posiadał listę tylko plików z pełną ścieżką iw większości przypadków pliki nie mają rozszerzeń. Opcja -Recurse -Force nie zadziałałaby dla mnie, więc porzuciłem funkcję copy-item i cofnąłem się do czegoś podobnego, używając xcopy, ponieważ nadal chciałem zachować jeden linijkę. Początkowo wiązałem się z Robocopy, ale najwyraźniej szukałem rozszerzenia pliku, a ponieważ wiele z moich nie miało żadnego rozszerzenia, uważało to za katalog.

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

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

Mam nadzieję, że komuś pomaga.

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

Moje ulubione to użycie klasy .Net [IO.DirectoryInfo], która zajmuje się niektórymi elementami logiki. Używam tego do wielu podobnych wyzwań związanych ze skryptami. Posiada metodę .Create(), która tworzy katalogi, które nie istnieją, bez błędów, jeśli tak.

Ponieważ jest to nadal problem dwuetapowy, używam aliasu foreach, aby był prosty. W przypadku pojedynczych plików:

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

Jeśli chodzi o twój plik multi/katalog, użyłbym RoboCopy ponad xcopy. Usunąć „*” z listy i po prostu korzystać z:

RoboCopy.exe $from $to * 

Można jeszcze dodać/P (recurse),/e (Rekurencyjnie tym Pusty), i istnieje 50 innych przydatnych przełączników.

Edytuj: Wracając do tego, jest to lakoniczne, ale niezbyt czytelne, jeśli często nie używasz kodu.Zazwyczaj mam go podzielić na dwie części, tak jak poniżej:

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

Również DirectoryInfo jest typem nieruchomości dominującej FileInfo, więc jeśli $ do jest plikiem, można z nich korzystać razem:

([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

Witamy w Stack Overflow! Dziękuję za ten fragment kodu, który może zapewnić natychmiastową pomoc .. Poprawne wyjaśnienie [znacznie się poprawi] (// meta.stackexchange.com/q/114762) jego wartość edukacyjna poprzez wskazanie * dlaczego * jest to dobre rozwiązanie problemu i sprawiłoby, że byłby bardziej przydatny dla przyszłych czytelników o podobnych, ale nie identycznych pytaniach. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie i podać wskazanie, jakie ograniczenia i założenia mają zastosowanie. –

Powiązane problemy