Почему Powershell ISE показывает ошибки, которые консоль Powershell не показывает?

Я запускаю точно такой же script.ps1 файл в PowerShell ISE (вручную загружая script и нажав F5) и в консоли Powershell (выполняющий файл script). Оба они работают, но 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

Вы можете видеть, что статус успеха не тот же.

Ответ 1

Я не знаю, почему они выводятся по-разному, но сообщение, которое мы видим из 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, и даже отображает сообщение об ошибке, если вы просматриваете красный цвет.

Ответ 2

как показано в fooobar.com/questions/530601/..., чтобы предотвратить git push для печати в STDERR, решение состоит в вызове команды witn --porcelain.

затем, вызывая

git push origin master --porcelain

выводит все на STDOUT

Ответ 3

Хммм, единственное существенное различие, которое я могу придумать сразу, это то, что ISE использует режим однопоточной квартиры (STA) в v2, а консоль использует многопоточную квартиру (MTA). Вы пытались запустить файл powershell.exe с аргументом -STA или powershell_ise.exe с -MTA и снова попробовать script?

Похоже, что ошибка исходит от команды Git, которую вы пытаетесь запустить, FWIW.

Ответ 4

Итак, пример ниже случая имеет любую ошибку, эта команда -q 2 > & 1 | % { "$ _" } `аннулирует результат ошибок.

Решение и использование: git push -q 2>&1 | %{ "$_" }