2013-09-30 13 views
6

PowerShell komut isteminden etkileşimli olarak kullanmak istediğim bir komut dosyası var. Senaryonun yerel bir betik modülü kullanması gerekiyor.Bir komut dosyasındaki bir PowerShell modülünü, kullanıcının oturumuna yüklenen modülden ayrılmadan nasıl kullanabilirim?

Geçerli oturumda bırakılmadığı şekilde modülün nasıl alınacağını/kullanılacağını göremiyorum.

Örnek

bir modül (MyModule.psm1) ...

function Test-Method 
{ 
    write-host "Test-Method invoked" 
} 

... ve bir komut dosyası (script.ps1)

Import-Module .\MyModule 
Test-Method 

Şimdi komut dosyası çalıştıran PowerShell komut isteminde ...

PS C:\temp> Get-Module | % {$_.Name} 
Microsoft.PowerShell.Management 
Microsoft.PowerShell.Utility 

PS C:\temp> .\script.ps1 
Test-Method invoked 

PS C:\temp> Get-Module | % {$_.Name} 
Microsoft.PowerShell.Management 
Microsoft.PowerShell.Utility 
MyModule 

Komut dizim, arayanın geçerli oturumuna bırakılmadan MyModule.psm1 dosyasını nasıl içe aktarabilir ve kullanabilir? Çağrının halihazırda modülü ithal etmiş olabileceğini ve komut dosyası tarafından yüklenmesini istemeyebileceğini akılda tutarak (bu nedenle, sadece komut dosyasının tamamlanmasından sonra modülün kaldırılması yeterince iyi değildir).

Ben ettik nokta kaynak modülü yerine aktarmadan ama Bildiğim kadarıyla söyleyebilirim PowerShell Import-Module vs Dot Sourcing

cevap

1

kaplı nedenlerle modülü istiyorum bunu kimden otomatik temizleme davranışı alamadım kabul Bir modülü ithal eden bir "betik". Başka bir modülün içinden bir modül alırsanız, OTOH, ana modül çıkarıldığında, başka bir modül yoksa (veya ipmo-global belirtilmemişse), içe aktardığı tüm modüller kaldırılır.

+0

Bu, az ya da çok nereye gidecektim. Bana göre, bir şey eksik olduğundan emin olmak için PowerShell'i (geleneksel) bir kabuk olarak kullanmak hiç de iyi değil. –

+0

"ipmo" ne anlama geliyor? Bunu hiç görmedim ve Google çok fazla yardım etmiyor. – jpmc26

+1

@ jpmc26 'ipmo', 'Import-Module' için bir takma addır. –

6

Daha önce istediğiniz sözde kodda tanımlamış olduğunuza benziyor. Burada asıl kodunda geçerli:

$checkCmds = Get-Commands -Module MyModule 

Import-Module MyModule 

# Do stuff here . . . 

# unload only if we loaded it 
if ($checkCmds -eq $null) { Remove-Module MyModule } 
+0

Evet, iyi nokta. Neden olmasa da, belli bir sebep göremediğim halde, bu sebepten dolayı, bu hiç de doğru gelmiyordu. Bence, senaryonun kendi kapsamı içinde yapılması için bazı basit yollardan umuyordum. –

+0

Bence bu her iki kritere de uyar: Benim için oldukça basit görünüyor ve kesinlikle bir senaryo içinde yapılabiliyor ... Yani kavramsal olarak ideal çözümünüz ne sunuyor? –

-2

Sen komut dosyasının kapsamı bir modül kısıtlamak için -Scope local ile modülünü alabilirsiniz. Modül, global kapsamda da yüklenirse, komut dosyanızdan çıktıktan sonra yine de kullanılabilir.

+0

Bu, tek bir uyarı ile benim için çalıştı: Komut dosyası çıktıktan sonra modülde bildirilen işlevler erişilebilir olmadı (istendiği gibi) ancak modül Modülü çalıştırırken görünmeye devam etti. –

İlgili konular