私はPowerShell関数をいくつか書いていますが、何かをして、既存の組み込み関数を透過的に呼び出します。私はすべての議論に手を差し伸べたい。私は議論の詳細を知る必要はありません。1つのPowerShell関数の 'argument-line'を別のPowerShell関数に渡すには?
でこれを行うには 'splat'を使用するのが疲れましたが、期待通りに機能しませんでした。
以下の例では、myls
というおもちゃの機能を書いていますが、こんにちは!を呼び出し、同じ組み込み関数Get-ChildItem
を呼び出して、組み込みエイリアスls
が残りの引数行をそのまま呼び出していることを確認します。私はこれまで持っていることはかなりうまく動作します:myls
の
function myls
{
Write-Output "hello!"
# $MyInvocation | Format-List # <-- uncomment this line for debug info
Invoke-Expression ("Get-ChildItem " + $MyInvocation.UnboundArguments -join " ")
}
正しいバージョンでは、複数のセミコロン区切りのコマンドを含む行から、名前付き引数と、一つの引数で、引数なしで呼び出されて処理できる必要がありますスペースを含む文字列変数を含む引数の変数を使用します。基本的には、ls
の代わりのドロップインでなければなりません。
以下のテストはmyls
と組み込みls
を比較:
[注:出力は省略さおよび/またはスペースを節約するために圧縮]
PS> md C:\p\d\x, C:\p\d\y, C:\p\d\"jay z"
PS> cd C:\p\d
PS> ls # no args
PS> myls # pass
PS> cd ..
PS> ls d # one arg
PS> myls d # pass
PS> $a="A"; $z="Z"; $y="y"; $jz="jay z"
PS> $a; ls d; $z # multiple statements
PS> $a; myls d; $z # pass
PS> $a; ls d -Exclude x; $z # named args
PS> $a; myls d -Exclude x; $z # pass
PS> $a; ls d -Exclude $y; $z # variables in arg-line
PS> $a; myls d -Exclude $y; $z # pass
PS> $a; ls d -Exclude $jz; $z # variables containing spaces in arg-line
PS> $a; myls d -Exclude $jz; $z # FAIL!
は私が再書き込みmyls
ことができる方法があります私が望む行動を得るために?
短い回答:はい、可能です。悪いニュース:パラメータの詳細と、呼び出したい機能に関する他のメタデータを知っているコードが必要です。良いニュース:1つはすべて自分自身を書く必要はありません。このメタデータはプログラム的に利用可能であり、スケルトンプロキシコードを自動生成するために使用できるモジュールが存在します(@ Jaykulの答えを参照)。私はthe module named "MetaProgramming"を使用することを選択します。インポート後、ドロップインmyls
スクリプトを生成することは死んで簡単です:
...
begin
{
Write-Output "hello!" # <-- add this line
try {
$outBuffer = $null
...
出来上がり:
New-ProxyCommand ls > .\myls.ps1
その後1は、このように、新たに生成されたmyls.ps1
スクリプトをカスタマイズすることができます!この新しいバージョンはすべてのテストに合格します。
これは私が本当に必要なものです。ありがとう! – jwfearn
つまり、自動コピー貼り付け。ただ驚くほど。 – alecov
コピー貼り付けができれば、コード生成は不要です。 OPがやっていることは、コマンドをサブクラス化しようとすることです:オリジナルに基づいて新しいコマンドを書きますが、カスタムの変更を加えてスクリプトで行います。あなたがC#でそれをやっていたら、あなたはただ継承しています。しかし、PowerShellを使用しているので、最初のコマンドレット(PowerShellでは、これらのプロキシ関数を呼び出す)からパラメータのセットを複製することから始まる関数を記述する必要があります。コード生成のために泣いたことがあった場合、これがそれです。 – Jaykul