Tôi dường như không thể tìm thấy bất cứ điều gì về một Powershell tương đương với where
lệnh từ cmd
. Tôi chỉ nên gọi nó từ cmd
hoặc có một cái gì đó thanh lịch hơn trong PS?
Tôi dường như không thể tìm thấy bất cứ điều gì về một Powershell tương đương với where
lệnh từ cmd
. Tôi chỉ nên gọi nó từ cmd
hoặc có một cái gì đó thanh lịch hơn trong PS?
Câu trả lời:
Sử dụng Get-Command
lệnh truyền cho nó tên của tệp thực thi. Nó cư trú thuộc tính Path của đối tượng được trả về (kiểu ApplicationInfo ) với đường dẫn được giải quyết đầy đủ đến tệp thực thi.
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
gcm
thay vì gõ toàn bộ Get-Command
từ mỗi lần
gcm notepad
đã làm việc hoàn hảo cho tôi khi tôi chỉ muốn xem tập tin nào tôi đang gọi.
Nếu bạn chỉ muốn có chức năng tương tự mà không cần gọi cmd, bạn có thể gọi where.exe
từ powershell, miễn C:\Windows\System32
là trong đường dẫn của bạn. Lệnh where
(không có .exe) được đặt bí danh Where-Object
, vì vậy chỉ cần chỉ định tên đầy đủ.
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
Đó là khá nhiều những gì mà.exe cũ đã làm ... có chức năng cụ thể hơn mà bạn đang cố gắng bắt chước không?
Chỉnh sửa: Đáp lại bình luận của Joshua ... oh, bạn cũng muốn tìm kiếm các biến môi trường PATH của mình chứ? Không vấn đề gì.
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}
oh, you want to search your PATH environment variables too?
Ừm, vâng, đó là toàn bộ vấn đề where
, nếu không bạn chỉ có thể sử dụng dir
. Der. :-P
where
không phải là một cmd
lệnh được xây dựng . Đây là một ứng dụng độc lập ( where.exe
), vì vậy, nói đúng ra PowerShell không "cần một sự thay thế".
Vậy tại sao không where
hoạt động trong PowerShell? Dường như không làm gì cả:
PS C:\> where where
PS C:\>
Theo mặc định, where
được đặt bí danh cho một lệnh ghép ngắn PS tích hợp.
PS C:\> get-help where
NAME
Where-Object
...
ALIASES
where
?
Chà, thật tuyệt khi biết, nhưng có cách nào để tránh gọi where-object
khi cố gọi where.exe
không?
Câu trả lời là có.
lựa chọn 1
Gọi where.exe
với phần mở rộng. (Đây là một cách thuận tiện để khắc phục các vấn đề ưu tiên mở rộng tệp và mở rộng tệp khác.)
PS C:\> where.exe where
C:\Windows\System32\where.exe
Tùy chọn 2
Xóa bí danh.
PS C:\> Remove-Item alias:\where -Force
PS C:\> where where
C:\Windows\System32\where.exe
Ghi chú bên
câu trả lời của zdan đề xuất sử dụng Get-Command
như là một thay thế. Mặc dù nó dài dòng hơn một chút (ngay cả khi sử dụng gcm
bí danh mặc định ), nó có chức năng phong phú hơn where.exe
. Nếu được sử dụng trong kịch bản, hãy chú ý đến sự khác biệt tinh tế giữa hai. Ví dụ where.exe
trả về tất cả các kết quả khớp, trong khi Get-Command
chỉ trả về kết quả đầu tiên trừ khi bạn bao gồm -TotalCount
tham số tùy chọn .
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:\>
Và cuối cùng, nếu bạn xóa where
bí danh mặc định , bạn cũng có thể xem xét việc gán lại đó là bí danh Get-Command
. (Nhưng điều này có lẽ sẽ mang lại lợi ích đáng ngờ.)
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:\>