这可能是一个愚蠢的问题,但是是默认的别名(例如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