Ç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 -ListAvailable

Gö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 PSGallery

Microsoft 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 PowerShellGet

En 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 -force

Windows 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 -force

Get-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 -listavailable

Mevcut 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.

İlgili makaleler