2010-04-23 30 views

Trả lời

61

Có, thêm thông số -Force.

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

PowerShell là dễ dàng như vậy khi ai biết nó :) – stej

+57

đó làm việc cho toàn bộ thư mục, nhưng những gì nếu tôi chỉ cần sao chép những file riêng biệt (vì vậy tôi có thể có một st vào chúng tôi)? Làm thế nào để bạn sao chép c: \ test1 \ file.txt vào c: \ test2 \ file.txt khi c: \ test2 không tồn tại? Đó là những gì tôi thực sự cần biết làm thế nào để làm. Cảm ơn, Gary –

+30

Tôi đã gặp phải sự cố tương tự này và đã giải quyết vấn đề bằng cách gọi cho Mục mới đầu tiên: 'Mục mới -Force $ tới ' ' Sao chép mục -Force $ từ $ đến ' – rjschnorenberg

75

Trong PowerShell 2.0, nó vẫn là không thể để có được Copy-mục cmdlet để tạo ra các thư mục đích, bạn sẽ cần có mã như thế này:

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

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

Nếu bạn sử dụng -recurse trong Copy-Item nó sẽ tạo tất cả các thư mục con của cấu trúc nguồn trong đích nhưng nó sẽ không tạo thư mục đích thực, ngay cả với -Force.

+0

Cảm ơn bạn đã quan sát. Tôi có một số hành động sao chép không nhất quán; đôi khi nó sao chép một thư mục con và đôi khi nó không. Sau khi đảm bảo rằng thư mục đích tồn tại sự không thống nhất này đã biến mất. –

+0

Tôi cũng gặp phải hành vi sai khi thư mục đích không tồn tại – vicancy

7

Trong PowerShell 3 trở lên, tôi sử dụng Mục sao chép với Mục mới.

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

tôi đã không thử nó trong ver 2.

+0

Điều này hoạt động tốt cho cảm ơn sao chép nội bộ! Không phải khi sử dụng lệnh '-ToSession' mặc dù: '( – Hicsy

0

Tôi đã vấp đây hai lần, và lần cuối cùng này là một tình huống độc đáo và mặc dù tôi mương sử dụng copy-item tôi muốn gửi giải pháp tôi sử dụng .

Đã có danh sách không có gì ngoài các tệp có đường dẫn đầy đủ và trong phần lớn trường hợp các tệp không có tiện ích. tùy chọn -Recurse -Force sẽ không hoạt động đối với tôi vì vậy tôi đã bỏ chức năng copy-item và quay trở lại một thứ như dưới đây bằng cách sử dụng xcopy vì tôi vẫn muốn giữ nó một lớp lót. Ban đầu tôi gắn với Robocopy nhưng nó rõ ràng là tìm kiếm một phần mở rộng tập tin và kể từ khi nhiều người trong số tôi đã không có phần mở rộng nó coi nó là một thư mục.

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

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

Hy vọng nó sẽ giúp ai đó.

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

Yêu thích của tôi là sử dụng lớp .Net [IO.DirectoryInfo], công cụ này sẽ xử lý một số logic. Tôi thực sự sử dụng điều này cho rất nhiều thách thức kịch bản tương tự. Nó có một phương thức .Create() để tạo các thư mục không tồn tại, không có lỗi nếu chúng thực hiện.

Vì đây vẫn là một vấn đề hai bước, tôi sử dụng bí danh foreach để giữ cho nó đơn giản. Đối với các tệp đơn lẻ:

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

Theo như kết hợp đa tệp/thư mục của bạn, tôi sẽ sử dụng RoboCopy trên xcopy. Tháo "*" từ từ và chỉ sử dụng:

RoboCopy.exe $from $to * 

Bạn vẫn có thể thêm/r (Đệ quy),/e (Đệ quy bao gồm Trống), và có 50 công tắc hữu ích khác.

Chỉnh sửa: Nhìn lại điều này thật khó hiểu nhưng không thể đọc được nếu bạn không sử dụng mã thường xuyên.Thông thường tôi có nó chia thành hai, như vậy:

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

Ngoài ra, DirectoryInfo là loại tài sản Chánh của FileInfo, vì vậy nếu bạn $ để là một tập tin, bạn có thể sử dụng chúng với nhau:

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

Chào mừng bạn đến với Stack Overflow! Cảm ơn bạn cho đoạn mã này, có thể cung cấp một số trợ giúp ngay lập tức./114762) giá trị giáo dục của nó bằng cách hiển thị * tại sao * đây là một giải pháp tốt cho vấn đề, và sẽ làm cho nó hữu ích hơn cho người đọc trong tương lai với các câu hỏi tương tự, nhưng không giống nhau, xin vui lòng [sửa] câu trả lời của bạn để thêm giải thích và đưa ra một chỉ dẫn về những hạn chế và giả định được áp dụng. –

Các vấn đề liên quan