2011-01-11 17 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 

すべてのアイデアは、これが動作していない理由として:

これは私がこれまで試した何ですか?ある

Rename-Item Alias:\set original_set -Force 

、あなたが得るを使用する方法を学ぶ:

+0

私は今説明することはできませんが、現在のスコープであなたのrename-alias関数を実行すると(少なくとも現在のスコープがグローバルスコープの場合)動作します。 '。名前の変更 - 別名set orig_set'。 –

+0

@Keith Hill、hmm、私はいくつかのマシンでこれを試しました。主に私のプロファイルスクリプトでRename-Aliasを定義していますが、コマンドラインで関数を定義しても、常に同じ動作になります。 'set'エイリアスの名前は変更されません。私はPowerShell 2を使用しています、それは重要ですか?私はRemoteSignedの実行を使用しています、それは重要ですか? – jwfearn

+0

このトリックは関数を "定義"する場所ではなく、どのスコープで実行されるかです。コマンドの前に '.'を置くと、それをソーシングしています。つまり、現在のスコープで関数の本体を実行したかのように実行されます。私はRemoteSignedに設定されたポリシーでv2を実行しています。 –

答えて

-1

一つの解決策は:あなたが名前の変更、エイリアス関数を呼び出す方法を変更。

PS> . Rename-Alias set orig_set

しかし、これは質問頼む[この先端のために@Keithヒルに感謝を。]:代わりに

PS> Rename-Alias set orig_set

のこれを行う方法1を書くことができますが常にドット(。)で呼び出す必要なくエイリアスの名前を変更する機能?

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

まあ、私の答えを参照してください、 'Remove-Item'明らかに組み込みエイリアスを削除することはできません。 – Joey

+0

@joey:最後に-forceを追加してください。 –

2

PowerShellのプロバイダシステムの美しさは、別名ドライブなどがあるので、あなたが別名で古き良きRename-Itemを使用することができるということです-ChildItem、Remove-Item、Copy-Itemなどがあり、ディレクトリやファイル以外のものに適用することができます。ただし、「物」がプロバイダに含まれている限りです。すべてのプロバイダが実行を確認するには:

Get-PSProvider 

は、これらのプロバイダから作成されたすべてのドライブを表示するには実行します。

Get-PSDrive 
+0

あなたの構文はインタラクティブにうまくいきますが、私がそれを使うと(私の編集した質問を参照)、失敗します( 'set'の名前は変更されません)。何か案は? – jwfearn

関連する問題