1. ホーム
  2. powershell

[解決済み】PowerShellの関数の戻り値について

2022-04-22 14:53:02

質問

プロビジョニングに関連するいくつかのアクションを実行するPowerShell関数を開発しました。 シェアポイント チームサイトです。最終的には、プロビジョニングされたサイトの URL を文字列として返すようにしたいので、関数の最後に以下のコードを記述しています。

$rs = $url.ToString();
return $rs;

この機能を呼び出すコードは、次のようになります。

$returnURL = MyFunction -param 1 ...

だから、私はStringを期待しているのですが、そうではありません。代わりに、System.Management.Automation.PSMethod.System.Management.Automationのタイプのオブジェクトがあります。なぜ、String型ではなく、その型を返しているのでしょうか?

どうすればいいですか?

PowerShell は、少なくとも伝統的なプログラミングの観点から見た場合、実に奇妙な戻り値のセマンティクスを持っています。頭を整理するために、2つの主要な考え方があります。

  • すべての出力をキャプチャし、返します。
  • returnキーワードは、単に論理的な終了点を示すものです。

したがって、次の2つのスクリプトブロックは、実質的にまったく同じことを行うことになります。

$a = "Hello, World"
return $a

$a = "Hello, World"
$a
return

2番目の例の変数$aは、パイプライン上の出力として残され、前述のように、すべての出力が返されます。実際、2番目の例ではreturnを完全に省略しても同じ動作になります(returnは関数が自然に完了し終了するときに暗示されます)。

PSMethod オブジェクトを取得する理由については、関数定義の詳細がわからないため、何とも言えません。推測するに、おそらく数行上の何かがキャプチャされず、出力パイプラインに配置されているのでしょう。

また、注目すべきは、あなたが おそらく ただし、1行に複数の式を入れ子にしている場合は、このセミコロンは不要です。

戻り値のセマンティクスについては 約_Return のページを参照するか、TechNet の help return コマンドを PowerShell 自身から実行します。