2010-05-05 41 views
7

這可能是一個愚蠢的問題,但是是默認的別名(例如cd)在PowerShell中硬編碼還是在某個隱藏的「配置文件」腳本中定義?PowerShell中定義的默認別名在哪裏?

我沒有任何配置文件集(每個用戶或系統範圍),所以我只是想知道默認的來自哪裏。

回答

10

它們是「內置的」,但不是不可變的。注:

 
PS > (Get-Alias dir).Options 
AllScope 
PS > (Get-Alias gci).Options 
ReadOnly, AllScope

PS > Get-Alias | group Options

Count Name Group ----- ---- ----- 91 ReadOnly, AllScope {%, ?, ac, asnp...} 46 AllScope {cat, cd, chdir, clear...}

正如你可以看到,有一個由ReadOnly選項別名的一些分區。在PowerShell中,ReadOnly是慣用的,而可變參數則適用於熟悉其他shell的人。我見過人們修改dir以添加更多功能,同時保留gci作爲Get-ChildItem的直接別名。

爲了廣泛兼容,我只在腳本中使用ReadOnly別名。

而且,因爲在他們自己的方式,每個工作dir在CMD,ls在UNIX和gci在PowerShell中,我訓練自己使用本機命令,而不是一個別名。 dir傾向於無處不在,但dir -Recurse不!

作爲訓練演習,並測試我的兼容性腳本,我有時會刪除非ReadOnly別名:

Get-Alias | ? { ! ($_.Options -match "ReadOnly") } | % { Remove-Item alias:$_ } 

有一個更溫和的做法,你有一個新的命令,警告你替換每個別名您正在使用其中一個兼容別名,但可以讓您保持正常運行。

此外,您還可以改變ReadOnly別名,如果你真的想,但基於上述原因,我建議反對:

 
PS > Set-Alias -Name sl -Value Get-ChildItem -Force -Option AllScope  # BAD! 
PS > sl

Directory: C:\Users\Jay

Mode LastWriteTime Length Name ---- ------------- ------ ----

+1

謝謝(和其他人)的一個很好的解釋! – Xerion 2010-05-15 20:31:24

+1

實際上,你標記爲'#BAD!'的部分恰恰就是我用頭撞牆的那個部分,試圖找出如何做 - 重寫一個ReadOnly別名。我實際上已經嘗試了** - 強制**和** - Option AllScope **分開,當然也沒有人工作。出於某種原因,我沒有想到每個人都會遇到不同的障礙,這兩種障礙都適用於只讀別名,因此他們需要一起使用......呃! – 2013-10-22 22:22:15

+0

如果您必須知道,我想將** sl **別名爲** Push-Location **,這樣我就可以在不改變習慣的情況下改變行爲。對於通常引用的命令,使用內置別名引用的代理命令也很有用。再次,改變命令的行爲而不改變你的習慣。所以......它不一定總是'#BAD!'。;) – 2013-10-22 22:24:29

1

雖然我不知道技術細節,但我會說他們是硬編碼的,他們是不可配置的。它們可以重新定義或刪除,但最初的集合不在我們的控制之下。

+0

這是一件好事,恕我直言。 – Joey 2010-05-05 09:06:48

0

他們是硬編碼。

6

硬編碼的,但檢索(最喜歡的事情 「隱藏」 在PowerShell中)

PS> [Management.Automation.Runspaces.InitialSessionState].getproperty(
     "BuiltInAliases", [reflection.bindingflags]"NonPublic,Static").getvalue(
      $null, @()) | format-table -auto 

Definition   Description   Options CommandType Visibility Name PSSnapIn Module 
----------   -----------   ------- ----------- ---------- ---- -------- ------ 
Add-Content      ReadOnly, AllScope  Alias  Public ac 
Add-PSSnapIn      ReadOnly, AllScope  Alias  Public asnp 
Clear-Content     ReadOnly, AllScope  Alias  Public clc 
Clear-Item      ReadOnly, AllScope  Alias  Public cli 
Clear-ItemProperty    ReadOnly, AllScope  Alias  Public clp 
Clear-Variable     ReadOnly, AllScope  Alias  Public clv 
... 

;-)

+2

get-alias當然也適用,但上面的代碼是確定性的,無論其他模塊/管理單元是否將它們自己添加到組合中。 – x0n 2010-05-14 23:22:22

相關問題