PowerShell のスプラッティングとハッシュテーブル値

最終更新: 2021-12-04 17:34:29 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

PowerShell のスプラッティングは、ハッシュテーブルまたは配列を名前付き引数または位置引数として渡します。 長いパラメーターリストの繰り返しを避け、設定をコマンド呼び出しから分離できます。

PowerShell コマンドのスプラッティング #

呼び出し箇所で、ハッシュテーブル変数に @ を付けます。

powershell
$request = @{
    Uri         = 'https://api.example.test/items'
    Method      = 'Get'
    Headers     = @{ Accept = 'application/json' }
    TimeoutSec  = 30
}

Invoke-RestMethod @request

ハッシュテーブルのキーは、サポートされているエイリアスを含め、パラメーター名と一致している必要があります。スプラッティングは任意の文字列をシェル構文に展開するものではありません。PowerShell は結果の値を、型付きのコマンド引数としてバインドします。

PowerShell 7.1 以降では、明示的に記述した名前付きパラメーターによって、スプラッティングされたハッシュテーブル内の同じパラメーターを上書きできます。以前の PowerShell リリースでは、代わりに重複バインドとして報告されるため、複数バージョンに対応するスクリプトでは、呼び出し前にハッシュテーブルのコピーを更新する必要があります。

powershell
$effective = $request.Clone()
$effective.TimeoutSec = 60
Invoke-RestMethod @effective

配列では位置指定のスプラッティングを使用できます。

powershell
$copyArgs = @('source.txt', 'destination.txt')
Copy-Item @copyArgs

外部プログラムと補間 #

ネイティブ実行可能ファイルには、PowerShell のパラメーター バインディングではなく文字列が渡されます。補間された文字列内のハッシュテーブル プロパティには、サブ式が必要です。

powershell
$config = @{
    AppId     = 'example-id'
    GroupCode = 'workers'
}

& $connector `
    "--app-id=$($config.AppId)" `
    "--group-code=$($config.GroupCode)"

"--app-id=$config.AppId" は $config を展開し、.AppId をリテラルテキストとして残します。その結果、ハッシュテーブルの文字列表現で始まる値が生成されます。$($config.AppId) は補間前にメンバーアクセスを評価します。

実行可能ファイルにオプションのフラグがある場合は、引数配列を構築します。

powershell
$arguments = @(
    '--server-mode=http'
    '--threads=10'
    "--app-id=$($config.AppId)"
)

& $connector @arguments
if ($LASTEXITCODE -ne 0) {
    throw "Connector failed with exit code $LASTEXITCODE"
}

呼び出し演算子の後にある配列スプラットは、配列要素ごとに 1 つの引数を渡します。1 つのコマンド文字列を構築して Invoke-Expression に渡す方法は避けてください。引数配列は境界を保持し、追加の解析手順を不要にします。

Windows では、PowerShell 7.3 において $PSNativeCommandArgumentPassing によるネイティブ引数の受け渡しが変更されました。Standard、Windows、Legacy モードは、エンジンがネイティブ コマンドラインを構築する方法を制御します。Unix 系システムでは引数ベクトルが渡されますが、Windows プログラムは独自のコマンドライン パーサーを適用する場合があります。コマンドを手動でシリアライズするのではなく、対象の PowerShell バージョンと実行可能ファイルのバージョンに対して、空文字列、埋め込み引用符、末尾のバックスラッシュをテストしてください。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)