
Намереваюсь запустить 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-VM
PowerCLI VMware?
PS C:\temp> get-command get-vm | select Name,Source
Name Source
---- ------
Get-VM VMware.VimAutomation.Core
Я, должно быть, упускаю что-то глупое. Я бы подумал, что приведенный выше вызов where.exe
должен был бы раскрыть что-то важное на моем пути. В любом случае поведение не меняется после установки $env:PATH = $null
.
Как косяк, я мог бы явно переопределить vm
via 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
функцию, которая делает что-то другое, если вы действительно этого хотите.