我似乎找不到任何有关 Powershell 等效于where
命令的内容cmd
。我应该从中调用它cmd
还是 PS 中有更优雅的东西?
答案1
使用Get-Command
commandlet 向其传递可执行文件的名称。它填充返回对象的 Path 属性(类型申请信息) 以及可执行文件的完整解析路径。
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
答案2
如果您只是希望在不调用 cmd 的情况下获得相同的功能,where.exe
那么只要C:\Windows\System32
在您的路径中,您就可以从 powershell 调用。该命令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...
答案3
where
不是内置cmd
命令。它是一个独立应用程序 ( where.exe
),因此严格来说 PowerShell 不需要“替换”。
那么为什么where
在 PowerShell 中不起作用?它似乎什么也不做:
PS C:\> where where
PS C:\>
默认情况下where
别名为内置 PS cmdlet。
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:\>
答案4
Get-ChildItem C:\SomeDir -Recurse *.dll
这几乎就是旧的 where.exe 所做的...您是否试图模仿更具体的功能?
编辑:回应 Joshua 的评论...哦,您也想搜索您的 PATH 环境变量吗?没问题。
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}