web-dev-qa-db-ja.com

「PowerShellで実行」を使用して実行するときに別のスクリプトで関数を呼び出す

「ライブラリ」ファイルには、「ワーカー」スクリプトから呼び出される関数があります。

ライブラリファイル

function ShowMessage($AValue)
{
  $a = new-object -comobject wscript.Shell
  $b = $a.popup( $AValue )
}

ワーカーファイル

. {c:\scratch\b.ps1}

ShowMessage "Hello"

PowerShellで「worker」スクリプトを実行すると正常に動作しますIDEしかし、ワーカーファイルを右クリックして[PowerShellで実行]を選択すると、関数 'ShowMessage'が見つかりません。両方のファイルが同じフォルダにあります。何が起きているのでしょうか?

47
Brian Frost

ワーカーファイルで次のように変更します。

. "c:\scratch\b.ps1"

ShowMessage "Hello"

@RoiDantonが以下で言及したように:

相対パスを使用する場合の注意:パスの前にドットを追加することを忘れないでください。 「。\ b.ps1」。

最初のドットはスコープを変更するために使用される演算子であり、そのコンテキストではパスとは関係ありません。 Dot Source Notation を参照してください。

74
Andrey Marchuk

ワーカーファイルで、ライブラリファイルをドットソース化すると、すべてのコンテンツ(関数、変数など)がグローバルスコープに読み込まれ、ライブラリファイルから関数を呼び出すことができます。

=================== Worker file ==========================
# dot-source library script
# notice that you need to have a space 
# between the dot and the path of the script
. c:\library.ps1

ShowMessage -AValue Hello
=================== End Worker file ======================
15
Shay Levy