5

Çok uzun projenin seyrinde yazdım Powershell kod büyük miktarda var; Bu betikler çok çeşitli işlevler yerine getirir ve çoğu proje kapsamında başkalarına da bağlıdır. Şu anda, iş, her biri birçok işlev içeren birkaç dosyadan oluşur. Aslında, bu betiklerle çalışmak için tüm betik dosyaları, çevreye gelişigüzel bir şekilde nokta kaynaklıydı.Çoklu dosya Powershell Modülündeki komut dosyaları arasındaki bağımlılıklar nasıl yönetilir?

Ancak, ben PowerShell 2.0 modüllerini tanıttı olduğunu geçenlerde öğrendim ve ben birlikte bu şekilde bu komut dosyalarını dağıtmak istiyoruz. Bir modülün içeriği bir arada yüklendiğinden, kaynak kontrolüne yardımcı olmak için her bir betiğin kendi dosyasına sahip olacak şekilde dosyalarımı ayırmak istiyorum. Ancak, şimdi komut dosyaları arasındaki bağlantılara biraz açık değilim.

Bazı testler yaptık ve buna bireysel .ps1 dosyalara her bir işlev için İhracat-ModuleMember komutu taşımak için sakınca olmadığını görünüyor; Bu, C# 'de kamu ve özel kapsam belirleme gibi kendi kapsamlarını ilan eden işlevlere benziyor. Ancak, bunu yaptıktan sonra .psm1 dosyam bundan başka bir şey içermez:

Get-ChildItem -recurse $psScriptRoot | where { $_.Extension -eq ".ps1" } | foreach { . $_.FullName } 

Bu doğru görünüyor mu? Tüm betikler nokta kaynaklı olmakta ve tüm betikler bu varsayım altında birbirlerine atıfta bulunmaktadır. Bunun yerine, kendi konumlarını kullanarak $ psScriptRoot'a göre birbirlerine başvurmaları gerekir mi?

bir yol bu yollardan ikisi farklı var mıdır? Biri tavsiye verebilir mi? Bunlar hakkında henüz bir şey bilmiyorum.

cevap

6

Her .ps1 dosyası bir işlevini içeren ve işlevleri WPK modülü ve PSRemoteRegistry modüllerinde kullanılan PSM1 dosyasında kaynaklı benzer bir teknik gördük.

Get-ChildItem -Path $PSScriptRoot\*.ps1 | Foreach-Object{ . $_.FullName } 

Ben işlevlerinden biri dev komut dosyalarını zorunda kaldığımızı tekniği gibi derdi:

Bu çizgi PSRemoteRegistry modülüdür.

+1

, ancak bunun yerine kendi dosyasındaki her biri komut dosyası içine fonksiyonların gibi grup birkaç:

Burada (MS kaynaklara bağlantılar dahil) buluşlarımla bazı yazdım. – JasonMArcher

4

ayrıca bir bildirim (bir psd1 ile psm1 gerekirse ben aslında bilmiyorum) oluşturarak bakabilir.

New-ModuleManifest ` 
    -Path Fiddler.psd1 ` 
    -Author "Niklas Goude" ` 
    -CompanyName "http://www.powershell.nu/" ` 
    -ModuleVersion 1.0 ` 
    -Description "Module from http://www.powershell.nu/2011/03/14/fiddler/</a> - psd1 created by Matt @ amonskeysden.tumblr.com" ` 
    -FormatsToProcess @() ` 
    -RequiredAssemblies @("Fiddler.dll") ` 
    -NestedModules @() ` 
    -Copyright "" ` 
    -ModuleToProcess "Fiddler.psm1" ` 
    -TypesToProcess @() ` 
    -FileList @("Fiddler.psm1","Fiddler.dll") 

Ben senin sorunun cevabı orada FileList parametresinde dosya listesini dahil olacağını düşünüyorum:

İşte manifestin kullanımım oldu. Bir çeşit bunu

http://amonkeysden.tumblr.com/post/5127684898/powershell-and-fiddler

+0

Sorun şu ki, bu komutları hala almazsınız, böylece get-command -module Fiddler bu modülün kullanabileceği komutları gösterecektir. – flickerfly