我正在试图找出powershell如何解析名称,但我似乎无法找到任何信息。
以下是该方案:
存在可执行文件:
c:\stuff\log.exe
路径设置为$env:path = 'c:\stuff\'
我加载了一个模块,其中包含一个函数名“log”和一个别名为“log”的二进制cmdlet。
当我在命令行输入“log”时,PowerShell如何决定是执行c:\ stuff \ log.exe还是执行函数名称日志,还是将cmdlet作为日志执行?
从实验看,解决方案顺序似乎是: 小命令 功能 路径上的可执行文件
但我找不到任何记录此事的内容。
答案 0 :(得分:11)
来自help about_Command_Precedence
:
If you do not specify a path, Windows PowerShell uses the following
precedence order when it runs commands:
1. Alias
2. Function
3. Cmdlet
4. Native Windows commands
此外,
When the session contains items of the same type that have the same
name, such as two cmdlets with the same name, Windows PowerShell
runs the item that was added to the session most recently.
调用具有相同名称的命令
about_Command_Precedence
还详细介绍了如何显式调用具有相同名称的命令。
以下是从不同来源调用log
命令的一些方法。
# Add '.exe' for executables
log.exe 'This is my log message.'
# Specify the module name
MyModule\log 'This is my log message.'
# Specify alias vs function
&(gi alias:\log) 'This is my log message.'
&(gi function:\log) 'This is my log message.'
答案 1 :(得分:8)
如果您想查找Powershell查找命令的命令,请尝试使用trace-command
cmdlet。例如:
PS C:\scripts> trace-command -name CommandDiscovery -command ls -PSHost
DEBUG: CommandDiscovery Information: 0 : Looking up command: ls
DEBUG: CommandDiscovery Information: 0 : Alias found: ls Get-ChildItem
DEBUG: CommandDiscovery Information: 0 : Cmdlet found: Get-ChildItem Microsoft.PowerShell.Commands.GetChildItemCommand
Directory: C:\scripts
Mode LastWriteTime Length Name
...
很好而且简短,但是:
PS> trace-command -name CommandDiscovery -command log -PSHost
我的系统上的在搜索不存在的日志命令时会产生超过1,000行输出。
顺序似乎基本上是扩展别名然后查找函数,cmdlet然后在路径中搜索命令,然后在get-
前面再次执行。
语言参考相当简洁,但确实说:
3.8名称查找可以使不同类型的命令具有相同的名称。执行名称查找的顺序 这种情况是别名,函数,cmdlet和外部命令。
如果它提到当找不到命令时它会再次尝试'get-',我没有找到那个位。
答案 2 :(得分:3)
补充现有的绝佳答案:
一种简单实用的方法,确定给定命令名将执行什么命令,如果还有其他同名阴影命令,则执行该命令 :
Get-Command -All <commandName>
所有具有给定名称的命令将按优先级降序列出,即,有效命令将被列为第一。
例如,Windows PowerShell具有sc
cmdlet的内置Set-Content
别名,它遮盖了本地sc.exe
(服务控制)程序(除非您以{ {1}}):
sc.exe