4

从 ISE 中编写部署脚本后,我们需要我们的持续集成(CI) 服务器能够自动运行它们,即从命令行或通过批处理文件。

我注意到以下调用之间存在一些显着差异:

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

一些简单的例子:

  • 使用时,错误的处理方式与ISE-File完全相同。
  • 其他两个调用似乎忽略了该$ErrorActionPreference变量,并且没有Write-Error在 try/catch 块中捕获。

使用pSake时:

  • 最后两个电话完美地工作
  • 使用 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,但最后一个没有。

我上面描述的问题与模块有关——如果你Get-Foo在 script.ps1 中定义,我描述的所有 3 个调用在调用Get-Foo.

只需尝试在 script.ps1 中定义它或使用 dotsource 文件Get-Foo并检查它。有机会它会起作用:)

于 2010-05-24T08:53:34.437 回答
0

这是我描述的行为的一个具体示例。

我的模块.psm1

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

脚本.ps1

$ErrorActionPreference = 'Stop'

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

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

运行脚本.ps1:

  • 从 ISE 或使用-File参数

    将输出“发生错误”并停止

  • -File从不带参数的命令行

    将输出“失败”后跟“成功”(即未捕获)

于 2010-05-24T06:57:35.107 回答