命令行 – PowerShell 2.0 – 运行命令行调用与IS​​E的脚本

在ISE中编写部署脚本之后,我们需要
continuous integration(CI)服务器能够自动运行它们,即从命令行或通过批处理文件运行它们.

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

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

一些简单的例子:

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

使用pSake时:

>最后两个电话完美无缺
>使用ISE或-File参数将失败,并显示以下错误:

无法检索变量’$script:context’,因为它尚未设置

每种语法的含义是什么,以及它们为什么表现不同?理想情况下,我希望找到一种始终有效的语法,其行为与ISE相似.

最佳答案 不是答案,只是一个注释.

我搜索了-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之后停止,但最后一个没有.

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

只是尝试在script.ps1中定义它,或者用Get-Foo将文件点源并检查它.它有可能工作:)

点赞