Что такое "дата"? "Дата получения команды" выбрасывает CommandNotFoundException
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
- "5.1.15063.296" в Windows 10.
date
похоже, не является командлетом, функцией, script файлом, исполняемой программой или псевдонимом. Итак, что такое date
?
Ответы
Ответ 1
В PowerShell CommandDiscovery API используется следующий порядок приоритетов для разрешения имен команд командам:
- Псевдоним
- Функция
- Командлет
- Собственные команды Windows
Если имя команды не содержит тире или косой черты, и после исчерпания последней опции в списке выше команда не найдена, она попытается снова, но с Get-
добавленным.
По этой причине глагол Get
также известен как командный глагол по умолчанию.
Это работает для любой команды Get-*
, для которой нет столкновения с существующими псевдонимами, именами функций или командлетов или встроенным исполняемым файлом в $env:path
, например:
Alias
Item
ChildItem
... и т.д.
Если вы еще раз задаетесь вопросом, почему команда будет решена определенным образом, вы можете использовать командлет Trace-Command
, чтобы получить уровень отладки информация от двигателя powershell:
Trace-Command -Expression { date } -Name Command* -Option All -PSHost
Command*
будет в этом контексте соответствовать подпрограммам CommandSearch
и CommandDiscovery
и покажет вам, какие именно шаги выполняются powershell для разрешения имени команды date
Ответ 2
Чтобы дополнить полезный ответ Матиаса Р. Джессена, который хорошо объясняет процесс обнаружения команд:
То, что Get-Command
не сообщает ту же команду, которая фактически выполняется, когда используется указанное имя команды, является несогласованностью, которая должна быть исправлена , потому что это его самая цель при предоставлении команды имя.
- В стороне: параметр
-All
позволяет вам видеть дополнительные команды с тем же именем с более низким приоритетом, но даже wit -All
date
не найден (и, если это так, он должен быть указан в списке во-первых, в соответствии с сообщением об этом в качестве эффективной команды без -All
).
Аналогично, Get-Help
и -?
также не знают логики по умолчанию:
-
date -?
и Get-Help date
не возвращать Get-Date's
справку; вместо этого они перечисляют разделы справки, содержащие слово date
.
Я создал проблему в репозитории PowerShell GitHub.