機能するもの -
コマンドレット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)
うまくいかないこと -
期待どおりに機能せず、空の値が返されます。
私がすでに試したこと -
確認したところ、プロパティはすべて正しく設定されており、関連するプロパティ自体が空白または
$null
.インターネットで調べたところ、この件に関する関連ページを見つけるのはかなり難しいようでしたが、最終的には、わずかに異なるコンテキストで問題を説明するのに近いページを見つけました - PowerShell でスクリプト ブロックを呼び出します。ブログは私の質問に直接答えていません。関連する説明は、私の意見では、非常に醜く、読みにくく、維持するのが難しい解決策につながるだけです。
質問 -
したがって、(ブロックの代わりに)自動変数をパラメーターとして使用scriptblock
する単一のオブジェクトに対してを呼び出す最良の方法は何ですか$_
param