为什么Powershell ISE显示错误而Powershell控制台不显示?

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个回答

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对象,即使您忽略红色,它也不会显示错误消息。


你能解决这个问题吗?我也遇到了这种情况。 - Blake Niemyjski
如果你将输出重定向到$null,你应该能够避免消息中的差异,只需检查LastExitCode来查看它的执行情况。 - Ryan Hiebert

4
这篇 Stackoverflow 解答所示,为了防止 git push 输出到 STDERR 上,解决方法是调用带有 --porcelain 选项的命令。

然后,执行如下命令:

git push origin master --porcelain

输出将全部写入 STDOUT。


2
所以,下面的例子中是否存在任何错误,这个命令 -q 2>&1 | %{ "$_" }将使错误的结果无效化。
解决方案和用法:git push -q 2>&1 | %{ "$_" }

请您加入一段解释,说明这段代码是如何回答问题的。仅仅给出代码并不能教会解决方法,因此我们不鼓励仅提供代码的答案。(参考链接:http://meta.stackexchange.com/q/148272/274165) - Nathan Tuggy

0
嗯,我能想到的唯一主要区别就是ISE在v2中使用单线程公寓(STA)模式,而控制台使用多线程公寓(MTA)。您尝试过使用-STP参数运行powershell.exe或使用-MTA运行powershell_ise.exe,然后再次尝试脚本吗?
顺便说一下,看起来错误是来自您正在尝试运行的Git命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接