PowerShell ISE выдает ошибку при проверке git

В PowerShell, git checkout выполняется без сообщения об ошибке. В Исэ, пока git checkout stills работает, ISE дает сообщение об ошибке.

> git checkout master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)
git : Switched to branch 'master'
At line:1 char:1
+ git checkout master
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Switched to branch 'master':String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

это не главная проблема, потому что git checkout до сих пор работает. Это раздражает, хотя, поэтому я хотел бы знать, почему ISE жалуется, когда стандартный PowerShell этого не делает, и, что важно, как мы можем предотвратить это раздражение.

Я посмотрел на почему Powershell ISE показывает ошибки, которые консоль Powershell не делает показать?, что объясняет, что ISE просто отображает то, что испытывает обычная оболочка. Этот ответ не объясняет, как успокоить это раздражающее поведение.

3 ответов


есть несколько способов избежать этих ошибок, ни один из них не выглядит или не чувствует себя "естественным". Сначала используется перенаправление потока ошибок и некоторая логика вокруг ошибок:

$out = git ? 2>&1
if ($?) {
    $out
} else {
    $out.Exception
}

второй зависит от ошибки, которая доступна только для конструкций PowerShell, поэтому нам нужно сначала создать один:

& {
    [CmdletBinding()]
    param()

    git ?
} -ErrorAction SilentlyContinue -ErrorVariable fail

if ($fail) {
    $fail.Exception
}

в своем ISEGit модуль я использую последний, чтобы избежать "утечки" записей ошибок конечному пользователю неконтролируемым образом.

наконец-то вы можете "исправить это" (ну, разберись...), убедившись, что вы можете строку в конце:

"$(git ? 2>&1 )"

или что - то я бы проголосовал против, так как это оставит вас в неведении о любом фактический ошибки, настройка global $ErrorActionPreference to SilentlyContinue - хотя это не отличается от перенаправления потока ошибок $null.


Как указано здесь, добавление -q после команды для тишины не будет показывать такие ошибки.


профиль готов функция-ized версия @ BartekB отличный ответ...

function Invoke-Git {
<#
.Synopsis
Wrapper function that deals with Powershell's peculiar error output when Git uses the error stream.

.Example
Invoke-Git ThrowError
$LASTEXITCODE

#>
    [CmdletBinding()]
    param(
        [parameter(ValueFromRemainingArguments=$true)]
        [string[]]$Arguments
    )

    & {
        [CmdletBinding()]
        param(
            [parameter(ValueFromRemainingArguments=$true)]
            [string[]]$InnerArgs
        )
        C:\Full\Path\To\git.exe $InnerArgs
    } -ErrorAction SilentlyContinue -ErrorVariable fail @Arguments

    if ($fail) {
        $fail.Exception
    }

}

# Could shorten the function name. I instead alias it, for terseness.
Set-Alias -Name git -Value Invoke-Git

# Also alias the name with the extension, as it is called by some applications this way.
Set-Alias -Name git.exe -Value Invoke-Git