Ich kann anscheinend nichts über ein Powershell-Äquivalent des where
Befehls von finden cmd
. Soll ich es einfach anrufen cmd
oder gibt es etwas eleganteres in PS?
Ich kann anscheinend nichts über ein Powershell-Äquivalent des where
Befehls von finden cmd
. Soll ich es einfach anrufen cmd
oder gibt es etwas eleganteres in PS?
Antworten:
Get-Command
Übergeben Sie dem Commandlet den Namen der ausführbaren Datei. Es füllt die Path-Eigenschaft des zurückgegebenen Objekts (vom Typ ApplicationInfo ) mit dem vollständig aufgelösten Pfad zur ausführbaren Datei.
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
gcm
anstatt Get-Command
jedes Mal das ganze Wort einzugeben
gcm notepad
hat für mich perfekt funktioniert, wenn ich nur sehen möchte, welche Datei ich anrufe.
Wenn Sie nur die gleiche Funktionalität haben where.exe
möchten, ohne cmd aufzurufen, können Sie von Powershell aus anrufen, solange C:\Windows\System32
sich dies in Ihrem Pfad befindet. Der Befehl where
(ohne .exe) ist mit einem Alias versehen. Geben Sie Where-Object
einfach den vollständigen Namen an.
PS C:\Users\alec> where
cmdlet Where-Object at command pipeline position 1
...
PS C:\Users\alec> where.exe
The syntax of this command is:
WHERE [/R dir] [/Q] [/F] [/T] pattern...
Get-ChildItem C:\SomeDir -Recurse *.dll
Das ist so ziemlich das, was die alte where.exe macht ... gab es spezifischere Funktionen, die Sie nachahmen möchten?
Edit: Als Antwort auf Joshuas Kommentar ... oh, möchten Sie auch Ihre PATH-Umgebungsvariablen durchsuchen? Kein Problem.
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}
oh, you want to search your PATH environment variables too?
Äh, ja, das ist der springende Punkt zu where
, sonst kann man nur verwenden dir
. Der. :-P
where
ist kein eingebauter cmd
Befehl. Es ist eine eigenständige Anwendung ( where.exe
), sodass PowerShell streng genommen keinen "Ersatz" benötigt.
Warum funktioniert das where
in PowerShell nicht? Es scheint nichts zu tun:
PS C:\> where where
PS C:\>
Standardmäßig where
ist ein Alias für ein integriertes PS-Cmdlet festgelegt.
PS C:\> get-help where
NAME
Where-Object
...
ALIASES
where
?
Gut, das ist gut zu wissen, aber gibt es eine Möglichkeit, Anrufe zu vermeiden, where-object
wenn Sie versuchen anzurufen where.exe
?
Die Antwort ist ja.
Option 1
where.exe
Mit Nebenstelle anrufen . (Dies ist eine praktische Möglichkeit, um andere Probleme mit Aliasing und Priorisierung von Dateierweiterungen zu umgehen.)
PS C:\> where.exe where
C:\Windows\System32\where.exe
Option 2
Entfernen Sie den Alias.
PS C:\> Remove-Item alias:\where -Force
PS C:\> where where
C:\Windows\System32\where.exe
Randnotizen
Die Antwort von zdan schlägt vor, Get-Command
als Alternative zu verwenden. Obwohl es etwas ausführlicher ist (auch wenn der Standardalias verwendet wird gcm
), bietet es eine umfassendere Funktionalität als where.exe
. Achten Sie bei der Skripterstellung auf die feinen Unterschiede zwischen den beiden. ZB where.exe
gibt alle Übereinstimmungen zurück, während Get-Command
nur das erste Ergebnis zurückgegeben wird, sofern Sie nicht den optionalen -TotalCount
Parameter angeben.
PS C:\> where.exe notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
PS C:\> (gcm notepad).Path
C:\WINDOWS\system32\notepad.exe
PS C:\> (gcm notepad -TotalCount 5).Path
C:\WINDOWS\system32\notepad.exe
C:\WINDOWS\notepad.exe
PS C:\>
Und schließlich, wenn Sie den Standardalias entfernen where
, können Sie diesen auch als Alias zuweisen Get-Command
. (Aber das wäre wahrscheinlich von zweifelhaftem Nutzen.)
PS C:\> Set-Alias where Get-Command
PS C:\> where notepad
CommandType Name Version Source
----------- ---- ------- ------
Application notepad.exe 10.0.15... C:\WINDOWS\system32\notepad.exe
PS C:\> (where notepad).Path
C:\WINDOWS\system32\notepad.exe
PS C:\>