14

.exe のラッパーである PowerShell スクリプトを作成しています。オプションのスクリプト パラメータをいくつか用意し、残りを exe に直接渡したいと考えています。テストスクリプトは次のとおりです。

param (
    [Parameter(Mandatory=$False)] [string] $a = "DefaultA"
   ,[parameter(ValueFromRemainingArguments=$true)][string[]]$ExeParams   # must be string[] - otherwise .exe invocation will quote
)

Write-Output ("a=" + ($a) + "  ExeParams:") $ExeParams

名前付きパラメーターを使用して実行すると、すべてがうまくいきます。

C:\ > powershell /command \temp\a.ps1 -a A This-should-go-to-exeparams This-also
a=A  ExeParams:
This-should-go-to-exeparams
This-also

ただし、パラメーターを省略しようとすると、名前のない最初のパラメーターが割り当てられます。

C:\ > powershell /command \temp\a.ps1 This-should-go-to-exeparams This-also
a=This-should-go-to-exeparams  ExeParams:
This-also

私は期待します:

a=DefaultA ExeParams:
This-should-go-to-exeparams
This-also

パラメータに追加しようとしPosition=0ましたが、同じ結果が得られます。

これを達成する方法はありますか?
多分別のパラメータスキーム?

4

2 に答える 2

9

デフォルトでは、すべての関数パラメーターは定位置です。Windows PowerShell は、関数内でパラメーターが宣言されている順序でパラメーターに位置番号を割り当てます。この機能を無効にするには、属性のPositionalBinding引数の値を に設定します。CmdletBinding$False

PowerShell で位置パラメーターのバインドを無効にする方法をご覧ください

function Test-PositionalBinding
{
    [CmdletBinding(PositionalBinding=$false)]
    param(
       $param1,$param2
    )

    Write-Host param1 is: $param1
    Write-Host param2 is: $param2
}
于 2013-06-11T11:54:29.977 に答える