
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 vm
anstelle von eingegeben vim
und 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 vm
zugeordnet 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.exe
irgendetwas Relevantes auf meinem Pfad aufgedeckt haben sollte. Jedenfalls ändert sich das Verhalten nach dem Festlegen nicht $env:PATH = $null
.
Als Behelf könnte ich vm
via explizit Set-Alias
in 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.Core
explizit 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
. location
Es wird automatisch ausgeführt Get-ChildItem
undGet-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, DoStuff
und PowerShell führt dies nicht automatisch aus.Get-DoStuff
Sie können dieses Verhalten nicht ändern, aber Sie können eine vm
Funktion erstellen, die etwas anderes tut, wenn Sie das wirklich möchten.