Odpowiednik cmd „gdzie” w PowerShell

Odpowiedzi:

59

Użyj Get-Commandkomendy, przekazując nazwę pliku wykonywalnego. Wypełnia właściwość Path zwróconego obiektu (typu ApplicationInfo ) w pełni rozstrzygniętą ścieżką do pliku wykonywalnego.

# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
zdan
źródło
8
Jeśli często go używasz, możesz skrócić polecenie, gcmzamiast za Get-Commandkażdym razem wpisywać całe słowo
Moshe Katz,
@MosheKatz Dziękujemy! gcm notepaddziała idealnie dla mnie, gdy chcę tylko zobaczyć, do którego pliku dzwonię.
Shawn Wang
1
A to, chłopcy i dziewczęta, nadmiernie komplikujesz użyteczne rzeczy, które już miały rację. Jeśli nie jest zepsuty, nie naprawiaj go.
AFP_555,
Dziękuję bardzo za to polecenie. Mogę dodać typ bez zakodowania ścieżki.
Jason TEPOORTEN
22

Jeśli chcesz mieć tę samą funkcjonalność bez wywoływania cmd, możesz dzwonić where.exez programu PowerShell, o ile C:\Windows\System32jest to możliwe. Polecenie where(bez .exe) jest aliasowane Where-Object, więc po prostu podaj pełną nazwę.

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...
mopsled
źródło
8

Get-ChildItem C:\SomeDir -Recurse *.dll

To właściwie to, co robi stary where.exe ... czy była bardziej konkretna funkcjonalność, którą próbujesz naśladować?

Edycja: W odpowiedzi na komentarz Joshuy ... och, też chcesz przeszukać zmienne środowiskowe PATH? Nie ma problemu.

Foreach($_ In $Env:Path -Split ';')
{
    Get-ChildItem $_ -Recurse *.dll
}
Ryan Ries
źródło
1
„gdzie” również przeszukuje ŚCIEŻKĘ
Joshua McKinnon
3
oh, you want to search your PATH environment variables too? Um, tak, że to właśnie chodzi , aby where, w przeciwnym razie można po prostu używać dir. Der. :-P
Synetech,
3

wherenie jest wbudowanym cmdpoleceniem. Jest to samodzielna aplikacja ( where.exe), więc ściśle mówiąc, PowerShell nie „potrzebuje wymiany”.

Dlaczego więc nie wheredziała w PowerShell? Wydaje się, że nic nie robi:

PS C:\> where where
PS C:\>

Domyślnie wherejest aliasowany do wbudowanego polecenia cmdlet PS.

PS C:\> get-help where

NAME
    Where-Object
...
ALIASES
    where
    ?

Dobrze to wiedzieć, ale czy istnieje sposób na uniknięcie dzwonienia where-objectpodczas próby połączenia where.exe?

Odpowiedź brzmi tak.

opcja 1

Zadzwoń where.exez numerem wewnętrznym. (Jest to przydatny sposób na obejście innych problemów z aliasingiem i ustalaniem priorytetów rozszerzenia pliku).

PS C:\> where.exe where
C:\Windows\System32\where.exe

Opcja 2

Usuń alias.

PS C:\> Remove-Item alias:\where -Force
PS C:\> where where
C:\Windows\System32\where.exe

Notatki dodatkowe

Odpowiedź zdana proponuje użycie Get-Commandjako alternatywy. Chociaż jest nieco bardziej szczegółowy (nawet przy użyciu domyślnego gcmaliasu), ma bogatszą funkcjonalność niż where.exe. Jeśli są używane w skryptach, zwróć uwagę na subtelne różnice między nimi. Np. where.exeZwraca wszystkie dopasowania, podczas gdy Get-Commandzwraca tylko pierwszy wynik, chyba że podasz -TotalCountparametr opcjonalny .

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:\>

I wreszcie, jeśli usuniesz domyślny wherealias, możesz również rozważyć przypisanie go jako aliasu do Get-Command. (Ale prawdopodobnie byłoby to wątpliwe.)

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:\>
Rozczarowany
źródło