4

機能するもの -

コマンドレットscriptblockで使用するがあるとしましょう。Select-Object

$jobTypeSelector = `
    {
        if ($_.Type -eq "Foo")
        {
            "Bar"
        }
        elseif ($_.Data -match "-Action ([a-zA-Z]+)")
        {
            $_.Type + " [" + $Matches[1] + "]"
        }
        else
        {
            $_.Type
        }
    }

$projectedData = $AllJobs | Select-Object -Property State, @{Name="Type"; Expression=$jobTypeSelector}

これはうまく機能し、期待どおりの結果が得られます。

私がやろうとしていること -

scriptblockただし、コードの後半で、定義された asを再利用したいと考えてい$jobTypeSelectorます。

たとえば、以下のコードは、以下のパラメーターとして渡されたもの$fooJob(単一のオブジェクトであることに注意してください$_) を受け取り、 の自動変数に使用され、コマンドレットscriptblockのコンテキストで実行されたときに返されるのと同じ結果を返すことを期待していました。Select-Object

$fooType = $jobTypeSelector.Invoke($fooJob)

うまくいかないこと -

期待どおりに機能せず、空の値が返されます。

私がすでに試したこと -

  1. 確認したところ、プロパティはすべて正しく設定されており、関連するプロパティ自体が空白または$null.

  2. インターネットで調べたところ、この件に関する関連ページを見つけるのはかなり難しいようでしたが、最終的には、わずかに異なるコンテキストで問題を説明するのに近いページを見つけました - PowerShell でスクリプト ブロックを呼び出します。ブログは私の質問に直接答えていません。関連する説明は、私の意見では、非常に醜く、読みにくく、維持するのが難しい解決策につながるだけです。

質問 -

したがって、(ブロックの代わりに)自動変数をパラメーターとして使用scriptblockする単一のオブジェクトに対してを呼び出す最良の方法は何ですか$_param

4

2 に答える 2

5

さまざまなオプションをいじった後、一種のハック的な方法で問題を解決することになりました..しかし、それは小さく、読みやすく、維持し、理解しやすいため、最良の解決策であることがわかりました.

単一のオブジェクトについて話していますが、コマンドレットを使用してパイプライン (自動変数をPowerShell定義するとき) で使用します。$_ForEach-Object

$fooType = $fooJob | ForEach-Object $jobTypeSelector
于 2014-11-25T21:12:10.220 に答える