17

Windows PowerShell 3.0でTabExpansion2関数をオーバーライドする方法を示す例はありますか?古いTabExpansion関数をオーバーライドする方法は知っていますが、PowerShellISEのインテリセンスの項目のリストを提供したいと思います。TabExpansion2の定義を確認しましたが、タブ拡張プロセスで独自のコードを挿入する方法を簡単に理解することはできませんでした。

4

2 に答える 2

15

この例は、良い出発点になると思います。WindowsPowershellクックブック:TabExpansion2のサンプル実装。サンプルコードは、へのデフォルトの呼び出しの前後の両方でコードを追加できることを示しています[CommandCompletion]::CompleteInput

たとえば、$optionsCustomArgumentCompletersという名前のエントリをハッシュテーブルに追加して、コマンド引数のカスタム補完を取得できます。エントリは、キーが引数名(たとえば、「ComputerName」または「Get-ChildItem:Filter」)であり、値がそのパラメータを完了するために使用できる値の配列であるハッシュテーブルである必要があります。Powertheshell.comには、これに関する記事もあります:動的引数の完了。NativeArgumentCompletersオプションを使用して、ネイティブ実行可能ファイルのカスタム補完を指定することもできます(ここでも、キーはコマンド名であり、値は可能な補完の配列です)。

戻ったら、さらに分析CompleteInputするために結果をに保存できます。$result結果はCommandCompletionクラスのインスタンスです。デフォルトの補完で一致するものが見つからなかった場合は、CompletionResult一致するリストに独自のエントリを追加できます。

$result.CompletionMatches.Add(
   (New-Object Management.Automation.CompletionResult "my completion string") )

$result完了が実際に行われるように、関数から戻ることを忘れないでください。

最後に、トラブルシューティングに関する注意:呼び出すコードはTabCompletion2すべてのコンソールベースの出力をスケルチするようです(当然のことながら)。したがって、デバッグメッセージを自分で作成する場合は、別のテキストファイルに書き込んでみてください。たとえば、End関数を次のTabCopmletion2ように変更できます。

$result = [System.Management.Automation.CommandCompletion]::CompleteInput(
    $inputScript, $cursorColumn, $options)
$result | Get-Member | Add-Content "c:\TabCompletionLog.txt"
$result
于 2012-11-10T21:33:34.753 に答える
12

オーバーライドされた例を次に示しますTabExpansion2-TabExpansion2.ps1 と、コンプリーター を備えた実際のプロファイルで使用されるいくつかの例:

興味のあるポイント:

  • TabExpansion2.ps1は、読み込み時に最小限の作業を行います。潜在的にコストのかかる初期化は、完了が実際に発生したときに1回実行されます。
  • Overriddenは、パス内のTabExpansion21つ以上のプロファイルを介して拡張メカニズムを提供し*ArgumentCompleters.ps1ます。プロファイルは、の最初の呼び出しで1回呼び出されますTabExpansion2。複数のプロファイルには、異なる独立したモジュールやツールなどが付属していて、同時に使用される場合があります。
  • 標準のカスタム引数コンプリーターとネイティブ引数コンプリーターに加えて、このカスタム TabExpansion2は、組み込みの完了からの結果を微調整する結果プロセッサーと、組み込みの完了をインターセプトして置き換えることができる入力プロセッサーをサポートします。
  • 場合によっては、読み取り専用の空の組み込み結果を回避します。
  • ArgumentCompleters.ps1 には、入力プロセッサの魔女が組み込みの型と名前空間の補完を代替の、場合によってはより便利なものに置き換える例が含まれています。
  • 別のコンプリーターがコメントで補完を提供します:ヘルプタグ(.Synopsis.Descriptionなど)とコメントアウトされたコードの補完、なぜですか?
于 2013-12-06T04:06:12.523 に答える