ฉันไม่สามารถดูเหมือนจะหาอะไรเกี่ยวกับเทียบเท่า Powershell ของคำสั่งจากwhere
cmd
ฉันควรจะเรียกมันจากcmd
หรือว่ามีอะไรที่สวยงามกว่าใน PS?
ฉันไม่สามารถดูเหมือนจะหาอะไรเกี่ยวกับเทียบเท่า Powershell ของคำสั่งจากwhere
cmd
ฉันควรจะเรียกมันจากcmd
หรือว่ามีอะไรที่สวยงามกว่าใน PS?
คำตอบ:
ใช้Get-Command
commandlet ผ่านมันชื่อของปฏิบัติการ มันเติมคุณสมบัติเส้นทางของวัตถุที่ส่งคืน (ชนิดApplicationInfo ) ด้วยเส้นทางที่ได้รับการแก้ไขอย่างเต็มที่เพื่อปฏิบัติการ
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
gcm
แทนที่จะพิมพ์Get-Command
คำทั้งหมดทุกครั้ง
gcm notepad
ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันเมื่อฉันแค่ต้องการดูไฟล์ที่ฉันโทร
หากคุณเพียงแค่ต้องการให้มีฟังก์ชันการทำงานเดียวกันโดยไม่ต้องเรียกใช้ 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...
Get-ChildItem C:\SomeDir -Recurse *.dll
นั่นคือสิ่งที่ where.exe เก่าทำ ... มีฟังก์ชั่นเฉพาะเจาะจงมากกว่าที่คุณพยายามเลียนแบบหรือไม่?
แก้ไข: เพื่อตอบสนองต่อความคิดเห็นของ Joshua ... โอ้คุณต้องการค้นหาตัวแปรสภาพแวดล้อม PATH ของคุณด้วยหรือไม่ ไม่มีปัญหา.
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}
oh, you want to search your PATH environment variables too?
อืมใช่ว่าเป็นจุดรวมไปมิฉะนั้นคุณก็สามารถใช้where
dir
เดอร์ :-P
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:\>