Псевдоним PowerShell не видит параметры во время завершения вкладки - PullRequest
2 голосов
/ 19 марта 2020

Я использую функцию, которая может внести некоторые изменения в каталог, а затем перенаправить / повторно псевдоним cd к этой функции.

function go ($jumpto, [switch]$DisableAliasCD, [switch]$ResetGoHash, [switch]$ResetCDHistory) {
    <stuff>
}

Set-Alias cc go
if (Test-Path Alias:cd) { Remove-Item -Path Alias:cd }    # Remove the default:   cd -> Set-Location
# Remove-Alias was not added until PS v6 so have to use Remove-Item with the Alias PSProvider
Set-Alias cd go -Option AllScope

Проверка синтаксиса каждого из go, cc, cd

get-command go -syntax
go [[-jumpto] <Object>] [-DisableAliasCD] [-ResetGoHash] [-ResetCDHistory]
get-command cc -syntax
go
get-command cd -syntax
go

Кажется, это имеет смысл. Тем не менее, я считаю, что IntelliSense отлично работает для cc (то есть, если я наберу cc -, а затем Tab, появятся вышеуказанные 4 параметра, но для cd ничего не произойдет.

Это ошибка? Или это как-то связано с объявлением Set-Alias cd с параметром AllScope (что я должен сделать, Set-Alias не работает без него для cd)

1 Ответ

1 голос
/ 20 марта 2020

Похоже, вы столкнулись с ошибкой, которая по-прежнему присутствует в PowerShell 7.0 :

Большинство (Windows PowerShell) / несколько (PowerShell [Core] 6+) встроенные псевдонимы определяются с помощью опции AllScope.
(их можно обнаружить с помощью
powershell -NoProfile { Get-Alias | ? options -like '*AllScope*' }
/
pwsh -NoProfile { Get-Alias | ? options -like '*AllScope*' }).

Переопределение любой псевдоним работает правильно с точки зрения вызова .

Однако с точки зрения завершения табуляции , переопределено AllScope сбоев, как вы описали: исходные параметры определения псевдонима все еще завершаются.

# Sample function
function foo { param($bar) "[$bar]" }

# Remove the built-in AllScope `cd` alias and redefine it to execute `foo`.
Remove-Item alias:cd; Set-Alias cd foo

# Make sure that the redefinition works:
cd -bar baz # OK: prints '[baz]'

# Try to tab-complete:
cd -b<tab> # NO COMPLETION instead of the expected '-bar'

# Try a parameter from `cd`'s *original* definition, `Set-Location`:
cd -li<tab> # UNEXPECTEDLY EXPANDS TO '-LiteralPath'

Это проблемное c поведение было сообщено в этой проблеме GitHub .

...