找回密码
 加入
搜索
查看: 4322|回复: 3

[系统综合] 【已解决,请版主改为已解决】如何获得exe完整路径

[复制链接]
发表于 2010-3-5 11:15:03 | 显示全部楼层 |阅读模式
本帖最后由 ccxw1983 于 2010-3-12 16:19 编辑

在系统环境变量%path%下面的exe可以直接运行,如cmd这样可以运行:
IEXPLORE.EXE "http://www.baidu.com"
请问对于这类exe文件,如何获得完整的路径?
不要用进程法获得完整路径。
我想可以读取环境变量path里面的目录,逐一查找,但是这样好笨的,有没有更加简洁的办法。



附上代码:
#include <WinAPI.au3>
#include <Array.au3>

MsgBox(0, "", getFullPathOfFileWhichShortNameExecutable("Explorer.exe"))
MsgBox(0, "", getFullPathOfFileWhichShortNameExecutable("IEXPLORE.EXE"))
MsgBox(0, "", getFullPathOfFileWhichShortNameExecutable("notepad.EXE"))
MsgBox(0, "", getFullPathOfFileWhichShortNameExecutable("SciTE.exe"))


;获得短文件名可执行的文件的完整路径,从环境变量%path%和注册表查找
Func getFullPathOfFileWhichShortNameExecutable($exe_name)
        Local $r = getExeFullPathFormPathEnv($exe_name)
        If $r <> "" Then
                Return $r
        Else
                Return findFullPathFormRegFoldRecursive($exe_name)
        EndIf
EndFunc   ;==>getFullPathOfFileWhichShortNameExecutable

;迭代所有目录查找值中含 $name 字样的
;MsgBox(0, "", findFullPathFormRegFoldRecursive("EXCEL.EXE","HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\EXCEL.EXE"))
;MsgBox(0, "", findFullPathFormRegFoldRecursive("EXCEL.EXE"))
Func findFullPathFormRegFoldRecursive($exe_name, $reg_fold = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications")
        If regFoldKey_ValueIsNotEmpty($reg_fold) Then
                Local $rsy = findFullPathFormRegFold($reg_fold, $exe_name)
                If $rsy <> "" Then Return $rsy
        EndIf

        If regFoldHasChildFold($reg_fold) Then
                Local $i1 = 1
                While 1
                        Local $fold_name_key = RegEnumKey($reg_fold, $i1)
                        If @error <> 0 Then
                                ExitLoop
                        Else
                                ;ConsoleWrite("$file_key:" & $fold_name_key  & @CRLF)
                                Local $newfold = $reg_fold & "" & $fold_name_key
                                ;MsgBox(0,"",$newfold)
                                Local $rsx = findFullPathFormRegFoldRecursive($exe_name, $newfold)
                                If $rsx <> "" Then Return $rsx
                        EndIf

                        ;Sleep(500)
                        $i1 = $i1 + 1
                WEnd
        EndIf

        Return ""
EndFunc   ;==>findFullPathFormRegFoldRecursive


;在目录枚举值,找到值中含 $name 字样的
Func findFullPathFormRegFold($reg_fold, $exe_name)
        $exe_name = StringLower($exe_name)

        Local $i = 1
        While 1
                Local $file_key = RegEnumVal($reg_fold, $i)
                If @error <> 0 Then ExitLoop
                ;ConsoleWrite("$file_key:"&$file_key&@CRLF)
                Local $file_value = RegRead($reg_fold, $file_key)
                Local $idx = StringInStr($file_value, "" & $exe_name)
                If $idx > 0 Then
                        $file_value = StringLeft($file_value, $idx + StringLen($exe_name))
                        $file_value = replaceEnvAsRealPath($file_value)
                        $file_value = StringReplace($file_value, '"', '')
                        Return $file_value
                EndIf

                $i = $i + 1
        WEnd

        Return ""
EndFunc   ;==>findFullPathFormRegFold

;目录有 键-值
;MsgBox(0,"",regFoldKey_ValueIsNotEmpty("HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\EXCEL.EXE"))
Func regFoldKey_ValueIsNotEmpty($reg_fold)
        RegEnumVal($reg_fold, 1)
        Return @error = 0
EndFunc   ;==>regFoldKey_ValueIsNotEmpty

;目录有子目录
Func regFoldHasChildFold($reg_fold)
        RegEnumKey($reg_fold, 1)
        Return @error = 0
EndFunc   ;==>regFoldHasChildFold

;替换环境变量为正常字符
;MsgBox(0,"",getRealPathEnv("%ClassPath%"))
Func replaceEnvAsRealPath($pathx)
        Local $array = StringRegExp($pathx, "%([^%]+)%", 1)
        If @error = 0 Then
                For $i = 0 To UBound($array) - 1
                        Local $oldstr = $array[$i]
                        Local $newstr = EnvGet($oldstr)
                        If $newstr <> "" Then
                                $pathx = StringReplace($pathx, "%" & $oldstr & "%", $newstr)
                        EndIf
                        Return $pathx
                Next

                MsgBox(0, "", $array[0])
                Return ""
        Else
                Return $pathx
        EndIf
EndFunc   ;==>replaceEnvAsRealPath


;test_regFoldRegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\EXCEL.EXE\shell\edit")
Func test_regFoldRegEnumKey($reg_fold)
        Local $i1 = 1
        While 1
                Local $key = RegEnumKey($reg_fold, $i1)

                If @error <> 0 Then
                        ExitLoop
                Else
                        ConsoleWrite("$key:" & $key & @CRLF)
                EndIf
                Sleep(500)
                $i1 = $i1 + 1
        WEnd
EndFunc   ;==>test_regFoldRegEnumKey

;test_regFoldRegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\EXCEL.EXE\shell\edit")
Func test_regFoldRegEnumVal($reg_fold)
        Local $i1 = 1
        While 1
                Local $val = RegEnumVal($reg_fold, $i1)

                If @error <> 0 Then
                        ExitLoop
                Else
                        ConsoleWrite("$val:" & $val & @CRLF)
                EndIf
                Sleep(500)
                $i1 = $i1 + 1
        WEnd
EndFunc   ;==>test_regFoldRegEnumVal



;在环境变量里面的 %PATH% 指定的目录找 exe 文件
Func getExeFullPathFormPathEnv($exe_name)
        Local $var = EnvGet("PATH")
        Local $ay = StringSplit($var, ";")

        Local $rs = _WinAPI_FindExecutable($exe_name, @ScriptDir)
        If $rs <> "" Then
                ;MsgBox(0, $exe_name, $patha)
                Return $rs
        EndIf

        For $i = 1 To $ay[0]
                Local $patha = $ay[$i]
                If StringInStr($patha, ":") > 0 Then
                        ;ConsoleWrite($patha & @CRLF)
                        $rs = _WinAPI_FindExecutable($exe_name, $patha)
                        If $rs <> "" Then
                                ;MsgBox(0, $exe_name, $patha)
                                Return $rs
                        EndIf
                EndIf
        Next

        Return ""
EndFunc   ;==>getExeFullPathFormPathEnv
发表于 2010-3-5 11:37:01 | 显示全部楼层
回复 1# ccxw1983
@AutoItExe

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-3-5 14:37:24 | 显示全部楼层
注册表中有相关位置存储本机的可直接执行的 EXE 或COM
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications

用AU3中注册表相关的命令就可以获取到!
 楼主| 发表于 2010-3-5 18:06:10 | 显示全部楼层
谢谢 maxkingmax 提示
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-7-3 06:51 , Processed in 0.079481 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表