about_Splatting

簡単な説明

スプラッティングを使用して PowerShell のコマンドにパラメーターを渡す方法について説明します。

詳細な説明

Splatting は、パラメーター値のコレクションを単位としてコマンドに渡す方法です。 PowerShell は、コレクション内の各値をコマンド パラメーターに関連付けます。 Splatted パラメーター値は、標準変数のように見える名前付きスプラッティング変数に格納されますが、ドル記号$ () ではなく At 記号 (@) で始まります。 At 記号は、1 つの値ではなく値のコレクションを渡すことを PowerShell に通知します。

スプラッティングを使用すると、コマンドが短くなり、読みやすくなります。 異なるコマンド呼び出しでスプラッティング値を再利用し、スプラッティングを使用して自動変数から他の $PSBoundParameters スクリプトや関数にパラメーター値を渡すことができます。

Windows PowerShell 3.0 以降では、スプラッティングを使用してコマンドのすべてのパラメーターを表すこともできます。

構文

<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>

パラメーター名が不要な位置指定パラメーターにパラメーター値を指定するには、配列構文を使用します。 パラメーター名と値のペアを指定するには、ハッシュ テーブル構文を使用します。 スプラッティングされた値は、パラメーター リストの任意の場所に表示できます。

スプラッティング時に、ハッシュ テーブルまたは配列を使用してすべてのパラメーターを渡す必要はありません。 一部のパラメーターは、スプラッティングを使用して渡し、他のパラメーターを位置またはパラメーター名で渡すことができます。 また、パラメーターごとに複数の値を渡さないように、1 つのコマンドで複数のオブジェクトをスプラッタすることもできます。

PowerShell 7.1 以降では、コマンドでパラメーターを明示的に定義することで、splatted パラメーターをオーバーライドできます。

ハッシュ テーブルを使用したスプラッティング

ハッシュ テーブルを使用して、パラメーター名と値のペアをスプラトします。 この形式は、位置指定パラメーターやスイッチ パラメーターを含むすべてのパラメーター型に使用できます。 位置指定パラメーターは名前で割り当てる必要があります。

次の例では、Test.txt ファイルを同じディレクトリ内のTest2.txt ファイルにコピーする 2 つの Copy-Item コマンドを比較します。

最初の例では、パラメーター名が含まれる従来の形式を使用します。

Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf

2 番目の例では、ハッシュ テーブルのスプラッティングを使用します。 最初のコマンドは、パラメーター名とパラメーターと値のペアのハッシュ テーブルを作成し、変数に $HashArguments 格納します。 2 番目のコマンドでは、 $HashArguments スプラッティングを使用してコマンド内の変数を使用します。 At 記号 (@HashArguments) は、コマンドのドル記号 ($HashArguments) を置き換えます。

WhatIf スイッチ パラメーターの値を指定するには、次を使用$Trueします$False

$HashArguments = @{
  Path = "test.txt"
  Destination = "test2.txt"
  WhatIf = $true
}
Copy-Item @HashArguments

Note

最初のコマンドでは、At 記号 (@) は、スプラッティングされた値ではなくハッシュ テーブルを示します。 PowerShell のハッシュ テーブルの構文は次のとおりです。 @{<name>=<value>; <name>=<value>; ...}

配列を使用したスプラッティング

位置指定パラメーターの値をスプラッタするには、配列を使用します。パラメーター名は必要ありません。 値は配列内の位置番号の順序で指定する必要があります。

次の例では、Test.txt ファイルを同じディレクトリ内のTest2.txt ファイルにコピーする 2 つの Copy-Item コマンドを比較します。

最初の例では、パラメーター名を省略する従来の形式を使用します。 パラメーター値は、コマンドの位置順に表示されます。

Copy-Item "test.txt" "test2.txt" -WhatIf

2 番目の例では、配列スプラッティングを使用します。 最初のコマンドは、パラメーター値の配列を作成し、変数に $ArrayArguments 格納します。 値は配列内の位置順です。 2 番目のコマンドでは、 $ArrayArguments スプラッティングのコマンドで変数を使用します。 At 記号 (@ArrayArguments) は、コマンドのドル記号 ($ArrayArguments) を置き換えます。

$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf

ArgumentList パラメーターの使用

いくつかのコマンドレットには、 コマンドレットによって実行されるスクリプト ブロックにパラメーター値を渡すために使用される ArgumentList パラメーターがあります。 ArgumentList パラメーターは、スクリプト ブロックに渡される値の配列を受け取ります。 PowerShell では、配列スプラッティングを効果的に使用して、スクリプト ブロックのパラメーターに値をバインドします。 ArgumentList を使用する場合、1 つのパラメーターにバインドされた単一のオブジェクトとして配列を渡す必要がある場合は、配列を別の配列の唯一の要素としてラップする必要があります。

次の例には、文字列の配列である 1 つのパラメーターを受け取るスクリプト ブロックがあります。

$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
  } -ArgumentList $array

この例では、最初の $array 項目のみがスクリプト ブロックに渡されます。

Hello
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
} -ArgumentList (,$array)

この例では、 $array 配列全体が 1 つのオブジェクトとしてスクリプト ブロックに渡されるように配列にラップされています。

Hello World!

例 1: さまざまなコマンドでスプラッティングされたパラメーターを再利用する

この例では、さまざまなコマンドでスプラッティングされた値を再利用する方法を示します。 この例のコマンドでは、コマンドレットを Write-Host 使用してホスト プログラム コンソールにメッセージを書き込みます。 スプラッティングを使用して、前景色と背景色を指定します。

すべてのコマンドの色を変更するには、変数の値を $Colors 変更するだけです。

最初のコマンドは、パラメーター名と値のハッシュ テーブルを作成し、そのハッシュ テーブルを変数に $Colors 格納します。

$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}

2 番目と 3 番目の $Colors コマンドでは、コマンドのスプラッティングに変数を Write-Host 使用します。 を $Colors variable使用するには、ドル記号 ($Colors) を At 記号 (@Colors) に置き換えます。

#Write a message with the colors in $Colors
Write-Host "This is a test." @Colors

#Write second message with same colors. The position of splatted
#hash table does not matter.
Write-Host @Colors "This is another test."

例 2: $PSBoundParametersを使用してパラメーターを転送する

この例では、スプラッティングと自動変数を使用して、パラメーターを他のコマンドに転送する方法を $PSBoundParameters 示します。

$PSBoundParameters自動変数は、スクリプトまたは関数の実行時に使用されるすべてのパラメーター名と値を含むディクショナリ オブジェクト (System.Collections.Generic.Dictionary) です。

次の例では、変数を $PSBoundParameters 使用して、スクリプトまたは関数に渡されたパラメーター値を関数から Test2 関数に Test1 転送します。 両方ともスプラッティングを Test1 使用して Test2 関数を呼び出します。

function Test1
{
    param($a, $b, $c)

    "a = $a"
    "b = $b"
    "c = $c"
}

function Test2
{
    param($a, $b, $c)

    #Call the Test1 function with $a, $b, and $c.
    Test1 @PSBoundParameters

    #Call the Test1 function with $b and $c, but not with $a
    Test1 -b $PSBoundParameters.b -c $PSBoundParameters.c
}

Test2 -a 1 -b 2 -c 3
a = 1
b = 2
c = 3
a =
b = 2
c = 3

例 3: 明示的に定義されたパラメーターを使用して splatted パラメーターをオーバーライドする

この例では、明示的に定義されたパラメーターを使用して、splatted パラメーターをオーバーライドする方法を示します。 これは、新しいハッシュテーブルを作成したり、splat に使用しているハッシュテーブルの値を変更したりする必要がない場合に便利です。

この変数には $commonParams 、場所に仮想マシンを作成するためのパラメーターが East US 格納されます。 変数は $allVms 、作成する仮想マシンの一覧です。 一覧をループ処理し、各仮想マシンを作成するためにパラメーターをスプラッタするために使用 $commonParams します。 ただし、他の仮想マシンとは異なるリージョンに作成する必要 myVM2 があります。 ハッシュテーブルを$commonParams調整する代わりに、Location パラメーターNew-AzVm明示的に定義して、キー$commonParamsLocation値を置き換えることができます。

$commonParams = @{
    ResourceGroupName = "myResourceGroup"
    Location = "East US"
    VirtualNetworkName = "myVnet"
    SubnetName = "mySubnet"
    SecurityGroupName = "myNetworkSecurityGroup"
    PublicIpAddressName = "myPublicIpAddress"
}

$allVms = @('myVM1','myVM2','myVM3',)

foreach ($vm in $allVms)
{
    if ($vm -eq 'myVM2')
    {
        New-AzVm @commonParams -Name $vm -Location "West US"
    }
    else
    {
        New-AzVm @commonParams -Name $vm
    }
}

例 4: 1 つのコマンドで複数のスプラッタされたオブジェクトを使用する

1 つのコマンドで複数のスプラッティングオブジェクトを使用できます。 この例では、異なるパラメーターが個別のハッシュテーブルで定義されています。 ハッシュテーブルは、1 つの Write-Host コマンドでスプラッティングされます。

$a = @{
    Message         = 'Hello', 'World!'
}
$b = @{
    Separator       = '|'
}
$c = @{
    BackgroundColor = 'Cyan'
    ForegroundColor = 'Black'
}
Write-Host @a @b @c

Splatting コマンド パラメーター

スプラッティングを使用して、コマンドのパラメーターを表すことができます。 この手法は、プロキシ関数、つまり別のコマンドを呼び出す関数を作成する場合に便利です。 この機能は、Windows PowerShell 3.0 で導入されています。

コマンドのパラメーターをスプラットするには、コマンド パラメーターを表すために使用 @Args します。 この手法は、コマンド パラメーターを列挙するよりも簡単で、呼び出されたコマンドのパラメーターが変更された場合でもリビジョンなしで動作します。

この機能では、割り当てられていないすべてのパラメーター値を含む自動変数が使用 $Args されます。

たとえば、次の関数はコマンドレットを Get-Process 呼び出します。 この関数では、 @Args コマンドレットのすべてのパラメーターを Get-Process 表します。

function Get-MyProcess { Get-Process @Args }

この関数を使用すると、次の Get-MyProcess コマンドに示すように、割り当てられていないすべてのパラメーターとパラメーター値が渡されます @Args

Get-MyProcess -Name PowerShell
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    463      46   225484     237196   719    15.86   3228 powershell
Get-MyProcess -Name PowerShell_Ise -FileVersionInfo
ProductVersion   FileVersion      FileName
--------------   -----------      --------
6.2.9200.16384   6.2.9200.1638... C:\Windows\system32\WindowsPowerShell\...

明示的に宣言されたパラメーターを持つ関数で使用 @Args できます。 関数では複数回使用できますが、次の例に示すように、入力したすべてのパラメーターがすべてのインスタンス @Argsに渡されます。

function Get-MyCommand
{
    Param ([switch]$P, [switch]$C)
    if ($P) { Get-Process @Args }
    if ($C) { Get-Command @Args }
}

Get-MyCommand -P -C -Name PowerShell
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     50   112.76      78.52      16.64    6880   1 powershell

Path               : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Extension          : .exe
Definition         : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Source             : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Version            : 10.0.22621.3085
Visibility         : Public
OutputType         : {System.String}
Name               : powershell.exe
CommandType        : Application
ModuleName         :
Module             :
RemotingCapability : PowerShell
Parameters         :
ParameterSets      :
HelpUri            :
FileVersionInfo    : File:             C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
                     InternalName:     POWERSHELL
                     OriginalFilename: PowerShell.EXE.MUI
                     FileVersion:      10.0.22621.1 (WinBuild.160101.0800)
                     FileDescription:  Windows PowerShell
                     Product:          Microsoft&reg; Windows&reg; Operating System
                     ProductVersion:   10.0.22621.1
                     Debug:            False
                     Patched:          False
                     PreRelease:       False
                     PrivateBuild:     False
                     SpecialBuild:     False
                     Language:         English (United States)

メモ

CmdletBinding 属性または Parameter 属性を使用して関数を高度な関数にした場合、$args関数で自動変数を使用できなくなります。 高度な関数には、明示的なパラメーター定義が必要です。

PowerShell Desired State Configuration (DSC) は、スプラッティングを使用するように設計されていません。 スプラッティングを使用して DSC リソースに値を渡すことはできません。 詳細については、GaelOlas の記事 「疑似スプラッティング DSC リソース」を参照してください。

関連項目