ฉันไม่สามารถดูเหมือนจะหาอะไรเกี่ยวกับเทียบเท่า Powershell ของคำสั่งจากwhere cmdฉันควรจะเรียกมันจากcmdหรือว่ามีอะไรที่สวยงามกว่าใน PS?
ฉันไม่สามารถดูเหมือนจะหาอะไรเกี่ยวกับเทียบเท่า Powershell ของคำสั่งจากwhere cmdฉันควรจะเรียกมันจากcmdหรือว่ามีอะไรที่สวยงามกว่าใน PS?
คำตอบ:
ใช้Get-Commandcommandlet ผ่านมันชื่อของปฏิบัติการ มันเติมคุณสมบัติเส้นทางของวัตถุที่ส่งคืน (ชนิด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:\>