date
工作:
PS> date
Saturday, June 10, 2017 9:10:11 AM
但Get-Command date
抛出异常:
PS> Get-Command date
Get-Command : The term 'date' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Get-Command date
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (date:String) [Get-Command], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException,Microsoft.PowerShell.Commands.GetCommandCommand
此外Get-Alias date
抛出异常:
PS> Get-Alias date
Get-Alias : This command cannot find a matching alias because an alias with the name 'date' does not exist.
At line:1 char:1
+ Get-Alias date
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (date:String) [Get-Alias], ItemNotFoundException
+ FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand
$PSVersionTable.PSVersion
在Windows 10上是“5.1.15063.296”。
date
似乎不是cmdlet,函数,脚本文件,可操作程序或别名。那么,什么是date
?
PowerShell CommandDiscovery API使用the following precedence order将命令名解析为命令:
如果命令名称不包含破折号或斜杠,并且在用完上面列表中的最后一个选项后没有找到命令,它将再次尝试,但是with Get-
prepended。
因此,Get
动词也称为默认命令动词。
这适用于任何与现有别名,函数或cmdlet名称或Get-*
中的本机可执行文件不冲突的$env:path
命令,如:
Alias
Item
ChildItem
... 等等。
如果您再次想知道为什么命令以某种方式得到解决,您可以使用Trace-Command
cmdlet从powershell引擎获取调试级别信息:
Trace-Command -Expression { date } -Name Command* -Option All -PSHost
在这种情况下,Command*
将匹配CommandSearch
和CommandDiscovery
例程,并向您显示powershell用于解析命令名称date
的确切步骤
补充Mathias R. Jessen's helpful answer,它很好地解释了命令发现过程:
Get-Command
不知道默认动词逻辑,因此不会报告在使用给定命令名时实际执行的相同命令是应该修复的不一致,因为这是给定命令名时的目的。
-All
选项允许您查看具有较低优先级的相同名称的其他命令,但即使找不到-All
date
(如果是,则应首先列出,与报告为有效的命令,没有-All
)。同样,Get-Help
和-?
也不知道默认动词逻辑:
date -?
的帮助主题。我创造了一个Get-Help date
。