相当于powershell中cmd的“where”

140 windows powershell

我似乎无法找到任何wherecmd. 我应该直接调用它cmd还是在 PS 中有更优雅的东西?

zda*_*dan 150

使用Get-Command命令行开关将可执行文件的名称传递给它。它使用完全解析的可执行文件路径填充返回对象(类型为ApplicationInfo)的 Path 属性。

# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
Run Code Online (Sandbox Code Playgroud)

  • 如果你发现自己经常使用它,你可以将命令缩写为 `gcm`,而不是每次都输入整个 `Get-Command` 单词 (25认同)

mop*_*led 45

如果您只是希望在不调用 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...
Run Code Online (Sandbox Code Playgroud)


Dis*_*ned 26

where不是内置cmd命令。它是一个独立的应用程序 ( where.exe),所以严格来说 PowerShell 不需要“替换”。

那么为什么where在 PowerShell 中不起作用呢?它似乎什么都不做:

PS C:\> where where
PS C:\>
Run Code Online (Sandbox Code Playgroud)

默认情况下where,别名为内置的 PS cmdlet。

PS C:\> get-help where

NAME
    Where-Object
...
ALIASES
    where
    ?
Run Code Online (Sandbox Code Playgroud)

嗯,很高兴知道,但是有没有办法where-object在尝试调用时避免调用where.exe

答案是,是的。

选项1

where.exe用分机呼叫。(这是解决其他别名和文件扩展优先级问题的便捷方法。)

PS C:\> where.exe where
C:\Windows\System32\where.exe
Run Code Online (Sandbox Code Playgroud)

选项 2

删除别名。

PS C:\> Remove-Item alias:\where -Force
PS C:\> where where
C:\Windows\System32\where.exe
Run Code Online (Sandbox Code Playgroud)

旁注

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:\>
Run Code Online (Sandbox Code Playgroud)

最后,如果您删除默认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:\>
Run Code Online (Sandbox Code Playgroud)

  • `(gcm some_program -All).Path` 复制 `where.exe` 的默认行为 (5认同)

Rya*_*ies 8

Get-ChildItem C:\SomeDir -Recurse *.dll

这几乎就是旧的 where.exe 所做的......您是否试图模仿更具体的功能?

编辑:为了回应约书亚的评论......哦,你也想搜索你的 PATH 环境变量?没问题。

Foreach($_ In $Env:Path -Split ';')
{
    Get-ChildItem $_ -Recurse *.dll
}
Run Code Online (Sandbox Code Playgroud)

  • `哦,你也想搜索你的 PATH 环境变量吗?` 嗯,是的,这就是 `where` 的*点*,否则你可以只使用 `dir`。德。`:-P` (5认同)
  • “where”也搜索路径 (2认同)

小智 7

谁有这个想法来定义别名,以便您无法调用 PATH 中存在的系统可执行文件?

无论如何,最可靠的解决方案是定义别名,我习惯于:

PS H:\> Set-Alias which where.exe
PS H:\> which notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
PS H:\>
Run Code Online (Sandbox Code Playgroud)