Кажется, я не могу найти что-нибудь о Powershell, эквивалентном where
команде из cmd
. Должен ли я просто позвонить с cmd
или есть что-то более элегантное в PS?
Кажется, я не могу найти что-нибудь о Powershell, эквивалентном where
команде из cmd
. Должен ли я просто позвонить с cmd
или есть что-то более элегантное в PS?
Ответы:
Используйте Get-Command
командлет, передав ему имя исполняемого файла. Он заполняет свойство Path возвращаемого объекта (типа 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 ... была ли более специфическая функциональность, которую вы пытаетесь имитировать?
Изменить: В ответ на комментарий Джошуа ... о, вы тоже хотите искать переменные среды 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.
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:\>