Belirli bir uzantıya sahip dosyaları bir klasörden diğerine kopyalamak için powershell betiği yazma


10

Aşağıdaki parametreleri girdi olarak alır bir powershell komut dosyası yazmak istiyorum:
Klasör kopyalamak için, uzantıları izin verir, kopyalamak için klasör ve değişiklik IIS, kullanıcı adı ve parolayı yeniden başlatmak gerektiğini belirten bir boole.
Uzak bir sunucuya kopyaladığımı düşünürken hangi cmdlet'lere bakmalıyım?
Parametreleri değişkenlere nasıl okurum?
IIS'yi nasıl yeniden başlatırım?

Birden fazla klasörü kopyalamak isteyebileceğimi düşünerek, powershell betiğini çağıran bir powershell betiği nasıl yazarım?


Vay canına, herhangi bir yanıtta geciktiğim için özür dilerim ... Hala yardıma ihtiyacın var mı?
Marco Shaw

Evet, IIS'yi nasıl yeniden başlatacağımı gerçekten bilmiyorum? Dosyaların gerçekten kopyalandığından nasıl emin olabilirim?
the_drow

Yanıtlar:


22

Get-ChildItemdosya adı filtreleriyle özyineli olarak da dahil olmak üzere dosyaları ve dizinleri listelemenizi sağlar. Copy-Itembir dosyayı kopyalamanızı sağlar.

Dosyaları seçme konusunda çok fazla çakışma var, Copy-Itemihtiyacınız olan ayrıntılara bağlı olarak genellikle kendi başına yeterli (örn. Klasör yapısını korumak istiyor musunuz?)

Tümünü *.foove *.barStartFolder'dan DestFolder'a kopyalamak için:

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

Klasör yapısını korumanız gerekiyorsa, hedef klasör adını oluşturmanız gerektiğinden işler zorlaşır:

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

Ancak robocopydaha kolay olması muhtemeldir:

robocopy StartFolder DestFolder *.foo *.bar /s

Sonunda seçim yolu neyin gerekli olduğuna dair ayrıntılara bağlı olacaktır.

(Yukarıda takma adlardan (örn. Copy-ItemZiyade copy) kaçındım ve konumsal olsalar bile parametre adlarını açıkça kullandım.)


2
Çalışmıyor, denedim: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"-ve -seversiz - hiçbir şey olmuyor
Carmageddon

6

IIS bölümünü ele alamıyorum, ancak dizin yapısını korurken dosya kopyası diğer yanıtlarda gösterilenden çok daha basit olabilir:

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

-ContainerArgüman bu kaynakta olduğu gibi hedef yapıyı taklit edecek sihirli bir parçasıdır.


Bunu çalışmak için alamıyorum -Include... ama olmadan her şeyi kopyalamak için alabilirsiniz-Include
Ben Polinsky

1

Benim için çalışan tek çözüm

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

-IncludeParametre kullanan diğer çözümler işe yaramadı.


1

Bazı insanlar burada belirtildiği gibi -Include çalışmıyor.

İç içe klasörlerle çalışmasını sağlamak için iki adım yaklaşımı kullandım: 'filtre' + boş klasörleri sil

#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 

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.