путаница с псевдонимами — что сопоставило «vm» с «Get-VM»?

путаница с псевдонимами — что сопоставило «vm» с «Get-VM»?

Намереваюсь запустить vim отсюда

PS C:\temp> get-command vim | select name,source

Name    Source
----    ------
vim.bat C:\Users\noam\AppData\Local\Microsoft\WindowsApps\vim.bat

Я случайно ввел vmвместо этого, vimи последовало много недоумения:

C:\temp>pwsh -noprofile
PowerShell 7.4.1
PS C:\temp> vm
Get-VM: 29-Mar-24 16:28:14      Get-VM          You are not currently connected to any servers. Please connect first using a Connect cmdlet.
PS C:\temp> get-command vm
Get-Command: The term 'vm' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
PS C:\temp> get-alias vm
Get-Alias: This command cannot find a matching alias because an alias with the name 'vm' does not exist.
PS C:\temp> cmd /c where vm
INFO: Could not find files for the given pattern(s).

Как найти и удалить конфигурацию, которая, по-видимому, связана vmс Get-VMPowerCLI VMware?

PS C:\temp> get-command get-vm | select Name,Source

Name   Source
----   ------
Get-VM VMware.VimAutomation.Core

Я, должно быть, упускаю что-то глупое. Я бы подумал, что приведенный выше вызов where.exeдолжен был бы раскрыть что-то важное на моем пути. В любом случае поведение не меняется после установки $env:PATH = $null.

Как косяк, я мог бы явно переопределить vmvia Set-Aliasна какую-то несуществующую команду. Но я хотел бы понять, почему я не вижу чего-то вроде ниже при выполнении vm. Что я упустил из виду?

PS C:\temp> doesnotexist
doesnotexist: The term 'doesnotexist' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Приведенные выше результаты были воспроизводимы как с VMware.VimAutomation.Coreявно импортированным модулем, так и без него.

решение1

Это не «проблема псевдонимов», а часть подхода PowerShell «сначала глагол» к именованию команд.

PowerShell автоматически подразумевает Get-глагол в командлетах, если глагол не указан.

Вы можете попробовать это, просто написав несколько команд, например childitem, locationи т.д., они автоматически запустятся Get-ChildItemиGet-Location

Это также объясняет поведение различных командлетов, которые вы пытались выяснить об этом поведении:

  • Get-Command vm- поскольку vm не является командой, она не найдена.
  • Get-Alias vm- поскольку это также не псевдоним, вы не сможете найти его здесь.

Такое поведение не применяется к пользовательским функциям или консольным приложениям, поэтому вы можете создавать функции, которые вызываются, DoStuffи PowerShell не будет автоматически делать это.Get-DoStuff

Вы не можете изменить это поведение, но вы можете создать vmфункцию, которая делает что-то другое, если вы действительно этого хотите.

Связанный контент