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

13

Я запускаю точно такой же файл script.ps1 в ISE Powershell (загрузка сценария вручную и нажатие клавиши F5) и в консоли Powershell (выполнение файла сценария).They both work but ISE shows errors that the console does not. Why?

Код является:

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
3

этот ответ Stackoverflow предотвращатьgit push чтобы напечатать в STDERR, решение - вызвать команду witn--porcelain вариант.

тогда звоню

git push origin master --porcelain

output все идет в STDOUT

не работает, когда он внутри скрипта sino
1

2> & 1 | % {"$ _"} `отменяет результат ошибок.

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

Могли бы вы, пожалуйстаредактироват в объяснении, почему этот код отвечает на вопрос? Ответы только на код Обескуражен, потому что они не учат решению. Nathan Tuggy
@ NathanTuggy, обновил комментарий Juliano Sales
0

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

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

Похожие вопросы