Я, здається, не можу знайти нічого про еквівалент 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
з powerhell, поки це 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
Бічні примітки
Відповідь zdan пропонує використовувати 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:\>