13

我在 Powershell ISE(手动加载脚本并按 F5)和 Powershell 控制台(执行脚本文件)中运行完全相同的 script.ps1 文件。它们都可以工作,但 ISE 会显示控制台不显示的错误。为什么?

代码是:

git push origin master
Write-Host "lastExitCode: $lastExitCode Last command was successful: $?"

此代码在 ISE 中输出此错误:

git.cmd : Initializing to normal mode
At E:\script.ps1:28 char:4
+ git <<<<  push origin master
    + CategoryInfo          : NotSpecified: (Initializing to normal mode:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Initializing to normal mode

Everything up-to-date

lastExitCode: 0 Last command was successful: False

这在控制台中:

Everything up-to-date
lastExitCode: 0 Last command was successful: True

您可以看到成功状态也不相同。

4

4 回答 4

11

我不知道为什么它们的输出不同,但我们看到的消息git push来自 stderr。这意味着它们显示错误,尽管 ISE 使它们变得更响亮,并将其转换为错误对象

考虑 PowerShell 提示符的以下输出:

PS> git push
Everything up-to-date
PS> git push 2> $null    # Redirect stderr to $null
PS> $LastExitCode
1
PS>

并将其与 ISE 进行比较:

PS> git push
git : Everything up-to-date
At line:1 char:1
+ git push
+ ~~~~~~~~
    + CategoryInfo          : NotSpecified: (Everything up-to-date:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
PS> git push 2> $null
PS> $LastExitCode
1
PS>

除了显示的错误对象的额外输出外,输出是相同的。ISE 已将 stderr 字符串转换为 NativeCommandError 对象,如果您查看红色,它甚至会显示错误消息。

于 2012-11-16T18:48:15.897 回答
4

this Stackoverflow answer所示,以防止git push打印到 STDERR 解决方案是调用命令 witn--porcelain选项。

然后,调用

git push origin master --porcelain

输出全部到 STDOUT

于 2015-11-01T07:55:11.010 回答
1

所以,下面的例子有任何错误,这个命令 -q 2>&1 | %{ "$_" }` 将使错误结果无效。

一个解决方案和用途:git push -q 2>&1 | %{ "$_" }

于 2015-10-31T05:35:15.603 回答
0

嗯,我能想到的唯一主要区别是 ISE 在 v2 中使用单线程单元 (STA) 模式,而控制台使用多线程单元 (MTA)。您是否尝试过使用 -STA 参数运行 powershell.exe,或使用 -MTA 运行 powershell_ise.exe,然后再次尝试该脚本?

看起来错误来自您尝试运行的 Git 命令 FWIW。

于 2012-06-01T20:25:33.663 回答