Setara dengan cmd "di mana" di PowerShell

62

Sepertinya saya tidak dapat menemukan apa pun tentang Powershell yang setara dengan whereperintah dari cmd. Haruskah saya hanya menyebutnya dari cmdatau ada sesuatu yang lebih elegan di PS?


sumber
Bacaan menarik yang saya temukan kadang-kadang kembali di Where.exe dan Get-ChildItem: blogs.technet.com/b/heyscriptingguy/archive/2010/07/24/…
Shawn Melton

Jawaban:

59

Gunakan Get-Commandcommandlet yang melewatinya nama yang dapat dieksekusi. Ini mengisi properti Path dari objek yang dikembalikan (dari tipe ApplicationInfo ) dengan jalur yang sepenuhnya diselesaikan ke executable.

# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
zdan
sumber
8
Jika Anda mendapati diri Anda sering menggunakan ini, Anda dapat menyingkat perintah sebagai gcmganti mengetik seluruh Get-Commandkata setiap kali
Moshe Katz
@ MosheKatz Terima kasih! gcm notepadtelah bekerja sempurna untuk saya ketika saya hanya ingin melihat file mana yang saya panggil.
Shawn Wang
1
Dan ini, cowok dan cewek, adalah bagaimana Anda terlalu memperumit hal-hal berguna yang sudah benar. Jika tidak rusak, jangan memperbaikinya.
AFP_555
Terima kasih banyak atas perintah ini. Saya dapat Add-Type tanpa hardcoding jalan.
Jason TEPOORTEN
22

Jika Anda hanya ingin memiliki fungsi yang sama tanpa menggunakan cmd, Anda dapat menelepon where.exedari PowerShell, selama C:\Windows\System32ada di jalur Anda. Perintah where(tanpa .exe) adalah alias Where-Object, jadi tentukan saja nama lengkapnya.

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...
dipangkas
sumber
8

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

Itulah yang dilakukan where.exe lama ... apakah ada fungsi yang lebih spesifik yang ingin Anda tiru?

Sunting: Sebagai tanggapan terhadap komentar Joshua ... oh, Anda juga ingin mencari variabel lingkungan PATH Anda? Tidak masalah.

Foreach($_ In $Env:Path -Split ';')
{
    Get-ChildItem $_ -Recurse *.dll
}
Ryan Ries
sumber
1
"Di mana" juga mencari PATH juga
Joshua McKinnon
3
oh, you want to search your PATH environment variables too? Um, ya, itulah seluruh titik untuk where, jika tidak, anda bisa menggunakan dir. Der. :-P
Synetech
4

wherebukan cmdperintah bawaan. Ini adalah aplikasi mandiri ( where.exe), jadi PowerShell secara tegas tidak "membutuhkan pengganti".

Jadi mengapa tidak wherebekerja di PowerShell? Tampaknya tidak melakukan apa-apa:

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

Secara default wherealias ke cmdlet PS bawaan .

PS C:\> get-help where

NAME
    Where-Object
...
ALIASES
    where
    ?

Ya, itu bagus untuk diketahui, tetapi apakah ada cara untuk menghindari panggilan where-objectsaat mencoba menelepon where.exe?

Jawabannya iya.

Pilihan 1

Panggil where.exedengan ekstensi. (Ini adalah cara praktis untuk mengatasi masalah prioritas aliasing dan ekstensi file lainnya.)

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

pilihan 2

Hapus alias.

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

Catatan Samping

Jawaban zdan mengusulkan penggunaan Get-Commandsebagai alternatif. Meskipun sedikit lebih verbose (bahkan ketika menggunakan gcmalias default ), ia memiliki fungsi yang lebih kaya daripada where.exe. Jika digunakan dalam skrip, perhatikan perbedaan halus antara keduanya. Misalnya where.exemengembalikan semua kecocokan, sedangkan Get-Commandmengembalikan hanya hasil pertama kecuali Anda memasukkan -TotalCountparameter opsional .

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

Dan akhirnya, jika Anda menghapus wherealias default , Anda mungkin juga mempertimbangkan untuk menetapkan kembali itu sebagai alias untuk Get-Command. (Tapi ini mungkin akan bermanfaat bagi yang meragukan.)

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