#include <Array.au3>
Opt('MustDeclareVars', 1)
Global $aMyProg[5][2] = [[4],['MyProg_1.exe'],['MyProg_2.exe'],['MyProg_3.exe'],['MyProg_4.exe']]
_GetPath($aMyProg)
_ArrayDisplay($aMyProg)
Func _GetPath(ByRef $a_MyProg)
Local $s_FileMask, $a_Files, $s_IniFile = @ScriptDir & '\MyProg.ini'
For $i = 1 To $a_MyProg[0][0]
$a_MyProg[$i][1] = IniRead($s_IniFile, 'Path', $a_MyProg[$i][0], 'error')
If $a_MyProg[$i][1] = 'error' Then
$a_MyProg[$i][1] = ''
$s_FileMask &= $a_MyProg[$i][0] & ';'
ContinueLoop
EndIf
If Not FileExists($a_MyProg[$i][1]) Then
$s_FileMask &= $a_MyProg[$i][0] & ';'
EndIf
Next
If Not $s_FileMask Then Return
$a_Files = _FileDirList('C:', $s_FileMask, 1);здесь поиск только на диске C:, но можно и на всех дисках искать
$s_FileMask = ''
If Not @error Then
For $i = 1 To $a_Files[0]
For $j = 1 To $a_MyProg[0][0]
If StringRegExp($a_Files[$i], $a_MyProg[$j][0] & '$') Then
$a_MyProg[$j][1] = $a_Files[$i]
IniWrite($s_IniFile, 'Path', $a_MyProg[$j][0], $a_MyProg[$j][1])
ExitLoop
EndIf
Next
Next
EndIf
For $i = 1 To $a_MyProg[0][0]
If Not $a_MyProg[$i][1] Then
$s_FileMask &= $a_MyProg[$i][0] & ', '
EndIf
Next
If Not $s_FileMask Then Return
MsgBox(48, 'Attention', 'No File(s): ' & StringTrimRight($s_FileMask, 2))
EndFunc ;==>_GetPath
Func _FileDirList($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
;CreatoR; http://autoit-script.ru/index.php/topic,8266.msg55775
Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles
If Not StringInStr(FileGetAttrib($sPath), "D") Then
Return SetError(1, 0, 0)
EndIf
If $iSubDir = 1 Then
$sAttrib &= ' /S'
EndIf
If $iSort = 1 Then
$sAttrib &= ' /O:N'
EndIf
Switch $iFlag
Case 1
$sAttrib &= ' /A-D'
Case 2
$sAttrib &= ' /AD'
Case Else
$sAttrib &= ' /A'
EndSwitch
$sOut = StringToBinary('0' & @CRLF, 2)
$sPath = StringRegExpReplace($sPath, '\\+$', '')
$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
$aMasks = StringSplit($sFileMask, ';')
For $i = 1 To $aMasks[0]
If StringStripWS($aMasks[$i], 8) = "" Then
ContinueLoop
EndIf
$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
If $i < $aMasks[0] Then
$sFiles &= ';'
EndIf
Next
$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
While 1
$sRead = StdoutRead($hDir, False, True)
If @error Then
ExitLoop
EndIf
If $sRead <> "" Then
$sOut &= $sRead
EndIf
Sleep(2)
WEnd
$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
If @error Or UBound($aOut) < 2 Then
Return SetError(2, 0, 0)
EndIf
$aOut[0] = UBound($aOut) - 1
Return $aOut
EndFunc ;==>_FileDirList