İlk PowerShell Modülünüzü Oluşturma


PowerShell, çekirdek dilde yerleşik çeşitli güçlü cmdlet'lere sahiptir. Ancak yerel işlevler sizi yalnızca bir yere kadar götürür ve çoğu projede daha fazla işlevselliğe ihtiyaç duyacaksınız. PowerShell Galerisi çok çeşitli indirilebilir üçüncü taraf modüller sunar, ancak aynı zamanda özel PowerShell modülleri oluşturma seçeneği de vardır. Bu makale, ilk PowerShell modülünüzü oluşturma sürecinde size yol gösterecektir.

PowerShell Modülü nedir?

En temelde bir PowerShell modülü iki gerekli bileşenden ve bir isteğe bağlı bileşenden oluşur. Bu bileşenler birlikte bir PowerShell modülünde kullanılması önerilen en az bileşendir.

  • psd1 Dosyası - PowerShell tanım dosyası
  • psm1 Dosyası - PowerShell modülü yükleme dosyası
  • Fonksiyonlar

İki tür modül vardır: komut dosyası modülleri ve ikili modüller. Bu örnekte bir komut dosyası modülü oluşturuyoruz. Geleneksel PowerShell işlevlerinden oluşan bir komut dosyası işlevinin oluşturulması kolaydır. İkili modül, .NET framework ile derlenmiş bir derlemedir. .NET'te yazılan cmdlet'lere komut dosyası modülleri kadar ulaşılabilir değildir. Öncelikle PowerShell modülünün amacını tanımlamamız gerekiyor. Bir modülün tüm yönlerinin başlamadan önce eşlenmesi gerekmez. Net bir plan oluşturmak, gerekli fonksiyonların tanımlanmasını çok daha kolay hale getirir.

Modülün Amacını Tanımlama

Bir modülün hazırlanması zor değildir ancak sunulan işlevselliğin yapılandırılması zor olabilir. Bu makalenin amacı üç işlevli basit bir modül oluşturmaktır. Çoğu zaman modüller tek bir ürün veya araca ilişkin işlevsellik içerir. Modülümüzdeki işlevler üç farklı ürünü hedefler ancak belirli bir iş akışını destekler. İş akışı, SharePoint üyelerini almak, bir katılım Akışını tetiklemek ve son olarak SharePoint grup üyelerini bir Ekibin mesajıyla göndermekten ibarettir.

  • Yeni Ekiplerin Mesajı
  • Invoke-PowerAutomateFlow
  • Get-SharePointMember

Bir Modülün Yapısı

Modülün yapısı oldukça basittir. Klasör ve dosya düzeni aşağıda açıklandığı gibidir. Aklınıza gelebilecek bir soru, neden func_'yi işlev dosyasının başına eklediğimizdir. Bu kişisel bir tercihtir ve gerekli değildir. Bu teknik, modülün dizinlerinde hatalı komut dosyalarının nokta kaynaklı olmasını önlemek için kullanışlıdır. Bu tekniğin nasıl kullanılacağını modül yükleme dosyasında göreceksiniz.

Halk

  • func_New-TeamsMessage.ps1
  • func_Invoke-PowerAutomateFlow.ps1
  • func_Get-SharePointMember.ps1

Özel - Boş

  • UtilityModule.psd1
  • UtilityModule.psm1

Modül Oluşturma

Bir modül tanım dosyası oluşturmanın en hızlı yolu New-ModuleManifest komutudur. Aşağıda kullanışlı bir modül oluşturacak bir avuç parametre tanımlıyoruz. CompatiblePSEdition her ikisini de tanımlar Masaüstü ve Core. Komut bulma, FunctionsToExport parametresini doldurursanız çalışır.

$Params = @{ 
		"Path" 				= 'D:\WorkingFolder\Articles\UtilityModule.psd1' 
		"Author" 			= 'Fake Author' 
		"CompanyName" 			= 'Fake Company' 
		"RootModule" 			= 'UtilityModule.psm1' 
		"CompatiblePSEditions" 		= @('Desktop','Core') 
		"FunctionsToExport" 		= @('Get-SharePointMember','Invoke-PowerAutomateFlow','New-TeamsMessage') 
		"CmdletsToExport" 		= @() 
		"VariablesToExport" 		= '' 
		"AliasesToExport" 		= @() 
		"Description" = 'Utility Module' 
	} 
New-ModuleManifest @Params

Export-ModuleMember kullanarak işlevleri dışa aktarırız, ancak en iyi performans uygulamaları, modül tanımında boş dizilerin kullanılmasını zorunlu kılar. Bilinmeyen nedenlerden dolayı, boş bir dizi VariablesToExport altında doğru şekilde dışa aktarılmıyor, ancak boş bir dize boş bir dizi çıktısı veriyor.
New-ModuleManifest komutunu çalıştırmak bir < oluşturur.UtilityModule.psd1 dosyası. Birçok yorum bloğu ekstra yapılandırmalarla ilgilidir. Aşağıda, yapılandırılmış parametreleri göstermek için tüm ekstra yorumları kaldırdık.

UtilityModule.psd1

@{
	RootModule 		= 'UtilityModule.psm1' 
	ModuleVersion 		= '0.0.1' 
	CompatiblePSEditions 	= 'Desktop', 'Core' 
	GUID 			= 'dc18a919-f4bf-4da2-8c76-24b68fa33ef0' 
	Author 			= 'Fake Author' 
	CompanyName 		= 'Fake Company' 
	Copyright 		= '(c) Fake Author. All rights reserved.' 
	Description 		= 'UtilityModule'
	FunctionsToExport 	= 'Get-SharePointMember','Invoke-PowerAutomateFlow','New-TeamsMessage' 
	CmdletsToExport 	= @() 
	VariablesToExport 	= @() 
	AliasesToExport 	= @() 
	PrivateData 		= @{
	PSData 			= @{} 
	} 
}

Tüm modül işlevleri nokta kaynaklıysa neden dışa aktarılacak işlevleri listelememiz gerekiyor? Dışa aktarılan işlevlerin açıkça listelenmesinin iki temel nedeni vardır. Özel işlevler herkese açık hale getirilmemelidir ve dışa aktarılan işlevler, modül henüz yüklenmemiş olsa bile komut satırında otomatik olarak tamamlanacaktır.

Daha sonra modül yükleme dosyasını oluşturmamız gerekiyor. Yine, buna yaklaşmanın birkaç yolu vardır, ancak aşağıdaki yöntem güvenilir olmuştur. İlk bölüm yalnızca func_ öneki dosyalarını alacak ve bunları nokta kaynaklı olarak alacaktır. İkincisi, Public klasöründeki tüm işlevleri dışa aktaracaktır.

UtilityModule.psm1

Get-ChildItem (Split-Path $script:MyInvocation.MyCommand.Path) -Filter 'func_*.ps1' -Recurse | ForEach-Object { 
		. $_.FullName 
		} 
Get-ChildItem "$(Split-Path $script:MyInvocation.MyCommand.Path)\Public\*" -Filter 'func_*.ps1' -Recurse | ForEach-Object { 
		Export-ModuleMember -Function ($_.BaseName -Split "_")[1] 
		}

Fonksiyonlarımızı Oluşturmak

Modülü oluşturduktan sonra fonksiyonlarımızı tanımlamamız gerekiyor. Bu örnekte amaçlanan iş akışını destekleyen üç basit fonksiyon oluşturuyoruz.

Yeni Ekiplerin Mesajı

Bu işlev bir mesaj dizesi ve ekip kimliği dizesini alacak ve bir Teams mesajı oluşturmak için REST çağrısını oluşturacaktır. Bu, gerekli JSON biçimlendirmesini basitleştirilmiş bir API çağrısına sarar.

Function New-TeamsMessage { 
		[CmdletBinding()]
		Param( 
				[Parameter(Position = 0, Mandatory = $true)][String]$Message, 
				[Parameter(Position = 1, Mandatory = $true)][String]$Title, 
				[Parameter(Position = 2, Mandatory = $true)][String]$URI
		) 
		Process { 
				$Params = @{ 
						"URI" = 	$URI 
						"Method" = 	'POST' 
						"Body" = 	[PSCustomObject][Ordered]@{ 
									"@type" = 'MessageCard' 
									"@context" = 'http://schema.org/extension' 
									"summary" = $Title 
									"title" = $Title 
									"text" = ($Message | Out-String) 
								} 
						"ContentType" = 'application/json' 
						} 
				Invoke-RestMethod @Params | Out-Null 
		} 
	}

Invoke-PowerAutomateFlow

Daha sonra bir Power Automate Flow işlevi tanımlıyoruz. Bunu “HTTP isteği alındığında” HTTP tetikleyicisini kullanarak yapmanın basit bir yolu vardır. Bu, tetikleyiciyi çağırmak için kaydetme sırasında görüntülenen verilen URI'yi kullanır.

Function Invoke-PowerAutomateFlow { 
		[CmdletBinding()] 
		Param( 
				[Parameter(Position = 0, Mandatory = $true)][String]$URI 
				) 
				Process { 
					$Params = @{ 
							"URI" = $URI 
							"ContentType" = 'application/json' 
							"Method" = 'GET' 
					} 
					Invoke-WebRequest @Params 
				} 
}

Get-SharePointMember

Get-SharePointMember, SharePoint üye listesini alma konusundaki son iş akışı ihtiyacımızı destekler. Bu işlev, belirli bir site için tüm SharePoint sitesi üyelerini alır ve sonuçları görüntüler. Bir gruba katılmak sonuçları filtreleyecektir.

Function Get-SharePointMember { 
		[CmdletBinding()] 
		Param( 
				[Parameter(Position = 0, Mandatory = $true)][String]$URI, 
				[Parameter(Position = 1)][String]$Group 
		) 
		
		Process { 
				$Params = @{ 
						"URI" = $URI 
				} 
				If ($Group) { 
						Get-SPOUser @Params | Where-Object -Contains $Group 
				} Else { 
						Get-SPOUser @Params 
				} 
		} 
}

Modülü İçe Aktarma ve Test Etme

Import-Module komutunu kullanarak modülü içe aktarın ve herhangi bir hata olmadığını doğrulayın. Daha sonra, dışarı aktarılan tüm üyeleri görmek için Get-Command'ı kullanacağız.

Import-Module -Name 'UtilityModule' 
Get-Command -Module 'UtilityModule'

Test etmek için çeşitli komutları çalıştırın ve beklediğiniz gibi çalıştıklarından emin olun. Aşağıdaki komut dosyasında işlevleri çalıştırıyoruz ve çıktılarını kullanıyoruz.

# Get SharePoint Members 
$Members = Get-SharePointMember 
# Invoke 
Invoke-PowerAutomateFlow -URI 'https://...' 
New-TeamsMessage -Message $Groups -Title 'Group Members' -URI 'https://...'

Çözüm

PowerShell'de modül oluşturmak daha kolay olamazdı. Bir sistem yöneticisinin hayatını kolaylaştırmak için ortak işlevleri bir modülde bir araya getirin. Çok daha fazla işlevsellik mevcut ve bu eğitim yalnızca yüzeyi çiziyor. PowerShell modüllerinin sunduğu olanakları keşfetmek, daha kolay bir yönetim deneyiminin kilidini açacaktır!

İlgili makaleler