Çapraz Sürümlü Bir Dünyada PowerShell Modülleri
Geçen gün bir arkadaşımın modülle ilgili bazı soruları çözmesine yardım ediyordum. Ona yardım ederken sorularının ve sorunlarının kendine özgü olmadığını fark ettim. Artık çoğumuz Windows PowerShell 7'yi yan yana çalıştırdığımıza göre, PowerShell modüllerini kullanmanın sonuçları nelerdir? Potansiyel "yakalamalar" nelerdir? Peki sorun olasılığını azaltmak için ne yapabilirsiniz?
PowerShellGet
Hem Windows PowerShell hem de PowerShell, Find-Module ve Install-Module gibi modül komutlarına dayanır. Ancak modüllerin çapraz sürümünü desteklemeniz gerekiyorsa kritik bir gereksinimi karşılamanız gerekebilir. Bu arada, aksi belirtilmedikçe tüm bu komutları çalıştırmak için Windows PowerShell'i kullanın.
Windows PowerShell'i açın ve çalıştırın
Get-Module powershellget -ListAvailableGördüğünüz tek sürüm 1.0.0.1 ise modülü güncellemeniz gerekir. PowerShellGet modülü, modül komutlarını aldığınız yerdir ve çapraz sürüm dünyasında modülün daha sonraki bir sürümüne ihtiyacınız vardır.
Ancak öylece koşamazsınız
Update-Module PowerShellGet
Bunu yaparsanız bir hata alırsınız. 1.0.0.1 sürümü, Windows 10 sürümünüzle birlikte gelen bir sistem modülüdür. Geleneksel anlamda yüklenmemiştir. Ama sorun yok. Hala kurabilirsiniz.
Install-Module PowerShellGet -Force -Repository PSGalleryMicrosoft sürümünü yükleme komutunu çok kısaca anlatıyorum. Doğrulayalım.
Remove-Module PowerShellGet -ErrorAction Ignore
Import-Module PowerShellGet
Get-Module PowerShellGetEn azından 2.2.5 sürümünü görmelisiniz. Eğer öyleyse, devam etmeye hazırsınız. Bu arada, artık Install-Module'ü kullandığınıza göre, daha sonraki bir sürüm güncellemesi varsa, onu yüklemek için Update-Module'u kullanabilirsiniz. Orijinal sistem sürümü hakkında endişelenmeyin. PowerShell varsayılan olarak modülün en son sürümünü otomatik olarak kullanacaktır.
PSModulePath
Bulmacanın bir sonraki kısmı %PSModulePath% adı verilen çevresel bir değişkendir. Bu değişken, PowerShell ve Windows PowerShell'in modülleri aradığı tüm konumları içerir. Modülün otomatik yüklenmesini mümkün kılan şey budur. İşte bu noktada ilginçleşiyor.
İşte temiz bir Windows 10 kurulumundaki değişkenim.
Yolu “;” ile ayırdım. okumayı kolaylaştırmak için sınırlayıcı. 3 varsayılan konum vardır. Bir kez geçerli kullanıcı için, bir kez tüm kullanıcılar için ve bir kez de sistem modülleri için. Çoğunlukla sistem yolundaki her şeyi görmezden geleceğiz. Yeni bir modül kurduğunuzda, bu modül hem kullanıcı hem de tüm kullanıcılar yoluna gidecektir. Birazdan bununla ilgili daha fazla bilgi vereceğiz.
PowerShell 7.1'de de aynı şey var.
Sistem yolunu düşünmenin başka bir yolu da $PSHome'un altında olmasıdır. Yakından bak. PowerShell 7 ayrıca Windows PowerShell sistemini ve tüm kullanıcıların konumlarını da biliyor! Bu, PowerShell'in Windows PowerShell tarafından yüklenen modülleri "görebildiği" anlamına gelir. Ancak Windows PowerShell, PowerShell tarafından yüklenen hiçbir şeyi "göremez".
Kurulum Modülü
Artık bu açıklığa kavuştuğuna göre, bazı modüller yükleyelim. PowerShell'de yalnızca PowerShell 7.x'te çalıştığını bildiğim bir modül kuracağım.
install-module Bluebirdps -Scope AllUsers -force-Scope parametresine dikkat edin. Varsayılan olarak, kurulu modüller kullanıcı başınadır. Ancak bu durumda modülü Tüm Kullanıcılar için kurmak istedim. Bu, modülü yüklemek için kullanılan hesabın C:\Program Files üzerinde yönetici haklarına sahip olması gerektiği anlamına gelir. Bu nedenle, yönetici kimlik bilgilerine ihtiyaç duyulmaması için varsayılan ayar kullanıcının konumudur. Bunu yaparken PowerShell 7'ye başka bir modül kuracağım.
Install-Module PSReleaseTools -forceWindows PowerShell'de tüm kullanıcılar için ve varsayılan kapsamı kullanan bir modül kuracağım.
Install-Module PSScriptTools -Scope AllUsers -force
Install-Module WTToolbox -forceGet-InstalledModule
Bir sonraki soru “Hangi modüllerin mevcut olduğunu nasıl görebilirim?” olmalıdır. Kullanabileceğiniz ve benim bilmediğim bir komut Get-InstalledModule'dür. İşte PowerShell'de elde ettiklerim.
Konuma göre bir modülün kullanıcı için, diğerinin ise tüm kullanıcılar için olduğunu görebilirsiniz. Windows PowerShell'den modül bulunmadığına dikkat edin.
Windows PowerShell tarafında da aynı şey var.
PowerShell 7'den hiçbir şey görünmüyor. Ancak altını çizmek istediğim önemli bir konu var. Daha önce WTToolBox modülünü kapsam belirtmeden yüklemiştim. Varsayılan kullanıcı kapsamıdır, ancak konuma bakın. İşte olanlar: Windows PowerShell'i Yönetici olarak, yani yükseltilmiş bir oturumda çalıştırıyordum. Bu bağlamda “kullanıcı”, “tüm kullanıcılar” ile aynıdır. Bazı açılardan bu iyi bir şey çünkü tüm kullanıcılar için yüklenen herhangi bir Windows PowerShell modülü, uyumluluk varsayılarak PowerShell 7.x'te kullanılabilir.
Önemli Çözüm #1: Get-InstalledModule yalnızca PowerShell sürümü başına yüklenen modülleri gösterir.
Önemli Çözüm #2: Bir modülü yükseltilmiş kullanıcı olarak yüklemek, modülü her zaman tüm kullanıcılar için yükler.
Get-Modül
Peki hangi modüllerin mevcut olduğunu nasıl “görebilirsiniz”? Get-Module'u kullanın. Varsayılan olarak modül yalnızca o anda yüklü olan modülleri gösterir. Hatırlamanız gereken anahtar parametre -ListAvailable'dır.
Get-Module, PSModulePath konumlarını arar, bu nedenle PowerShell 7'de çalışır. Her şeyin çalıştığını "görmek" için:
Get-Module -listavailableMevcut modüllerin envanterini çıkarmak için küçük bir kod pasajını burada bulabilirsiniz.
$p = $env:PSModulePath -split ";"
$m = Get-Module -ListAvailable
foreach ($loc in $p) {
[pscustomobject]@{
Location = $loc
Modules = ($m | where {$_.path -match $loc.replace("\","\\") } ).count
}
}Bu, PowerShell'in her iki sürümünden elde edilen sonuçların bir birleşimidir.
Önemli Çözüm #3: Bir modülü hem Windows PowerShell hem de PowerShell 7.x'te kullanmanız gerekiyorsa, onu Windows PowerShell'deki tüm kullanıcılar için yükleyin.
Özet
Umarım bu gözden geçirme herhangi bir gizemi veya karışıklığı giderir. Gitmeden önce birkaç şeyden bahsetmeme izin verin. Birincisi, PowerShell bir Windows PowerShell modülünü "görebildiği" için çalışacağının garantisi yoktur. Bunun sizi caydırmasına izin vermeyin. Windows PowerShell modüllerinin büyük çoğunluğu PowerShell'de gayet iyi çalışıyor. PowerShell'in altında çalıştığı .NET Core'da desteklenmeyen bir .NET bağımlılığı nedeniyle büyük olasılıkla başarısız olmayanlar.
İkincisi, PSModulePath değişkeniniz farklı olabilir. Yüklediğiniz uygulamalara veya programlara bağlı olarak ek konumlarınız olabilir. Birincil masaüstümde SQL Server Express yüklü olduğundan değişkenim C:\Program Files (x86)\Microsoft SQL Server\150\Tools\PowerShell\Modules\ içeriyor.
Teknik olarak, çevresel değişkeni değiştirebilir veya konumları bir profil komut dosyasıyla ayarlayabilirsiniz. Özel bir konum eklemek istiyorsanız bunu yapabilirsiniz. Ancak Windows PowerShell'in PowerShell modül konumlarını "görebilmesi" için değişkenin güncelleştirilmesini tavsiye etmem. PowerShell'e bir modül takılıysa bunun PowerShell gerektirdiği varsayımıyla çalışıyorum. Mesela BluebirdPS modülünü PowerShell'e kurdum. Windows PowerShell'e aktarabilmek için bazı şeyleri değiştirirsem büyük olasılıkla başarısız olur. Çapraz sürümde çalışacak modüllere ihtiyacınız varsa bunları tüm kullanıcılar için Windows PowerShell'e yükleyin.
PowerShellGet'i güncellemenizi ve modül komutlarına ilişkin yardım ve örnekleri okumak için birkaç dakikanızı ayırmanızı öneririm.






