42

Кажется, я ничего не могу найти в Powershell, эквивалентном команде where из cmd . Должен ли я просто позвонить из cmd или есть что-то более элегантное в PS?

4 ответа4

40

Используйте командлет Get-Command передав ему имя исполняемого файла. Он заполняет свойство Path возвращаемого объекта (типа ApplicationInfo) полностью разрешенным путем к исполняемому файлу.

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

Если вам нужна такая же функциональность без вызова 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...
9

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

Это в значительной степени то, что делает старый файл where.exe ... была ли более специфическая функциональность, которую вы пытаетесь имитировать?

Изменить: В ответ на комментарий Джошуа ... о, вы тоже хотите искать переменные среды PATH? Нет проблем.

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

where не встроенная команда cmd . Это отдельное приложение (where.exe), поэтому, строго говоря, PowerShell "не нуждается в замене".

Так почему же не where , где работа в PowerShell? Вроде ничего не делает

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

По умолчанию, where псевдоним встроенного командлета PS.

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

Примечания стороны

Ответ Здана предлагает использовать Get-Command в качестве альтернативы. Хотя он немного более многословен (даже при использовании псевдонима 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:\>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .