0

-h パラメータと同様に値を渡さずに動作させ たい -h : ただし、他のものはそのままにしておきたい... つまり、パラメータにエイリアスを設定し、価値。

Param(
$BadParam,
[alias("h")][String]$Help,
[alias("s")][String]$Server,    
[alias("d")][String]$DocRoot,
[alias("c")][String]$Commit,
[alias("b")][String]$Branch
)

例(より良いものがない場合):

if(!$Help)
{
Write-Host "Here's the menu for how it works bro."
}

if($Help)
{
Write-Host "Here's more info on that particular thing from the menu."
}

これがシェルでどのように動作すると予想されるか:

-> script.ps1 -s test -h
-> Here's the menu for how it works bro.

-> script.ps1 -s test -h server
-> Here's more info on that particular thing from the menu.

-> script.ps1 -s -h server
-> You are missing a value for -e.
4

1 に答える 1

3

Powershell は、このようなことを実際にはサポートしていません。[switch]値なしで指定できるパラメーターを持つことも、完全に存在しないか値を指定する必要があるパラメーターを持つこともできます[string]。存在しないこと、値なしで指定されること、および値で指定されることをサポートするパラメーターを持つことはできません。

1 つの選択肢は、それを にしますが、[string]ユーザーに を渡しますが$null、そのようなものは最悪です。

別の非常にハックな代替手段は、パラメーターの位置でいくつかのトリックを行うことです。 -Helpである可能性があり、その直後に配置された[switch]別のパラメーターが存在する可能性があります。次に、ように見える呼び出しは、に設定するのではなく、スイッチを設定し、割り当てます。-ThingHelp[string]-Help 'foo'$Help'foo'$Help$ThingHelp = 'foo'

function ParamTest
{
  param(
     [Parameter(Position = 0)]
     [switch]$Help,

     [Parameter(Position = 1)]
     [string] $ThingHelp

  )

   "Help is [$help]"
   "ThingHelp is [$thingHelp]"
}

これは以下をサポートします。

PS> ParamTest               # $help = $false, $thingHelp = null
PS> ParamTest -Help         # $help = $true, $thingHelp = null
PS> ParamTest -Help 'foo'   # $help = $true, $thingHelp = 'foo'

このようなハッキングは、壊れやすく混乱を招く傾向があるため、一般的には良い考えではありません。平均的な PowerShell ユーザーにスクリプトを渡すことができ、パラメーターの意味と使用法をすぐに理解できるはずです。他の何千ものコマンドレットが実行していない一連のカスタム処理について説明する必要がある場合は、おそらく全員の時間を無駄にしていることになります。

また、何らかのヘルプ/使用システムを文字通り実装している場合は、やめてください! Powershell は包括的なヘルプ システムを無料で提供します。すべてのパラメーターを文書化したり、コード例を示したりすることができます。余分なものは何もありません。コメントベースのヘルプについては、ドキュメントを参照してください。

于 2012-09-17T18:20:49.180 に答える