Jak ukryć rozszerzenia plików w uzupełnieniu karty PowerShell?

2

Jak zmienić domyślne zachowanie CLI Powershell, aby ignorować rozszerzenia plików dla typów plików, które działają na moim $Env:Path Zmienna środowiskowa?

Jeśli tylko napiszę python, działa poprawnie i upuszcza mnie do interpretera Pythona tak, jak tego oczekuję, ponieważ rozszerzenie jest częścią zmiennej środowiskowej.

Problem polega na tym, że piszę pyth i uzupełniony tabulatorami w PowerShell, zawsze dołącza .exe. Chcę tylko, żeby dokończył pierwszą część polecenia bez rozszerzenia.

czy to możliwe? Może scenariusz?

jmreicha
źródło
2
Jeśli nie lubisz rozszerzeń plików, nie korzystaj z systemu Windows. cmd również uzupełnia się o rozszerzenia plików. Tak właśnie działają rzeczy.
Daniel B
To nie jest dokładnie odpowiedź, której szukałem ... Czy może istnieje sposób na skryptu zachowanie z profilem Powershell lub coś innego?
jmreicha
Wysoce nieprawdopodobne. Możesz jednak spojrzeć na co PSReadLine robi i może wypracować rozwiązanie. Obejmuje to oczywiście programowanie (.NET).
Daniel B
Ciekawy. Przyjrzę się, dzięki.
jmreicha
3
Jaki jest problem, gdy widzisz pełną nazwę pliku?
guntbert

Odpowiedzi:

5

Możesz zastąpić standardową funkcję wypełniania zakładki własną. W najnowszej wersji PowerShell ta funkcja jest TabExpansion2. Ta modyfikacja wygląda tak, jak chcesz:

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
    }    
}

Dodałem wiersze po tym, który zaczyna się od $field; przechodzi przez domyślne opcje uzupełniania kart i blokuje rozszerzenie poza tymi, które wydają się być z twojego PATH. Dostałem oryginalne źródło za pomocą tego polecenia:

(Get-Command 'TabExpansion2').ScriptBlock

Jeśli umieścisz nową funkcję w a .ps1 plik i wykonaj kropkę tego skryptu (np. . .\tabnoext.ps1 ), stanie się programem obsługi kart dla bieżącej sesji. Aby załadować go za każdym razem, gdy otworzysz okno PowerShell, po prostu wklej cały ten kod do Skrypt profilu PowerShell .

Jeśli używasz starej wersji PowerShell, musisz zastąpić TabExpansion funkcja, która po prostu zwraca tablicę ciągów.

Ben N
źródło
To działa świetnie, dziękuję. Czy istnieje sposób na pliki źródłowe w profilu PowerShell, dzięki czemu mogę oddzielić funkcję na własny plik?
jmreicha
Właśnie próbowałem dodać źródło dot do skryptu override w moim profilu i zadziałało, więc wygląda na to, że tak. Dzięki jeszcze raz.
jmreicha
Warto zauważyć, że nie udało mi się tego uruchomić bez zdefiniowania funkcji jako global to znaczy Function global:TabExpansion2 {
webnoob