4

古典的な一階関数の例を見てみましょう:

function Get-MyName { "George" }

function Say-Hi([scriptblock]$to) {
  Write-Host ("Hi "+(& $to))
}

これはうまくいきます:

Say-Hi { "Fred Flintstone" }

これはしません:

Say-Hi Get-MyName

Get-MyName が評価され、値自体として渡されないためです。Get-MyName を値として渡すにはどうすればよいですか?

4

4 に答える 4

9

Get-Myname をスクリプト ブロックとして渡す必要があります。これは、変数の型を定義した方法だからです。

Say-Hi ${function:Get-MyName}
于 2013-04-12T17:45:30.880 に答える
2

これは、質問と実行範囲の詳細を説明するためのより良い例かもしれません。@mjolinorの答えは、このユースケースでうまく機能しているようです:

function Get-MyName($name) { $name; throw "Meh" }

function Say-Hi([scriptblock]$to) {
  try {
      Write-Host ("Hi "+(& $to $args)) # pass all other args to scriptblock
  } catch {
      Write-Host "Well hello, $_ exception!"
  }
}

コマンドとその出力:

PS C:\> Say-Hi ${function:Get-MyName} 'George'
Well hello, Meh exception

特に、不安定なリモート SQL Server データベース接続で動作する関数をラップするためにこのパターンを使用しています。関数はスリープし、最終的に成功するか、より高い例外をスローする前に数回再試行します。

于 2016-10-27T20:02:13.263 に答える
1

コードに厳密に基づいて、正しい答えは次のとおりです。

Say-Hi {(Get-MyName)}

これにより、「Hi George」が生成されます

于 2014-06-20T19:11:17.467 に答える