5

標準の Linux スタイル、つまり --my-param で先頭に -- を付けてパラメータを取る Powershell スクリプトを作成したいと考えています。次のように、エイリアスパラメーター属性を使用してこれが可能かもしれないと思いました

Param (
    [parameter(Mandatory=$true)]
    [alias("-my-param","p")]
    [String]
    $param
)

これで私が望んでいたのは、呼び出しが

c:\src\ps\params.ps1 --my-param "x"

エイリアス -my-param を参照していると認識されます。残念ながら、私が得るのは

C:\src\ps\params.ps1 : A positional parameter cannot be found that accepts argument 'x'.
At line:1 char:21
+ c:\src\ps\params.ps1 <<<<  --my-param1 "x"
    + CategoryInfo          : InvalidArgument: (:) [params.ps1], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,params.ps1

一方、これでエイリアス my-param を使用すると、スクリプトを -my-param で呼び出すことができます。Powershellで先頭にパラメータ名を指定する方法はありますか?

4

2 に答える 2

5

トークナイザー レベルで構文が失敗します。比較:

[Management.Automation.PSParser]::Tokenize(
    'Command -parameter',
    [ref]$null
)

...と...

[Management.Automation.PSParser]::Tokenize(
    'Command --parameter',
    [ref]$null
)

ご覧のとおり、前者はパーサーによってパラメーターとして認識され、後者は引数として認識されます。したがって、唯一の方法は、すべての引数を「内部的に」解析し、(あなたの観点から) パラメーターと引数を推測することです。

于 2013-09-21T18:44:05.900 に答える
2

Unix スタイルのパラメーターを解析するライブラリを認識していません (必ずしも存在しないことを意味するわけではありません...) が、パラメーターを宣言せずに、スクリプトの本体。

これにより、パラメーターのハッシュテーブルが作成されます。ここで、キーはパラメーター名であり、値はパラメーター値です。スイッチ パラメーターには null 値が含まれます。

$params = @{}
$MyInvocation.Line.Substring(($MyInvocation.Line.IndexOf('--') + 2)) -split ' --' | %{
  $_ -match '(\S+) ?(.+)?' | Out-Null
  $params.($matches[1]) = $matches[2]
}
  • $MyInvocation.Lineは、スクリプトの呼び出しに使用されたコマンド ラインを提供します。最初の--$MyInvocation.Line.Substring(($MyInvocation.Line.IndexOf('--') + 2))に続くすべてを提供します。
  • $_ -match '(\S+) ?(.+)?'パラメータ名を最初の一致グループに割り当て、値を 2 番目の一致グループに割り当てます。これOut-Nullにより、PowerShell が反復ごとにTrueを出力するのを防ぎます。
  • (.+)?代わりに使用した理由(.*)は、スイッチ パラメーターの値を null にするためです。(.*)一致するものが何もない場合は空の文字列に一致し、$matches[2]の値を空の文字列にしますが、(.+)?一致しない場合は$matches[2]をnull にします。

これは、すべてのパラメーターが--で始まることを前提としています。1 つのハイフンを許可する場合、1 つのダッシュのパラメーター名を 1 文字に制限する場合、または誤って宣言されたパラメーターをチェックする場合 (たとえば、3 つのハイフンがある場合はエラーをスローする)、コードですが、これが基本的な考え方です。

于 2013-09-21T21:16:15.647 に答える