Viết tập lệnh powershell để sao chép các tệp có phần mở rộng nhất định từ thư mục này sang thư mục khác


10

Tôi muốn viết một tập lệnh powershell lấy các tham số sau làm đầu vào:
Thư mục để sao chép từ, phần mở rộng cho phép, thư mục để sao chép và boolean cho biết nếu thay đổi sẽ khởi động lại IIS, tên người dùng và mật khẩu.
Tôi nên xem xét các lệnh ghép ngắn nào khi xem xét rằng tôi đang sao chép vào một máy chủ từ xa?
Làm thế nào để tôi đọc các tham số thành các biến?
Làm cách nào để khởi động lại IIS?

Vì tôi có thể muốn sao chép nhiều thư mục, làm thế nào để tôi viết một tập lệnh powershell gọi ra tập lệnh powershell?


Ồ, xin lỗi vì sự chậm trễ trong bất kỳ phản hồi nào ... Bạn vẫn cần trợ giúp chứ?
Marco Shaw

Có, tôi không thực sự biết cách khởi động lại IIS? Làm thế nào để tôi chắc chắn rằng các tập tin được thực sự sao chép?
the_drow

Câu trả lời:


22

Get-ChildItemcho phép bạn liệt kê các tệp và thư mục, bao gồm đệ quy với các bộ lọc tên tệp. Copy-Itemcho phép bạn sao chép một tập tin.

Có rất nhiều sự trùng lặp về mặt lựa chọn các tệp, thường thì Copy-Itemnó là đủ tùy thuộc vào chi tiết của những gì bạn cần (ví dụ: bạn có muốn giữ lại cấu trúc thư mục không?)

Để sao chép tất cả *.foo*.bartừ StartFolder sang DestFolder:

Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"

Nếu bạn cần bảo toàn cấu trúc thư mục, mọi thứ trở nên khó khăn hơn vì bạn cần xây dựng tên thư mục đích, đại loại như:

$sourcePath = 'C:\StartFolder'
$destPath = 'C:\DestFolder'

Get-ChildItem $sourcePath -Recurse -Include '*.foo', '*.bar' | Foreach-Object `
    {
        $destDir = Split-Path ($_.FullName -Replace [regex]::Escape($sourcePath), $destPath)
        if (!(Test-Path $destDir))
        {
            New-Item -ItemType directory $destDir | Out-Null
        }
        Copy-Item $_ -Destination $destDir
    }

Nhưng robocopycó khả năng sẽ dễ dàng hơn:

robocopy StartFolder DestFolder *.foo *.bar /s

Cuối cùng, cách chọn sẽ phụ thuộc vào chi tiết của những gì cần thiết.

(Trong phần trên tôi đã tránh các bí danh (ví dụ như Copy-Itemthay vì copy) và sử dụng rõ ràng tên tham số ngay cả khi chúng là vị trí.)


2
Không hoạt động, tôi đã thử: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"có và không có - không có gì xảy ra
Carmageddon

6

Tôi không thể giải quyết phần IIS, nhưng việc sao chép tệp trong khi duy trì cấu trúc thư mục có thể đơn giản hơn nhiều so với các câu trả lời khác:

Copy-Item -path "StartFolder" -Recurse -Include "*.foo","*.bar" -Destination "DestFolder" -Container

Đối -Containersố là phần ma thuật sẽ tái tạo cấu trúc ở đích như trong nguồn.


Tôi không thể làm việc này với -Include... mặc dù tôi có thể sao chép mọi thứ mà không cần-Include
Ben Polinsky

1

Giải pháp duy nhất hiệu quả với tôi là

Copy-Item -path 'c:\SourceFolder\*.foo' -destination 'c:\DestFolder'

Các giải pháp khác sử dụng -Includetham số không hoạt động.


1

Như một số người đã đề cập ở đây - Bao gồm không hoạt động.

Để làm cho nó hoạt động với các thư mục lồng nhau, tôi đã sử dụng hai bước tiếp cận: 'bộ lọc' + xóa các thư mục trống

#copy with folder structure
Copy-Item -path $source -Recurse -Filter "*.foo" -Destination $destination -Container

#remove empty folders
dir $destination -Directory -Recurse |
    %{ $_.FullName} |
    sort -Descending |
    where { !@(ls -force $_) } |
    rm 

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.