2011-01-11 3 views
4

Я хочу сделать свои собственные версии некоторых встроенных псевдонимов PowerShell. Вместо полного удаления переопределенных псевдонимов я хотел бы переименовать их, чтобы я мог использовать их, если захочу. Например, возможно, я переименую set в orig_set, а затем добавлю свое собственное определение для set.Как переименовать псевдоним в PowerShell?

Это то, что я пытался до сих пор:

PS> alias *set* 

CommandType  Name  Definition 
-----------  ----  ---------- 
Alias   set  Set-Variable 

PS> function Rename-Alias($s0, $s1) { Rename-Item Alias:\$s0 $s1 -Force } 
PS> Rename-Alias set orig_set 
PS> alias *set* 

CommandType  Name  Definition 
-----------  ----  ---------- 
Alias   set  Set-Variable 

Любые идеи, почему это не работает?

+0

Я не могу объяснить это прямо сейчас, но если вы выполняете свою функцию переименования в текущей области действия, она работает (по крайней мере, когда текущая область действия является глобальной областью), например. '. Переименовать-Alias ​​установить orig_set'. –

+0

@ Keith Hill, хм, я пробовал это на нескольких машинах. Я в основном определяю Rename-Alias ​​в моем скрипте профиля, но даже определение функции в командной строке всегда приводит к такому же поведению: псевдоним 'set' не переименовывается. Я использую PowerShell 2, это важно? Я использую исполнение RemoteSigned, так ли это? – jwfearn

+0

Трюк не в том, где вы «определяете» функцию, но в какой области она работает. Когда вы предируете команду с помощью «.», Вы получаете ее. То есть, он работает так, как если бы вы выполнили тело функции в текущей области. BTW Я запускаю v2 также с политикой, установленной на RemoteSigned. –

ответ

-1

Одно решение: изменить, как вы вызовите функцию Rename-Alias. Вместо

PS> Rename-Alias set orig_set

сделать это:

PS> . Rename-Alias set orig_set

[Благодаря @Keith Хилл за этот совет.]

Но возникает вопрос: как можно написать функция для переименования псевдонимов без необходимости всегда вызывать с точкой (.)?

2
function Rename-Alias($old, $new) 
{ 
    $resolved = get-alias $old 
    $cmdletName = $resolved.definition 
    Set-Alias $new $cmdletname 
    rm "alias:\$old" -force 
} 
+0

@joey: извините, забыл, что это не способ удалить псевдоним. вы удалите его из псевдонима psdrive –

+0

Ну, см. мой ответ, «Удалить-элемент», по-видимому, не может удалить встроенные псевдонимы. – Joey

+0

@joey: просто добавьте -force на конец –

2

Прелесть системы провайдера в PowerShell является то, что вы можете использовать старый добрый»Rename-Item на псевдоним, потому что это псевдоним привода, например:

Rename-Item Alias:\set original_set -Force 

То есть, вы узнаете, как использовать Get -ChildItem, Remove-Item, Copy-Item и т. Д., И вы можете применять их к вещам, отличным от каталогов и файлов, - пока «вещь» содержится в провайдере. Для того, чтобы увидеть все ваши поставщики выполнить:

Get-PSProvider 

Чтобы увидеть все диски, созданные из этих поставщиков выполнить:

Get-PSDrive 
+0

ваш синтаксис работает отлично интерактивно, но когда я использую его функцию (см. Мой отредактированный вопрос), он терпит неудачу ('set' не переименовывается). Есть идеи? – jwfearn

Смежные вопросы