2

Как изменить поведение интерфейса командной строки Powershell по умолчанию, чтобы игнорировать расширения файлов для типов файлов, которые находятся в моей переменной среды $Env:Path ?

Если я просто python , он работает правильно и переводит меня в интерпретатор Python, как я и ожидал, так как расширение является частью переменной окружения.

Проблема в том, что когда я pyth и tab-complete в PowerShell, он всегда добавляет .exe . Я просто хочу, чтобы он закончил первую часть команды без расширения.

Это возможно? Может быть сценарий?

1 ответ1

5

Вы можете переопределить стандартную функцию завершения вкладки своей собственной. В новейшей версии PowerShell эта функция называется TabExpansion2 . Эта модификация, кажется, делает то, что вы хотите:

Function TabExpansion2 {
    [CmdletBinding(DefaultParameterSetName = 'ScriptInputSet')]
    Param(
        [Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 0)]
        [string] $inputScript,

        [Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 1)]
        [int] $cursorColumn,

        [Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 0)]
        [System.Management.Automation.Language.Ast] $ast,

        [Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 1)]
        [System.Management.Automation.Language.Token[]] $tokens,

        [Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 2)]
        [System.Management.Automation.Language.IScriptPosition] $positionOfCursor,

        [Parameter(ParameterSetName = 'ScriptInputSet', Position = 2)]
        [Parameter(ParameterSetName = 'AstInputSet', Position = 3)]
        [Hashtable] $options = $null
    )

    End
    {
        $source = $null
        if ($psCmdlet.ParameterSetName -eq 'ScriptInputSet')
        {
            $source = [System.Management.Automation.CommandCompletion]::CompleteInput(
                <#inputScript#>  $inputScript,
                <#cursorColumn#> $cursorColumn,
                <#options#>      $options)
        }
        else
        {
            $source = [System.Management.Automation.CommandCompletion]::CompleteInput(
                <#ast#>              $ast,
                <#tokens#>           $tokens,
                <#positionOfCursor#> $positionOfCursor,
                <#options#>          $options)
        }
        $field = [System.Management.Automation.CompletionResult].GetField('completionText', 'Instance, NonPublic')
        $source.CompletionMatches | % {
            If ($_.ResultType -eq 'Command' -and [io.file]::Exists($_.ToolTip)) {
                $field.SetValue($_, [io.path]::GetFileNameWithoutExtension($_.CompletionText))
            }
        }
        Return $source
    }    
}

Я добавил строки после той, которая начинается с $field ; он проходит через опции завершения вкладки по умолчанию и удаляет расширение из тех, которые кажутся из вашего PATH . Я получил оригинальный источник с этой командой:

(Get-Command 'TabExpansion2').ScriptBlock

Если вы поместите новую функцию в файл .ps1 и выполните этот сценарий точечно (например . .\tabnoext.ps1), она станет обработчиком завершения вкладки для текущего сеанса. Чтобы загружать его каждый раз, когда вы открываете окно PowerShell, просто вставьте весь этот код в скрипт профиля PowerShell.

Если вы используете старую версию PowerShell, вам нужно переопределить функцию TabExpansion , которая просто возвращает массив строк.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .