别名混淆——什么将“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).

如何查找并删除似乎已从 VMware 的 PowerCLI映射vm到的配置?Get-VM

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 的“动词优先”命令命名方法的一部分。

Get-当未指定动词时,PowerShell 会自动假定cmdlet 上的动词。

你可以尝试一下,只需写一些命令,如childitemlocation,它会自动运行Get-ChildItemGet-Location

这也解释了您尝试找出此行为的不同 cmdlet 的行为:

  • Get-Command vm- 由于 vm 不是命令,因此未找到它。
  • Get-Alias vm- 因为它也不是一个别名,所以您也无法在这里找到它。

此行为不适用于用户定义函数或控制台应用程序,这就是为什么你可以创建函数调用DoStuff而 PowerShell 不会自动执行Get-DoStuff

您无法改变这种行为,但vm如果您确实想这样做,您可以创建一个执行其他操作的函数。

相关内容