Динамическое создание псевдонимов в PowerShell

374
prubini87

Я хотел бы создать несколько псевдонимов динамически, но я не могу заставить мой код работать. Вот код:

# Drives $drives = ("a","b","c","d","e") foreach ($drive in $drives) { New-Item -Path alias:\ -Name $drive -Value GoToDrive($drive) #.GetNewClosure() }  function GoToDrive($drive) { $formatted = "$($drive):\" if (Test-Path $formatted) { Set-Location $formatted } else { Write-Host "`"$formatted`" does not exist." } } 

Когда я набираю «a», или «b», или любую из букв в $ drive, это должно изменить мою рабочую директорию на букву этого диска (например, A :).

Ошибка, которую я получаю сейчас, заключается в следующем:

New-Item : A positional parameter cannot be found that accepts argument 'a'. At C:\Users\prubi\OneDrive\Documentos\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:17 char:5 + New-Item -Path alias:\ -Name $drive -Value GoToDrive($drive) #.Ge ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-Item], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand  New-Item : A positional parameter cannot be found that accepts argument 'b'. At C:\Users\prubi\OneDrive\Documentos\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:17 char:5 + New-Item -Path alias:\ -Name $drive -Value GoToDrive($drive) #.Ge ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-Item], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand  New-Item : A positional parameter cannot be found that accepts argument 'c'. At C:\Users\prubi\OneDrive\Documentos\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:17 char:5 + New-Item -Path alias:\ -Name $drive -Value GoToDrive($drive) #.Ge ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-Item], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand  New-Item : A positional parameter cannot be found that accepts argument 'd'. At C:\Users\prubi\OneDrive\Documentos\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:17 char:5 + New-Item -Path alias:\ -Name $drive -Value GoToDrive($drive) #.Ge ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-Item], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand  New-Item : A positional parameter cannot be found that accepts argument 'e'. At C:\Users\prubi\OneDrive\Documentos\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:17 char:5 + New-Item -Path alias:\ -Name $drive -Value GoToDrive($drive) #.Ge ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-Item], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand 

Кто-нибудь может помочь мне заставить это работать, пожалуйста?

3

1 ответ на вопрос

3
Ben N

Непосредственная проблема заключается в том, что PowerShell интерпретирует -Value GoToDrive($drive)как указание переключателя, -Value 'GoToDrive'а также позиционный параметр $drive. (Это странно и не интуитивно понятно, да.) Заключение GoToDrive($drive)в круглые скобки будет пытаться вызвать еще не существующую GoToDriveфункцию, а затем использовать результаты в качестве аргумента для -Value, а это не то, что вам нужно, даже если GoToDriveэто было определено ранее. Другая проблема заключается в том, что псевдонимы не могут предоставить аргументы для команды, которую они вызывают; это только альтернативные имена для команд.

Вам необходимо динамически выполнять команды, которые создают функции быстрого доступа:

# 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' | % "} 

Invoke-Expressionили, iexдля краткости, запускает свой аргумент «определенный во время выполнения», как если бы вы ввели его в командной строке самостоятельно. Так что последняя строка выполняет function a , а затем function b , и так далее.

Большое спасибо за разъяснения и за рабочий код! Я принимаю ваш как правильный ответ. prubini87 5 лет назад 0