-
Notifications
You must be signed in to change notification settings - Fork 0
MS_PowerShellCmdlet
-
TOP > シェル > PowerShell
- PowerShell Module vs Snapin
- PowerShell Cmdletの作り方
cmdlet は自分で作成できます。
-
PowerShell で cmdlet が作れます。
-
PowerShell で作る場合は、PowerShell の関数を作成して、
.psm1ファイルに保存します。 -
使用するときは、
import-module .psm1ファイルのフルパスで読み込むと、関数を使用できます。 -
psm1の中では、既定では、全ての関数が使用できますが、
.psm1ファイルの内部関数を定義して、一部の関数のみ、使用可能とする場合には、- 使用可能にする関数名を
Export-ModuleMember -function 関数名の様にして列挙します。 - こうすると、
Export-ModuleMemberに指定されなかった関数が、内部関数とみなされます。
- 使用可能にする関数名を
補足(cmdlet らしく振る舞わせるには
CmdletBinding): 単にfunctionを書くだけでは
「関数」であって、cmdlet としての機能(共通パラメーター)は付かない。
[CmdletBinding()]を付けると、
-Verbose/-Debug/-ErrorAction/-WhatIf/-Confirmなどが
自動的に使えるようになる(Advanced Function)。function Remove-OldLog { [CmdletBinding(SupportsShouldProcess = $true)] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [string]$Path, [int]$Days = 30 ) process { Get-ChildItem $Path -Filter *.log | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$Days) } | ForEach-Object { if ($PSCmdlet.ShouldProcess($_.FullName, "削除")) { Remove-Item $_.FullName } } } }
SupportsShouldProcessとShouldProcessを実装しておくと、
-WhatIfで「何が起きるか」だけを確認できるようになる。
破壊的な運用スクリプトでは特に有用。
補足(命名は「動詞-名詞」に従う): PowerShell では
承認された動詞(Get-Verbで一覧できる)を使うのが規約である。
規約から外れた名前を付けると、Import-Module時に警告が出る。
本ページの参考にある
「PowerShell Cmdlet Design Guidelines」がこの点を扱っている。
補足(
.psm1と.psd1): 配布を考えるなら、
.psm1(実装)とあわせて.psd1(モジュール マニフェスト) を用意する。New-ModuleManifest -Path .\MyTools.psd1 -RootModule MyTools.psm1 ` -ModuleVersion '1.0.0' -FunctionsToExport 'Remove-OldLog'バージョン、依存モジュール、公開する関数などを宣言でき、
PowerShell ギャラリーへの公開にも必要になる
(→ PowerShell Module vs Snapin)。
- C# で cmdlet を開発することも出来ます。
-
System.Management.Automation.PSCmdletクラスから派生するクラスを作成します。
補足(PowerShell 実装と C# 実装の使い分け)
PowerShell( .psm1)C#( PSCmdlet派生)開発コスト 低い(テキスト エディタで済む) 高い(ビルドが要る) 性能 劣る 優れる 型の扱い 動的 静的(コンパイル時に検査) 配布 ファイル コピー DLL の配布(プラットフォーム依存に注意) 向く用途 運用スクリプト、社内ツール 製品同梱、性能が要る処理 大半の用途では PowerShell 実装で足りる。
C# 実装が要るのは、既存の .NET ライブラリを厚くラップする場合や、
大量データを高速に処理する場合になる。なお、PowerShell Core 以降で使う C# 製 cmdlet は、
.NET Standard 2.0 をターゲットにすると
Windows PowerShell 5.1 と PowerShell 7 の両方で動かせる。
- PowerShell Cmdlet Design Guidelines · Azure/azure-powershell Wiki
https://github.com/Azure/azure-powershell/wiki/PowerShell-Cmdlet-Design-Guidelines
- Windows PowerShell: スクリプトを簡単に共有できるようになりました
http://technet.microsoft.com/ja-jp/magazine/ff625835.aspx - Windows PowerShell: スクリプトでコマンドレットを記述する
http://technet.microsoft.com/ja-jp/magazine/ff677563.aspx - Windows PowerShell: Writing Cmdlets in Script
http://technet.microsoft.com/en-us/magazine/ff677563.aspx
-
Windows PowerShell コマンドレットの作成
http://msdn.microsoft.com/ja-jp/events/dd297528.aspx -
Developing with Windows PowerShell
http://msdn.microsoft.com/en-us/library/cc303698.aspx -
C#と諸々 コマンドレットの作成方法
http://csharper.blog57.fc2.com/blog-entry-55.html -
PowerShell Cmdlet を人道的に使いたいから頑張ってみるお話 - tech.guitarrapc.cóm
http://tech.guitarrapc.com/entry/2015/12/25/233000
Tags: シェル, インフラストラクチャ, Windows
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。