Nie mogę znaleźć niczego na temat odpowiednika wherepolecenia Powershell z cmd. Czy powinienem to po prostu wywołać, cmdczy może jest coś bardziej eleganckiego w PS?
Nie mogę znaleźć niczego na temat odpowiednika wherepolecenia Powershell z cmd. Czy powinienem to po prostu wywołać, cmdczy może jest coś bardziej eleganckiego w PS?
Odpowiedzi:
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
gcmzamiast za Get-Commandkażdym razem wpisywać całe słowo
gcm notepaddziała idealnie dla mnie, gdy chcę tylko zobaczyć, do którego pliku dzwonię.
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...
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
}
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
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:\>