這可能是一個愚蠢的問題,但是是默認的別名(例如cd)在PowerShell中硬編碼還是在某個隱藏的「配置文件」腳本中定義?PowerShell中定義的默認別名在哪裏?
我沒有任何配置文件集(每個用戶或系統範圍),所以我只是想知道默認的來自哪裏。
這可能是一個愚蠢的問題,但是是默認的別名(例如cd)在PowerShell中硬編碼還是在某個隱藏的「配置文件」腳本中定義?PowerShell中定義的默認別名在哪裏?
我沒有任何配置文件集(每個用戶或系統範圍),所以我只是想知道默認的來自哪裏。
它們是「內置的」,但不是不可變的。注:
PS > (Get-Alias dir).Options AllScope PS > (Get-Alias gci).Options ReadOnly, AllScopePS > 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 > slDirectory: C:\Users\Jay
Mode LastWriteTime Length Name ---- ------------- ------ ----
雖然我不知道技術細節,但我會說他們是硬編碼的,他們是不可配置的。它們可以重新定義或刪除,但最初的集合不在我們的控制之下。
這是一件好事,恕我直言。 – Joey 2010-05-05 09:06:48
他們是硬編碼。
硬編碼的,但檢索(最喜歡的事情 「隱藏」 在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
...
;-)
get-alias當然也適用,但上面的代碼是確定性的,無論其他模塊/管理單元是否將它們自己添加到組合中。 – x0n 2010-05-14 23:22:22
謝謝(和其他人)的一個很好的解釋! – Xerion 2010-05-15 20:31:24
實際上,你標記爲'#BAD!'的部分恰恰就是我用頭撞牆的那個部分,試圖找出如何做 - 重寫一個ReadOnly別名。我實際上已經嘗試了** - 強制**和** - Option AllScope **分開,當然也沒有人工作。出於某種原因,我沒有想到每個人都會遇到不同的障礙,這兩種障礙都適用於只讀別名,因此他們需要一起使用......呃! – 2013-10-22 22:22:15
如果您必須知道,我想將** sl **別名爲** Push-Location **,這樣我就可以在不改變習慣的情況下改變行爲。對於通常引用的命令,使用內置別名引用的代理命令也很有用。再次,改變命令的行爲而不改變你的習慣。所以......它不一定總是'#BAD!'。;) – 2013-10-22 22:24:29