O problema imediato é que o PowerShell está interpretando -Value GoToDrive($drive) como especificando a opção -Value 'GoToDrive' e também um parâmetro posicional $drive . (Isso é bizarro e não intuitivo, sim.) Colocar GoToDrive($drive) entre parênteses tentaria chamar a função GoToDrive ainda não existente e, em seguida, usar os resultados como o argumento para -Value , que não é o que você está depois mesmo se GoToDrive tivesse sido definido anteriormente. Outro problema é que os aliases não podem fornecer argumentos para o comando que eles chamam; eles são apenas nomes alternativos para comandos.
Você precisa executar dinamicamente os comandos que criam as funções de atalho:
# This is the exact same GoToDrive function you've been using
function GoToDrive($drive) {
$formatted = "$($drive):\"
if (Test-Path $formatted) {
Set-Location $formatted
} else {
Write-Host "'"$formatted'" does not exist."
}
}
# This does the magic
'a', 'b', 'c', 'd', 'e' | % {iex "function $_ {GoToDrive '$_'}"}
Invoke-Expression ou iex , por sua vez, executa seu argumento determinado em tempo de execução como se você o tivesse digitado na linha de comando. Então, essa última linha executa function a {GoToDrive 'a'} , depois function b {GoToDrive 'b'} e assim por diante.