如何获取在 Windows(PowerShell)中通过 %PATH% 找到的可执行文件的实际绝对路径?

如何获取在 Windows(PowerShell)中通过 %PATH% 找到的可执行文件的实际绝对路径?

当我打开 PowerShell 窗口并键入可执行文件名以运行它时,我希望在 Windows 中%PATH%$Env:Path在 pwsh 中)环境变量中指定的文件夹中找到实际的可执行文件。有没有办法检索针对某个文件名运行的(或将要运行的)可执行文件的实际绝对路径?我想到了类似的东西:

Get-EnvPath msbuild.exe

将会返回类似这样的内容:

C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe

答案1

刚刚看到你的问题,并尝试阐述一个简单的解决方案,没有任何花哨的点网类。好老的纯 powershell ;-)。

它应该在任何地方工作,只要环境变量“path”可用并且安装了 powershell(5.x、Core、7),即使在 unixoid 系统(例如 linux、mac OS 等)上也是如此,尽管有一些注意事项。

Function Get-EnvPath {
    param (
        [string]$filename
    )
    $env:Path -split ";" | Where-Object {
        Test-Path -Path (Join-Path -Path $_ -ChildPath $filename)  -PathType Leaf
    } | ForEach-Object {
        Return (Join-Path -Path $_ -ChildPath $filename)
    }
}

此脚本将返回路径变量中包含的文件夹中搜索到的任何文件名,从而让我们能够更灵活地选择要执行的内容,而不是仅仅将可执行文件的名称输入到 CLI 或脚本中并依赖系统 (Windows) 的首次匹配原则。不幸的是,我不知道 Linux 如何处理相同的任务。

Sample Output:
==============

PS C:\testDir\> Get-EnvPath -filename notepad.exe
C:\Windows\system32\notepad.exe <---- first  match
C:\Windows\notepad.exe          <---- second match

为了绝对确保用户列出(找到)的可执行文件也可以由用户执行,我们必须检查找到的文件的几个属性和标志。主要说的是 Windows 下的 ACL 读取和执行权限。在 Linux 下,检查文件的访问属性(d-rwx-rwx-rwx)或 ACL。

但要小心,Linux 中的某些可执行文件会忽略 ACL 并仅依赖于文件访问属性。

相关内容