2012-04-03 47 views
13

Tôi muốn có thể viết tập lệnh PowerShell để lấy thư mục (hoặc tập hợp thư mục) và sao chép chúng trong cấu trúc thư mục (không có tệp) có thể được tạo, nơi mà cấu trúc tệp (không có thư mục) có thể được tạo hoặc trong đó cả tệp (tất cả hoặc tệp được chọn) thư mục có thể được tạo.Sao chép các thư mục không có tệp, tệp không có thư mục hoặc mọi thứ bằng PowerShell

Example: 

    C:\ProdData has 3 subfolders in it 
    C:\ProdData\Fld1 
    C:\ProdData\Fld2 
    C:\ProdData\Fld3 - has 2 subfolders under it 
    C:\ProdData\Fld3\MyFolder1 
    C:\ProdData\Fld3\MyFolder2 

Mỗi thư mục ở trên có một số lượng tệp khác nhau có kích thước khác nhau trong đó.

Tôi muốn có một kịch bản PowerShell đó sẽ lặp lại rằng cấu trúc thư mục nơi khác, đem lại cho tôi một sự lựa chọn của thư mục Cấu trúc Chỉ, tập tin Chỉ, hoặc Files and Folders để được sao chép.

Ở phía trên, tôi muốn để có thể copy C: \ ProdData đến một thư mục khác, về cơ bản đổi tên ProdData để TestData (nghĩa là, C: \ ProdData sao chép vào C: \ TestData), hoặc sao chép toàn bộ cấu trúc thư mục.

C:\ProdData vào một thư mục khác đó là một thư mục con của cái gì khác: C:\TestArea\TestFolders\2012-04-01\TestData\ProdData\Fld1, vv ...

Và có chọn lọc chọn để bao gồm các thư mục, tập tin hoặc cả.

Giải pháp lý tưởng sẽ là (chỉ dành cho thư mục) lấy cấu trúc thư mục, xuất/lưu, đọc và tạo cấu trúc tương tự ở nơi khác. Một số giải pháp tôi đã tìm thấy cho biết họ đã sao chép cấu trúc thư mục chỉ, nhưng nếu dữ liệu tồn tại, cũng sẽ được sao chép và bạn không thể loại trừ một hoặc một cấu trúc khác. Tôi có một giải pháp phần để yêu cầu file-duy nhất mà bán bảo toàn con đường, nhưng nó sẽ mất một tập tin:

c:\ProdData\Fld1\MyFile.dat 

và sao chép nó vào:

c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat 

Nhưng đó không phải là một cái gì đó mà có thể dễ dàng được giải mã và sẽ không thể tích hợp lại cấu trúc nguồn. Tôi đánh giá cao bất kỳ suy nghĩ về làm thế nào để thực hiện điều này mà không tái phát minh ra bánh xe.

Trả lời

13

Để sao chép tất cả mọi thứ trong một hệ thống quyền thư mục

Copy-Item $source $dest -Recurse -Force 

Để sao chép các hệ thống quyền bạn có thể thử:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
Copy-Item $source $dest -Filter {PSIsContainer} -Recurse -Force 

Để san bằng một cấu trúc tập tin bạn có thể thử:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
New-Item $dest -type directory 
Get-ChildItem $source -Recurse | ` 
    Where-Object { $_.PSIsContainer -eq $False } | ` 
    ForEach-Object {Copy-Item -Path $_.Fullname -Destination $dest -Force} 

Chúc bạn may mắn!

26

Dưới đây là một số ý tưởng để xử lý từng trường hợp bạn mô tả.

thư mục Cấu trúc Chỉ

này sẽ sao chép mã nguồn đến một đích, recursing thư mục con nhưng không bao gồm tất cả các file.

robocopy $source $dest /e /xf *.* 

Chỉ Files (Flatten Structure)

Có một vài cách để xử lý việc này, nhưng tôi không biết một cách đặc biệt tốt hay thanh lịch. Đây là một cách tiếp cận khó xử nhưng hiệu quả - đối với mỗi thư mục con, nó chạy một bản sao không đệ quy đến một thư mục đích gốc. Phê bình hoặc lựa chọn thay thế đẹp hơn sẽ được chào đón nhiều nhất.

Get-ChildItem $source -Recurse | 
    Where-Object { $_.PSIsContainer -eq $true } | 
    Foreach-Object { robocopy $_.FullName $dest } 

Tất cả mọi thứ

Kịch bản này là đơn giản nhất trong bọn.

robocopy $source $dest /e 

Bạn có thể thử nghiệm với các công tắc (tham khảo robocopy /? trên đường đi) để tinh chỉnh quy trình. Kịch bản khó khăn nhất trong quan điểm của tôi là một kịch bản làm phẳng cấu trúc thư mục. Bạn sẽ có một số quyết định để thực hiện, như cách bạn muốn xử lý cùng một tên tệp xuất hiện trong nhiều thư mục.

Để biết cách chấp nhận các tùy chọn từ dòng lệnh, tôi khuyên bạn nên tập hợp các bộ tham số Powershell cho ba tình huống của bạn. Có một số bài đăng trên blog xung quanh thảo luận khái niệm đó, nhưng bạn cũng có thể xem TechNet hoặc chạy help about_Functions_Advanced_Parameters bên trong Powershell.

+0

Cảm ơn đã gợi ý. Tôi đã không có Robocopy thậm chí cài đặt, và nó phù hợp với nhu cầu khá tốt. Điều tôi đã làm cho cấu trúc của một tệp là đặt Show-Tree thành một tệp văn bản. Điều đó hoàn thành một phần của những gì tôi đã sau. Không ai có thể làm tất cả, nhưng 3 phần tương đối đơn giản cùng nhau hoàn thành những gì tôi cần. Cảm ơn sự giúp đỡ của bạn! –

+0

Để làm phẳng, bạn có thể bỏ qua phần giữa và chỉ sử dụng tùy chọn -File trên Get-ChildItem như (và Copy-Item thay vì robocopy): Get-ChildItem $ source -Recurse -File | Foreach-Object {Copy-Item $ _. FullName $ dest}. Không phải là một sự khác biệt rất lớn mặc dù. – Brandon

+1

@Brandon Điểm tốt. Miễn là bạn đang ở trên Powershell 3 bạn chắc chắn có thể làm điều đó (các tham số '-File' và' -Directory' không tồn tại cho đến v3). – ajk

1

Bản sao sau chỉ là cấu trúc thư mục dạng ProdData để TestData mà không cần bất kỳ tập tin

$from = "C:\ProdData" 
 
$to = "C:\TestData" 
 

 
Get-ChildItem -Path $from -Recurse | 
 
?{ $_.PSIsContainer } | 
 
Copy-Item -Destination {Join-Path $to $_.Parent.FullName.Substring($from.length)} -Force

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