Почему 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 | %{ "$_" }