Nie mogę znaleźć niczego na temat odpowiednika where
polecenia Powershell z cmd
. Czy powinienem to po prostu wywołać, cmd
czy może jest coś bardziej eleganckiego w PS?
Nie mogę znaleźć niczego na temat odpowiednika where
polecenia Powershell z cmd
. Czy powinienem to po prostu wywołać, cmd
czy może jest coś bardziej eleganckiego w PS?
Odpowiedzi:
Użyj Get-Command
komendy, 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
gcm
zamiast za Get-Command
każdym razem wpisywać całe słowo
gcm notepad
dział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.exe
z programu PowerShell, o ile C:\Windows\System32
jest 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
where
nie jest wbudowanym cmd
poleceniem. Jest to samodzielna aplikacja ( where.exe
), więc ściśle mówiąc, PowerShell nie „potrzebuje wymiany”.
Dlaczego więc nie where
działa w PowerShell? Wydaje się, że nic nie robi:
PS C:\> where where
PS C:\>
Domyślnie where
jest 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-object
podczas próby połączenia where.exe
?
Odpowiedź brzmi tak.
opcja 1
Zadzwoń where.exe
z 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-Command
jako alternatywy. Chociaż jest nieco bardziej szczegółowy (nawet przy użyciu domyślnego gcm
aliasu), ma bogatszą funkcjonalność niż where.exe
. Jeśli są używane w skryptach, zwróć uwagę na subtelne różnice między nimi. Np. where.exe
Zwraca wszystkie dopasowania, podczas gdy Get-Command
zwraca tylko pierwszy wynik, chyba że podasz -TotalCount
parametr 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 where
alias, 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:\>