4

ISE内から展開スクリプトを記述した後、コマンドラインまたはバッチファイルを介してそれらを自動的に実行できるように、継続的インテグレーション(CI)サーバーが必要です。

次の呼び出しの間にいくつかの重要な違いがあることに気づきました。

powershell.exe -File Script.ps1
powershell.exe -Command "& '.\Script.ps1'"
powershell.exe .\Script.ps1

いくつかの簡単な例:

  • を使用する場合、エラーはISE-Fileとまったく同じ方法で処理されます。
  • 他の2つの呼び出しは変数を無視しているようで、try/catchブロックを$ErrorActionPreferenceキャッチしません。Write-Error

pSakeを使用する場合:

  • 最後の2つの呼び出しは完全に機能します
  • ISEまたは-Fileパラメーターの使用は、次のエラーで失敗します。

The variable '$script:context' cannot be retrieved because it has not been set


各構文の意味は何ですか、そしてなぜそれらは異なった振る舞いをしているのですか?理想的には、常に機能し、ISEのように動作する構文を見つけたいと思います。

4

2 に答える 2

2

答えではなく、ただのメモです。

-fileパラメータの説明を検索しました。ほとんどの情報源は「スクリプトファイルを実行する」とだけ言っています。http://technet.microsoft.com/en-us/library/dd315276.aspxで私は読んだ

Runs the specified script in the local scope ("dot-sourced"), so that the functions
and variables that the script creates are available in the current session. Enter
the script file path and any parameters.

その後、私はこれを呼ぼうとしました:

powershell -command ". c:\temp\aa\script.ps1"
powershell -file c:\temp\aa\script.ps1
powershell -command "& c:\temp\aa\script.ps1"

Get-Foo最初の2つはの後に停止しますが、最後の2つは停止しないことに注意してください。

上で説明した問題はモジュールに関連していますGet-Foo。script.ps1内で定義すると、説明した3つの呼び出しはすべて。への呼び出し後に停止しますGet-Foo

script.ps1内で定義するか、ファイルをドットソース化しGet-Fooて確認してください。それが機能する可能性があります:)

于 2010-05-24T08:53:34.437 に答える
0

これは、私が説明した動作の具体的な例です。

MyModule.psm1

function Get-Foo
{
    Write-Error 'Failed'
}

Script.ps1

$ErrorActionPreference = 'Stop'

$currentFolder = (Split-Path $MyInvocation.MyCommand.Path)
Import-Module $currentFolder\MyModule.psm1

try
{
    Get-Foo 
    Write-Host "Success"
}
catch
{
    "Error occurred"
} 

Script.ps1 の実行:

  • ISE から、または-Fileパラメータを使用して

    「エラーが発生しました」と出力して停止します

  • -Fileパラメータなしのコマンドラインから

    「失敗」の後に「成功」​​が出力されます (つまり、キャッチされません)。

于 2010-05-24T06:57:35.107 に答える