2010-05-05 39 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