当我打开 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 并仅依赖于文件访问属性。