Skip to content

MS_PowerShellCmdlet

nishi_74322014 edited this page Aug 31, 2026 · 1 revision

PowerShell Cmdletの作り方

概要

cmdlet は自分で作成できます。

PowerShell

  • 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
        }
      }
  }
}

SupportsShouldProcessShouldProcess を実装しておくと、
-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)。

System.Management.Automation.PSCmdlet

  • 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

System.Management.Automation.PSCmdlet

本 Wiki 内


Tags: シェル, インフラストラクチャ, Windows

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally