เทียบเท่าของ cmd's“ ที่ไหน” ใน powershell


60

ฉันไม่สามารถดูเหมือนจะหาอะไรเกี่ยวกับเทียบเท่า Powershell ของคำสั่งจากwhere cmdฉันควรจะเรียกมันจากcmdหรือว่ามีอะไรที่สวยงามกว่าใน PS?


การอ่านที่น่าสนใจฉันพบบางครั้งใน Where.exe และ Get-ChildItem: blogs.technet.com/b/heyscriptingguy/archive/2010/07/24/…
Shawn Melton

คำตอบ:


59

ใช้Get-Commandcommandlet ผ่านมันชื่อของปฏิบัติการ มันเติมคุณสมบัติเส้นทางของวัตถุที่ส่งคืน (ชนิดApplicationInfo ) ด้วยเส้นทางที่ได้รับการแก้ไขอย่างเต็มที่เพื่อปฏิบัติการ

# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe

8
หากคุณพบว่าตัวเองใช้สิ่งนี้มากคุณสามารถย่อคำสั่งgcmแทนที่จะพิมพ์Get-Commandคำทั้งหมดทุกครั้ง
Moshe Katz

@MosheKatz ขอบคุณ! gcm notepadทำงานได้อย่างสมบูรณ์แบบสำหรับฉันเมื่อฉันแค่ต้องการดูไฟล์ที่ฉันโทร
Shawn Wang

1
และนี่คือเด็กชายและเด็กหญิงเป็นสิ่งที่คุณทำสิ่งที่มีประโยชน์เกินความซับซ้อนซึ่งถูกต้องแล้ว หากยังไม่พังอย่าแก้ไข
AFP_555

ขอบคุณมากสำหรับคำสั่งนี้ ฉันสามารถเพิ่มประเภทโดยไม่ต้องฮาร์ดโค้ดเส้นทาง
Jason TEPOORTEN

22

หากคุณเพียงแค่ต้องการให้มีฟังก์ชันการทำงานเดียวกันโดยไม่ต้องเรียกใช้ cmd คุณสามารถโทรwhere.exeจาก PowerShell ได้ตราบใดที่C:\Windows\System32อยู่ในเส้นทางของคุณ คำสั่งwhere(ไม่มี. exe) เป็นชื่อWhere-Objectแทนดังนั้นโปรดระบุชื่อเต็ม

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...

8

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

นั่นคือสิ่งที่ where.exe เก่าทำ ... มีฟังก์ชั่นเฉพาะเจาะจงมากกว่าที่คุณพยายามเลียนแบบหรือไม่?

แก้ไข: เพื่อตอบสนองต่อความคิดเห็นของ Joshua ... โอ้คุณต้องการค้นหาตัวแปรสภาพแวดล้อม PATH ของคุณด้วยหรือไม่ ไม่มีปัญหา.

Foreach($_ In $Env:Path -Split ';')
{
    Get-ChildItem $_ -Recurse *.dll
}

1
"Where" ค้นหาเส้นทางด้วยเช่นกัน
Joshua McKinnon

3
oh, you want to search your PATH environment variables too? อืมใช่ว่าเป็นจุดรวมไปมิฉะนั้นคุณก็สามารถใช้where dirเดอร์ :-P
Synetech

3

whereไม่ใช่cmdคำสั่งในตัว เป็นแอปพลิเคชันแบบสแตนด์อโลน ( where.exe) ดังนั้นการพูดอย่างเคร่งครัด PowerShell ไม่จำเป็นต้องมี "การเปลี่ยน"

เหตุใดจึงไม่whereทำงานใน PowerShell ดูเหมือนว่าจะไม่ทำอะไรเลย:

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

โดยค่าเริ่มต้นwhereจะใช้นามแฝงกับ PS cmdlet ในตัว

PS C:\> get-help where

NAME
    Where-Object
...
ALIASES
    where
    ?

ดีมากที่รู้ แต่มีวิธีหลีกเลี่ยงการโทรwhere-objectเมื่อพยายามโทรwhere.exeหรือไม่

คำตอบคือใช่

ตัวเลือกที่ 1

โทรwhere.exeพร้อมนามสกุล (นี่เป็นวิธีที่สะดวกในการแก้ไขปัญหาเรื่องนามแฝงและลำดับความสำคัญของนามสกุลไฟล์)

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

ตัวเลือก 2

ลบนามแฝง

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

หมายเหตุด้านข้าง

คำตอบของ zdanเสนอให้ใช้Get-Commandเป็นทางเลือก แม้ว่ามันจะเป็นเรื่องเล็ก ๆ น้อย ๆ ขึ้น verbose (แม้เมื่อใช้ค่าเริ่มต้นgcmนามแฝง) where.exeก็มีการทำงานยิ่งขึ้นกว่า หากใช้ในการเขียนสคริปต์ให้ใส่ใจกับความแตกต่างที่ลึกซึ้งระหว่างทั้งสอง เช่นwhere.exeส่งคืนการจับคู่ทั้งหมดในขณะที่Get-Commandส่งกลับผลลัพธ์แรกเท่านั้นเว้นแต่คุณจะรวม-TotalCountพารามิเตอร์ทางเลือก

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

และสุดท้ายถ้าคุณลบเริ่มต้นนามแฝงที่คุณอาจยังพิจารณากำหนดใหม่ที่เป็นชื่อแทนไปwhere Get-Command(แต่นี่อาจเป็นประโยชน์ที่น่าสงสัย)

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:\>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.