Что такое "дата"? "Дата получения команды" выбрасывает 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.