Aliasing-Verwirrung – was hat „vm“ auf „Get-VM“ abgebildet?

Aliasing-Verwirrung – was hat „vm“ auf „Get-VM“ abgebildet?

Ich möchte vim von hier aus starten.

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

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

Ich habe versehentlich vmanstelle von eingegeben vimund es folgte viel Kopfzerbrechen:

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).

Wie finde und entferne ich die Konfiguration, die scheinbar der PowerCLI von VMware vmzugeordnet ist?Get-VM

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

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

Ich muss etwas Dummes übersehen haben. Ich hätte gedacht, dass der obige Aufruf von where.exeirgendetwas Relevantes auf meinem Pfad aufgedeckt haben sollte. Jedenfalls ändert sich das Verhalten nach dem Festlegen nicht $env:PATH = $null.

Als Behelf könnte ich vmvia explizit Set-Aliasin einen nicht vorhandenen Befehl umdefinieren. Aber ich würde gerne verstehen, warum ich beim Ausführen nicht so etwas wie unten sehe vm. Was habe ich übersehen?

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.

Die obigen Ergebnisse waren mit und ohne VMware.VimAutomation.Coreexplizit importiertes Modul reproduzierbar.

Antwort1

Dies ist kein „Aliasing-Problem“, sondern Teil des „Verb-First“-Ansatzes von PowerShell zur Befehlsbenennung.

PowerShell übernimmt Get-bei Cmdlets automatisch das Verb, wenn kein Verb angegeben ist.

Sie können das ausprobieren, indem Sie einfach einige Befehle wie usw. schreiben childitem. locationEs wird automatisch ausgeführt Get-ChildItemundGet-Location

Dies erklärt auch das Verhalten der verschiedenen Cmdlets, mit denen Sie dieses Verhalten herausfinden wollten:

  • Get-Command vm- da „vm“ nicht der Befehl ist, wurde er nicht gefunden.
  • Get-Alias vm- da es sich auch nicht um einen Alias ​​handelt, konntest du es hier auch nicht finden.

Dieses Verhalten gilt nicht für benutzerdefinierte Funktionen oder Konsolenanwendungen. Deshalb können Sie Funktionen erstellen, die aufgerufen werden, DoStuffund PowerShell führt dies nicht automatisch aus.Get-DoStuff

Sie können dieses Verhalten nicht ändern, aber Sie können eine vmFunktion erstellen, die etwas anderes tut, wenn Sie das wirklich möchten.

verwandte Informationen