Menulis skrip PowerShell untuk menyalin file dengan ekstensi tertentu dari satu folder ke folder lainnya

10

Saya ingin menulis skrip PowerShell yang mendapatkan parameter berikut sebagai input:
Folder untuk menyalin dari, ekstensi memungkinkan, folder untuk menyalin dan boolean menunjukkan jika perubahan harus me-restart IIS, nama pengguna dan kata sandi.
Cmdlet apa yang harus saya perhatikan mengingat saya menyalin ke server jauh?
Bagaimana cara membaca parameter menjadi variabel?
Bagaimana cara memulai kembali IIS?

Karena saya ingin menyalin beberapa folder, bagaimana cara saya menulis skrip PowerShell yang memanggil skrip PowerShell?

the_drow
sumber
Wow, maaf atas keterlambatan dalam respons apa pun ... Apakah Anda masih membutuhkan bantuan?
Marco Shaw
Ya, saya tidak benar-benar tahu cara me-restart IIS? Bagaimana cara memastikan file benar-benar disalin?
the_drow

Jawaban:

22

Get-ChildItemmemungkinkan Anda untuk membuat daftar file dan direktori, termasuk secara rekursif dengan filter nama file. Copy-Itemmemungkinkan Anda untuk menyalin file.

Ada banyak tumpang tindih dalam hal memilih file, seringkali Copy-Itemdengan sendirinya sudah cukup tergantung pada detail dari apa yang Anda butuhkan (mis. Anda ingin mempertahankan struktur folder?)

Untuk menyalin semua *.foodan *.bardari StartFolder ke DestFolder:

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

Jika Anda perlu mempertahankan struktur folder, hal-hal menjadi lebih sulit karena Anda perlu membangun nama folder tujuan, seperti:

$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
    }

Tetapi robocopykemungkinan akan lebih mudah:

robocopy StartFolder DestFolder *.foo *.bar /s

Pada akhirnya cara memilih akan tergantung pada perincian dari apa yang dibutuhkan.

(Dalam contoh di atas saya telah menghindari alias (misal Copy-Itemdaripada copy) dan secara eksplisit menggunakan nama parameter bahkan jika mereka posisional.)

Richard
sumber
2
Tidak berhasil, saya mencoba: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"dengan dan tanpa -kembali - tidak ada yang terjadi
Carmageddon
6

Saya tidak bisa membahas bagian IIS, tetapi salinan file sambil mempertahankan struktur direktori bisa jauh lebih sederhana daripada yang ditunjukkan dalam jawaban lain:

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

The -Containerargumen adalah bagian ajaib yang akan meniru struktur di tujuan seperti di sumber.

Mark Meuer
sumber
Saya tidak dapat mengaktifkan ini -Include... meskipun saya bisa menyalin semuanya tanpa-Include
Ben Polinsky
1

Satu-satunya solusi yang berhasil bagi saya adalah

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

Solusi lain yang menggunakan -Includeparameter tidak berfungsi.

Rustem Zinnatullin
sumber
1

Seperti beberapa orang yang disebutkan di sini -Include tidak berfungsi.

Untuk membuatnya berfungsi dengan folder bersarang saya menggunakan pendekatan dua langkah: 'filter' + hapus folder kosong

#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 
Pemenang
sumber