Share via


about_Functions

簡単な説明

PowerShell で関数を作成して使用する方法について説明します。

長い説明

関数は、割り当てる名前を持つ PowerShell ステートメントの一覧です。 関数を実行するときは、関数名を入力します。 リスト内のステートメントは、コマンド プロンプトで入力したかのように実行されます。

関数は次のように簡単です。

function Get-PowerShellProcess { Get-Process PowerShell }

関数は、コマンドレットやアプリケーション プログラムと同じくらい複雑な場合もあります。

コマンドレットと同様に、関数にはパラメーターを指定できます。 パラメーターには、名前、位置、スイッチ、または動的パラメーターを指定できます。 関数パラメーターは、コマンド ラインまたはパイプラインから読み取ることができます。

関数は、表示したり、変数に割り当てたり、他の関数やコマンドレットに渡したりできる値を返すことができます。 キーワード (keyword)を使用して戻り値をreturn指定することもできます。 キーワード (keyword)はreturn、関数から返される他の出力に影響を与えたり抑制したりすることはありません。 ただし、returnキーワード (keyword)はその行で関数を終了します。 詳細については、「 about_Return」を参照してください。

関数のステートメント リストには、キーワード BeginProcess、および Endを含むさまざまな種類のステートメント リストを含めることができます。 これらのステートメントの一覧では、パイプラインからの入力を異なる方法で処理します。

フィルターは、キーワード (keyword)を使用する特別な種類のFilter関数です。

関数はコマンドレットのように動作することもできます。 プログラミングを使用せずにコマンドレットと同じように動作する関数を C# 作成できます。 詳細については、「 about_Functions_Advanced」を参照してください。

重要

スクリプト ファイルとスクリプト ベースのモジュール内では、関数を呼び出す前に定義する必要があります。

構文

関数の構文を次に示します。

function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])]
{
  begin {<statement list>}
  process {<statement list>}
  end {<statement list>}
}
function [<scope:>]<name>
{
  param([type]$parameter1 [,[type]$parameter2])
  dynamicparam {<statement list>}
  begin {<statement list>}
  process {<statement list>}
  end {<statement list>}
}

関数には、次の項目が含まれます。

  • Function キーワード (keyword)
  • スコープ (省略可能)
  • 選択した名前
  • 任意の数の名前付きパラメーター (省略可能)
  • 中かっこで囲まれた 1 つ以上の PowerShell コマンド {}

関数のDynamicparamキーワード (keyword)パラメーターと動的パラメーターの詳細については、「about_Functions_Advanced_Parameters」を参照してください。

単純な関数

関数が役に立つには複雑である必要はありません。 最も単純な関数の形式は次のとおりです。

function <function-name> {statements}

たとえば、次の関数は、管理者として実行オプションを使用して PowerShell を起動します。

function Start-PSAdmin {Start-Process PowerShell -Verb RunAs}

関数を使用するには、次のように入力します。 Start-PSAdmin

関数にステートメントを追加するには、各ステートメントを個別の行に入力するか、セミコロン ; を使用してステートメントを区切ります。

たとえば、次の関数は、開始日より後に変更された現在のユーザーのディレクトリ内のすべての .jpg ファイルを検索します。

function Get-NewPix
{
  $start = Get-Date -Month 1 -Day 1 -Year 2010
  $allpix = Get-ChildItem -Path $env:UserProfile\*.jpg -Recurse
  $allpix | Where-Object {$_.LastWriteTime -gt $Start}
}

便利な小さな関数のツールボックスを作成できます。 これらの関数を PowerShell プロファイルに追加します (このトピックの about_Profiles 以降で説明します)。

関数名

関数には任意の名前を割り当てることができますが、他のユーザーと共有する関数は、すべての PowerShell コマンドに対して確立されている名前付け規則に従う必要があります。

関数名は動詞と名詞のペアで構成する必要があります。動詞は関数が実行するアクションを識別し、名詞はコマンドレットがアクションを実行する項目を識別します。

関数では、すべての PowerShell コマンドに対して承認されている標準動詞を使用する必要があります。 これらの動詞は、コマンド名をシンプルで一貫性があり、ユーザーが理解しやすくするのに役立ちます。

標準の PowerShell 動詞の詳細については、Microsoft Docsの承認済み動詞に関するページを参照してください。

パラメーターを持つ関数

名前付きパラメーター、位置パラメーター、スイッチ パラメーター、動的パラメーターなど、関数でパラメーターを使用できます。 関数の動的パラメーターの詳細については、「 about_Functions_Advanced_Parameters」を参照してください。

名前付きパラメーター

任意の数の名前付きパラメーターを定義できます。 このトピックで後述するように、名前付きパラメーターの既定値を含めることができます。

次のサンプル構文に示すように、キーワード (keyword)をparam使用して中かっこ内のパラメーターを定義できます。

function <name> {
  param ([type]$parameter1 [,[type]$parameter2])
  <statement list>
}

次のサンプル構文に示すように、キーワード (keyword)を使用せずにParam中かっこの外側にパラメーターを定義することもできます。

function <name> [([type]$parameter1[,[type]$parameter2])] {
  <statement list>
}

この代替構文の例を次に示します。

function Add-Numbers([int]$one, [int]$two) {
    $one + $two
}

1 つ目の方法が推奨されますが、これら 2 つの方法に違いはありません。

関数を実行すると、パラメーターに指定した値が、パラメーター名を含む変数に割り当てられます。 その変数の値は、 関数で使用できます。

次の例は、 という関数 Get-SmallFilesです。 この関数には パラメーターがあります $Size 。 関数は、 パラメーターの値 $Size より小さいすべてのファイルを表示し、ディレクトリを除外します。

function Get-SmallFiles {
  Param($Size)
  Get-ChildItem $HOME | Where-Object {
    $_.Length -lt $Size -and !$_.PSIsContainer
  }
}

関数では、 変数を $Size 使用できます。これは、 パラメーターに定義されている名前です。

この関数を使用するには、次のコマンドを入力します。

Get-SmallFiles -Size 50

パラメーター名を指定せずに名前付きパラメーターの値を入力することもできます。 たとえば、次のコマンドでは、 Size パラメーターに名前を付けるコマンドと同じ結果が得られます。

Get-SmallFiles 50

パラメーターの既定値を定義するには、次の例に示すように、パラメーター名の後に等号と値を Get-SmallFiles 入力します。

function Get-SmallFiles ($Size = 100) {
  Get-ChildItem $HOME | Where-Object {
    $_.Length -lt $Size -and !$_.PSIsContainer
  }
}

値を指定せずに入力 Get-SmallFiles した場合、関数は に 100 を $size割り当てます。 値を指定すると、関数はその値を使用します。

必要に応じて、パラメーターの説明に PSDefaultValue 属性を追加し、PSDefaultValue の Help プロパティを指定することで、パラメーターの既定値を説明する簡単なヘルプ文字列を指定できます。 関数の Size パラメーターの既定値 (100) を説明するヘルプ文字列を Get-SmallFiles 指定するには、次の例に示すように PSDefaultValue 属性を追加します。

function Get-SmallFiles {
  param (
      [PSDefaultValue(Help = '100')]
      $Size = 100
  )
}

PSDefaultValue 属性クラスの詳細については、「PSDefaultValue 属性メンバー」を参照してください。

位置指定パラメーター

位置指定パラメーターは、パラメーター名のないパラメーターです。 PowerShell では、パラメーター値の順序を使用して、各パラメーター値を関数のパラメーターに関連付けます。

位置指定パラメーターを使用する場合は、関数名の後に 1 つ以上の値を入力します。 位置指定パラメーター値が配列変数に $args 割り当てられます。 関数名の後の値は、$args[0]配列内の最初の位置 () に$args割り当てられます。

Get-Extension の関数は、指定した .txt ファイル名にファイル名拡張子を追加します。

function Get-Extension {
  $name = $args[0] + ".txt"
  $name
}
Get-Extension myTextFile
myTextFile.txt

パラメーターの切り替え

スイッチは、値を必要としないパラメーターです。 代わりに、関数名の後に switch パラメーターの名前を入力します。

switch パラメーターを定義するには、次の例に示すように、パラメーター名の前に型 [switch] を指定します。

function Switch-Item {
  param ([switch]$on)
  if ($on) { "Switch on" }
  else { "Switch off" }
}

関数名の後に On switch パラメーターを入力すると、関数に "スイッチオン" と表示されます。 switch パラメーターを指定しない場合は、"スイッチオフ" と表示されます。

Switch-Item -on
Switch on
Switch-Item
Switch off

の例 に示すように、関数の実行時にブール値をスイッチに割り当てることもできます。

Switch-Item -on:$true
Switch on
Switch-Item -on:$false
Switch off

Splatting を使用してコマンド パラメーターを表す

スプラッティングを使用して、コマンドのパラメーターを表すことができます。 この機能は、Windows PowerShell 3.0 で導入されています。

この手法は、セッションでコマンドを呼び出す関数で使用します。 コマンド パラメーターを宣言または列挙したり、コマンド パラメーターが変更されたときに関数を変更したりする必要はありません。

次のサンプル関数は、 コマンドレットを Get-Command 呼び出します。 コマンドは、 を使用 @Args して の Get-Commandパラメーターを表します。

function Get-MyCommand { Get-Command @Args }

関数を呼び出すときは、 のすべてのパラメーター Get-CommandGet-MyCommand 使用できます。 パラメーターとパラメーター値は、 を使用して @Argsコマンドに渡されます。

Get-MyCommand -Name Get-ChildItem
CommandType     Name                ModuleName
-----------     ----                ----------
Cmdlet          Get-ChildItem       Microsoft.PowerShell.Management

この機能では @Args$Args 宣言されていないコマンドレット パラメーターと残りの引数からの値を表す自動パラメーターが使用されます。

スプラッティングの詳細については、「 about_Splatting」を参照してください。

関数へのオブジェクトのパイプ処理

任意の関数がパイプラインから入力を受け取ることができます。 、、および キーワードを使用してBeginProcess、関数がパイプラインからの入力を処理する方法をEnd制御できます。 次のサンプル構文は、3 つのキーワードを示しています。

function <name> {
  begin {<statement list>}
  process {<statement list>}
  end {<statement list>}
}

ステートメント リストは Begin 、関数の先頭で 1 回だけ実行されます。

重要

関数で 、 Process または End ブロックをBegin定義する場合は、すべてのコードがそれらのブロック内に存在する必要があります。 ブロックのいずれかが定義されている場合、ブロックの外部ではコードは認識されません。

ステートメント リストは Process 、パイプライン内のオブジェクトごとに 1 回実行されます。 ブロックの Process 実行中は、各パイプライン オブジェクトが自動変数 (一度に $_ 1 つのパイプライン オブジェクト) に割り当てられます。

関数がパイプライン内のすべてのオブジェクトを受け取った後、ステートメント リストは End 1 回実行されます。 キーワード、Process、または End キーワードが使用されていないBegin場合、すべてのステートメントはステートメント リストのようにEnd扱われます。

次の関数では、キーワード (keyword)をProcess使用します。 関数には、パイプラインの例が表示されます。

function Get-Pipeline
{
  process {"The value is: $_"}
}

この関数を示すには、次の例に示すように、コンマで区切られた数値の一覧を入力します。

1,2,4 | Get-Pipeline
The value is: 1
The value is: 2
The value is: 4

パイプラインで関数を使用すると、関数にパイプされたオブジェクトが自動変数に $input 割り当てられます。 関数は、パイプラインからオブジェクトが取得される前にBegin、キーワード (keyword)を使用してステートメントを実行します。 関数は、パイプラインからすべてのオブジェクトをEnd受信した後、キーワード (keyword)を使用してステートメントを実行します。

次の例は、 と キーワードを含む$input自動変数をBeginEnd示しています。

function Get-PipelineBeginEnd
{
  begin {"Begin: The input is $input"}
  end {"End:   The input is $input" }
}

パイプラインを使用してこの関数を実行すると、次の結果が表示されます。

1,2,4 | Get-PipelineBeginEnd
Begin: The input is
End:   The input is 1 2 4

ステートメントを Begin 実行すると、関数にはパイプラインからの入力がありません。 ステートメントは End 、関数に値が設定された後に実行されます。

関数にキーワード (keyword)があるProcess場合、 内の$input各オブジェクトは から$input削除され、 に$_割り当てられます。 次の例には、ステートメント リストがあります Process

function Get-PipelineInput
{
  process {"Processing:  $_ " }
  end {"End:   The input is: $input" }
}

この例では、関数にパイプされた各オブジェクトがステートメント リストに Process 送信されます。 ステートメントは Process 、各オブジェクトで一度に 1 つのオブジェクトで実行されます。 関数が$inputキーワード (keyword)に達Endすると、自動変数は空になります。

1,2,4 | Get-PipelineInput
Processing:  1
Processing:  2
Processing:  4
End:   The input is:

詳細については、「列挙子の使用」を参照してください。

フィルター

フィルターは、パイプライン内の各オブジェクトで実行される関数の一種です。 フィルターは、ブロック内のすべてのステートメントを含む関数に Process 似ています。

フィルターの構文は次のとおりです。

filter [<scope:>]<name> {<statement list>}

次のフィルターは、パイプラインからログ エントリを取得し、エントリ全体またはエントリのメッセージ部分のみを表示します。

filter Get-ErrorLog ([switch]$message)
{
  if ($message) { Out-Host -InputObject $_.Message }
  else { $_ }
}

関数スコープ

関数は、作成されたスコープに存在します。

関数がスクリプトの一部である場合、その関数はそのスクリプト内のステートメントで使用できます。 既定では、スクリプト内の関数はコマンド プロンプトでは使用できません。

関数のスコープを指定できます。 たとえば、次の例では、 関数がグローバル スコープに追加されます。

function global:Get-DependentSvs {
  Get-Service | Where-Object {$_.DependentServices}
}

関数がグローバル スコープ内にある場合は、スクリプト、関数、コマンド ラインで 関数を使用できます。

関数は通常、スコープを作成します。 変数などの関数で作成された項目は、関数スコープにのみ存在します。

PowerShell のスコープの詳細については、「 about_Scopes」を参照してください。

関数を使用した関数の検索と管理: ドライブ

PowerShell のすべての関数とフィルターは、ドライブに自動的に Function: 格納されます。 このドライブは、PowerShell 関数 プロバイダーによって公開されます。

ドライブをFunction:参照する場合は、コンピューターの または D ドライブを参照Cする場合と同様に、Function の後にコロンを入力します。

次のコマンドは、PowerShell の現在のセッション内のすべての関数を表示します。

Get-ChildItem function:

関数内のコマンドは、関数の definition プロパティにスクリプト ブロックとして格納されます。 たとえば、PowerShell に付属するヘルプ関数にコマンドを表示するには、次のように入力します。

(Get-ChildItem function:help).Definition

次の構文を使用することもできます。

$function:help

ドライブの Function: 詳細については、 関数 プロバイダーのヘルプ トピックを参照してください。 「Get-Help Function.

新しいセッションでの関数の再利用

PowerShell コマンド プロンプトで関数を入力すると、関数は現在のセッションの一部になります。 セッションが終了するまで使用できます。

すべての PowerShell セッションで関数を使用するには、関数を PowerShell プロファイルに追加します。 プロファイルの詳細については、「about_Profiles」を参照してください。

関数を PowerShell スクリプト ファイルに保存することもできます。 テキスト ファイルに関数を入力し、ファイル名拡張子を持つファイルを .ps1 保存します。

関数のヘルプを記述する

コマンドレットは Get-Help 、関数、およびコマンドレット、プロバイダー、スクリプトのヘルプを取得します。 関数のヘルプを表示するには、「」と入力し、その後に関数名を入力 Get-Help します。

たとえば、関数のヘルプを表示するには、次のように Get-MyDisks 入力します。

Get-Help Get-MyDisks

次の 2 つの方法のいずれかを使用して、関数のヘルプを記述できます。

  • 関数の Comment-Based ヘルプ

    コメントで特別なキーワードを使用して、ヘルプ トピックをCreateします。 関数のコメントベースのヘルプを作成するには、コメントを関数本体の先頭または末尾、または関数のキーワード (keyword)の前の行に配置する必要があります。 コメントベースのヘルプの詳細については、「 about_Comment_Based_Help」を参照してください。

  • 関数の XML-Based ヘルプ

    通常コマンドレット用に作成される型など、XML ベースのヘルプ トピックをCreateします。 ヘルプ トピックを複数の言語にローカライズする場合は、XML ベースのヘルプが必要です。

    関数を XML ベースのヘルプ トピックに関連付けるには、コメントベースの.ExternalHelpヘルプ キーワード (keyword)を使用します。 このキーワード (keyword)がないと、関数ヘルプ トピックが見つからず、Get-Help関数の をGet-Help呼び出しても自動生成されたヘルプのみが返されます。

    キーワード (keyword)のExternalHelp詳細については、「about_Comment_Based_Help」を参照してください。 XML ベースのヘルプの詳細については、「コマンドレットヘルプ を記述する方法」を参照してください。

こちらもご覧ください