相当于 powershell 中 cmd 的“where”

相当于 powershell 中 cmd 的“where”

我似乎找不到任何有关 Powershell 等效于where命令的内容cmd。我应该从中调用它cmd还是 PS 中有更优雅的东西?

答案1

使用Get-Commandcommandlet 向其传递可执行文件的名称。它填充返回对象的 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
}

相关内容