Кажется, я ничего не могу найти в Powershell, эквивалентном команде where
из cmd
. Должен ли я просто позвонить из cmd
или есть что-то более элегантное в PS?
4 ответа
Используйте командлет Get-Command
передав ему имя исполняемого файла. Он заполняет свойство Path возвращаемого объекта (типа ApplicationInfo) полностью разрешенным путем к исполняемому файлу.
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
Если вам нужна такая же функциональность без вызова 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 ... была ли более специфическая функциональность, которую вы пытаетесь имитировать?
Изменить: В ответ на комментарий Джошуа ... о, вы тоже хотите искать переменные среды PATH? Нет проблем.
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}
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:\>