zda*_*dan 150
使用Get-Command命令行开关将可执行文件的名称传递给它。它使用完全解析的可执行文件路径填充返回对象(类型为ApplicationInfo)的 Path 属性。
# ~> (get-command notepad.exe).Path
C:\WINDOWS\system32\notepad.exe
Run Code Online (Sandbox Code Playgroud)
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)
Get-ChildItem C:\SomeDir -Recurse *.dll
这几乎就是旧的 where.exe 所做的......您是否试图模仿更具体的功能?
编辑:为了回应约书亚的评论......哦,你也想搜索你的 PATH 环境变量?没问题。
Foreach($_ In $Env:Path -Split ';')
{
Get-ChildItem $_ -Recurse *.dll
}
Run Code Online (Sandbox Code Playgroud)
小智 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)