PowerShell 2.0 - 为命令行调用运行脚本与从 ISE 运行脚本
从 ISE 中编写部署脚本后,我们需要我们的持续集成 (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 的语法。
After writing deployment scripts from within the ISE, we need our continuous integration (CI) server to be able to run them automatically, i.e. from the command line or via a batch file.
I have noticed some significant differences between the following calls:
powershell.exe -File Script.ps1
powershell.exe -Command "& '.\Script.ps1'"
powershell.exe .\Script.ps1
Some simple examples:
- When using
-File
, errors are handled in the exact same way as the ISE. - The other two calls seem to ignore the
$ErrorActionPreference
variable, and do not catchWrite-Error
in try/catch blocks.
When using pSake:
- The last two calls work perfectly
- Using the ISE or the
-File
parameter will fail with the following error:
The variable '$script:context' cannot be retrieved because it has not been set
What are the implications of each syntax, and why they are behaving differently? I would ideally like to find a syntax that works all the time and behaves like the ISE.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不是答案,只是一个注释。
我搜索了
-file
参数的解释。大多数消息来源只说“执行脚本文件。”。在 http://technet.microsoft.com/en-us/library/dd315276 .aspx 我读了之后,我尝试调用此:
请注意,前两个在
Get-Foo
之后停止,但最后一个没有。我上面描述的问题与模块有关 - 如果您在 script.ps1 中定义
Get-Foo
,我描述的所有 3 个调用都会在调用Get-Foo
后停止。只需尝试在 script.ps1 中定义它或使用
Get-Foo
点源文件并检查它。有机会它会起作用:)Not an answer, just a note.
I searched for explanation of
-file
parameter. Most sources say only "Execute a script file.". At http://technet.microsoft.com/en-us/library/dd315276.aspx I readAfter that I tried to call this:
Note that first two stop after
Get-Foo
, but the last one doesn't.The problem I describe above is related to modules -- if you define
Get-Foo
inside script.ps1, all the 3 calls I described stop after call toGet-Foo
.Just try to define it inside the script.ps1 or dotsource the file with
Get-Foo
and check it. There is a chance it will work :)这是我所描述的行为的具体示例。
MyModule.psm1
Script.ps1
运行 Script.ps1:
从 ISE,或使用
-File
参数<块引用>
<块引用>
将输出“发生错误”并停止
从不带
-File
参数的命令行<块引用>
<块引用>
将输出“失败”,然后输出“成功”(即未捕获)
Here is a concrete example of the behaviour I described.
MyModule.psm1
Script.ps1
Running Script.ps1:
From the ISE, or with the
-File
parameterFrom the command line without the
-File
parameter