Есть ли команда для проверки существования псевдонима в PowerShell?

Есть ли команда PowerShell, которая позволяет вам проверить, существует ли псевдоним?

(Я смотрю в Интернете, и это не похоже на него.)

Ответ 2

Вы можете использовать Test-Path для этого:

PS C:\> test-path alias:l*
True
PS C:\> test-path alias:list*
False

Просто используйте:

if (Test-Path alias:list*) { ... }

или

if(!(Test-Path alias:list*)) { ... }

если вы хотите что-то сделать, когда псевдоним не существует.

Как писали другие, Get-Alias также работает, но Test-Path избегает создания списка псевдонимов, поэтому может быть каждый раз немного быстрее, если вам это интересно.

Дальнейшее объяснение:

Powershell использует имена путей для доступа намного больше, чем просто файлы, поэтому, хотя префикс C: позволяет вам обращаться к файлам на диске C, alias: позволяет вам обращаться к псевдонимам, а другие квалификаторы позволяют вам получать доступ к таким функциям, как функции, ключи реестра, сертификаты безопасности и т.д. Таким образом, alias:l* - это путь к шаблону, который будет соответствовать всем псевдонимам, начинающимся с буквы l точно так же, как C:l* будет соответствовать всем файлам, начинающимся с l в корне диска C.

Test-Path - это команда, которая проверяет, ссылается ли путь на существующий объект с результатом True, только если по крайней мере один существующий объект соответствует этому пути. Поэтому обычно вы должны использовать его для проверки наличия файла, но в равной степени вы можете проверить наличие чего-либо, что адресуется с подходящим квалификатором.

Ответ 3

Да, используйте команду Get-Alias.

Пример:

Get-Alias -Name spps;

# If statement example
if (Get-Alias -Name spps) {
    # Do something here
}

Чтобы получить список всех команд, относящихся к псевдонимам, используйте Get-Command

Get-Command -Name *alias;

Ответ 4

Существует поставщик только для псевдонимов и псевдоним: местоположение, поэтому вы также можете использовать Get-Childitem.

Get-Childitem alias: 

Ответ 5

(проверено в версии 5)

Вот как я использую приведенное выше (большое спасибо всем!):

If ((Test-Path alias:foo) -eq $false) {New-Alias -name foo -value Get-Foo}

Это находится в нижней части каждого script, который является или станет модулем. Он помещает псевдоним в пользовательскую систему, не выкидывая ошибку или перезаписывая существующий псевдоним, если псевдоним уже существует.

Ответ 6

Другой вариант, если вы просто хотите установить псевдоним, если он еще не существует, - это использовать параметр -Force в Set-Alias, поэтому вы не получите сообщение об ошибке, когда псевдоним уже существует:

Set-Alias "foo" MyFooFunction -Force

Такие вещи, как if(!(Get-Alias -Name foo)) ошибка, если псевдоним не существует.

Ответ 7

Просто хотел добавить еще один способ добиться этого.

$ErrorActionPreference = 'Stop'
$ee = @() # Exception catcher
$Newalias = 'wv'
try{
New-Alias -Name $Newalias -Value Write-Verbose | Out-Null
}
catch{$ee += $_}

if (($ee -ne $null) -and ($ee.CategoryInfo.Category.ToString() -match 'ResourceExists')){Write-Warning "Alias $Newalias already exists";break}
else{Write-Verbose 'Continue on'}

Поймать исключение и проверить, соответствует ли это условию логической логики существования. Я нашел, что это работает хорошо, если исключение не так, как вы ожидали.

Ответ 8

Вдохновленный ответами Дункана и Даны, я создал следующую функцию. я рекомендую добавить его в файл, указанный вашей переменной PowerShell $ PROFILE.

function New-AliasSafe {
    param(
        [Parameter(Mandatory=$true)]
        [string]
        $Name,

        [Parameter(Mandatory=$true)]
        [string]
        $Value
    )

    if (!(Test-Path alias:$Name)) {
        New-Alias -Name $Name -Value $Value -Scope Global
        Write-Verbose "Alias $Name created successfully!"
    } else {
        Write-Verbose "Another alias with $Name already exists!"
    }
}

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

New-AliasSafe -Name wo -Value Write-Output

Если вы хотите узнать, был ли псевдоним успешно создан или нет, вы можете вместо этого вызвать эту функцию.

New-AliasSafe -Name wo -Value Write-Output -Verbose