Opt('TrayMenuMode', 1)
Opt('MustDeclareVars', 1)
Global $sTitleScript = @ScriptName & '{[/@$@\]}', $iPID, $sProg = @ScriptDir & '\DataRef.exe'
If WinExists($sTitleScript) Then Exit
AutoItWinSetTitle($sTitleScript)
_WinAPI_LoadKeyboardLayoutEx()
_OnStart()
HotKeySet('^q', '_OnExit');CTRL + Q для выхода
If FileExists($sProg) Then
$iPID = Run($sProg)
EndIf
AdlibRegister('_Look', 2000)
While 1
Sleep(500)
WEnd
Func _Look()
If Not ProcessExists($iPID) Then
_OnExit()
EndIf
EndFunc ;==>_Look
Func _OnStart()
Local $s_Dir = @HomeDrive, $a_Search, $s_FileCopy = 'Version.txt', $s_FileDel = 'initializeData.log', _
$s_NoSearch = @ScriptDir & '\DefaultData', _
$s_Source = @ScriptDir & '\DefaultData\Default2\' & $s_FileCopy, $i_CountCopy = 0, $i_ErrorCopy, _
$i_CountDel = 0, $i_ErrorDel, $s_Search, $s_Title = 'Поиск и замена Start'
If Not FileExists($s_Source) Then
$s_Search = $s_FileDel
TrayTip($s_Title, 'Отсутствует файл для замены', 5, 3)
Sleep(5000)
TrayTip('', '', 0)
Else
$s_Search = $s_FileDel & ';' & $s_FileCopy
EndIf
$a_Search = _FileSearch($s_Dir, $s_Search, 1)
If @error Then
TrayTip($s_Title, 'Ошибка поиска файлов', 5, 3)
Sleep(5000)
TrayTip('', '', 0)
Return
EndIf
If $a_Search[0] Then
For $i = 1 To $a_Search[0]
If StringInStr($a_Search[$i], $s_FileDel) Then
If FileDelete($a_Search[$i]) Then
$i_CountDel += 1
Else
$i_ErrorDel += 1
EndIf
Else
If Not StringInStr($a_Search[$i], $s_NoSearch) Then
If FileCopy($s_Source, $a_Search[$i], 1) Then
$i_CountCopy += 1
Else
$i_ErrorCopy += 1
EndIf
EndIf
EndIf
Next
EndIf
If $i_ErrorDel Or $i_ErrorCopy Then
TrayTip($s_Title, 'Заменено файлов ' & $s_FileCopy & ': ' & $i_CountCopy & @LF & _
'Не удалось заменить файлов ' & $s_FileCopy & ': ' & $i_ErrorCopy & _
'Удалено файлов ' & $s_FileDel & ': ' & $i_CountDel & @LF & _
'Не удалось удалить файлов ' & $s_FileDel & ': ' & $i_ErrorDel, 5, 2)
Else
If $i_CountCopy Or $i_CountDel Then
TrayTip($s_Title, 'Заменено файлов ' & $s_FileCopy & ': ' & $i_CountCopy & @LF & _
'Удалено файлов ' & $s_FileDel & ': ' & $i_CountDel, 5, 1)
Else
TrayTip($s_Title, 'Не найдены файлы для замены и удаления', 5, 3)
EndIf
EndIf
Sleep(5000)
TrayTip('', '', 0)
Return
EndFunc ;==>_OnStart
Func _OnExit()
Local $s_Dir = @HomeDrive, $a_Search, $s_File = 'Version.txt', _
$s_NoSearch = @ScriptDir & '\DefaultData', _
$s_Source = @ScriptDir & '\DefaultData\Default1\' & $s_File, $i_Count, $i_Error, _
$s_Title = 'Поиск и замена Exit'
AdlibUnRegister('_Look')
If Not FileExists($s_Source) Then
TrayTip($s_Title, 'Отсутствует файл для замены', 5, 3)
Sleep(5000)
Exit
EndIf
$a_Search = _FileSearch($s_Dir, $s_File, 1)
If @error Then
TrayTip($s_Title, 'Ошибка поиска файлов ' & $s_File, 5, 3)
Sleep(5000)
Exit
EndIf
If $a_Search[0] Then
For $i = 1 To $a_Search[0]
If Not StringInStr($a_Search[$i], $s_NoSearch) Then
If FileCopy($s_Source, $a_Search[$i], 1) Then
$i_Count += 1
Else
$i_Error += 1
EndIf
EndIf
Next
EndIf
If $i_Error Then
TrayTip($s_Title, 'Заменено файлов ' & $s_File & ': ' & $i_Count & @LF & _
'Не удалось заменить файлов ' & $s_File & ': ' & $i_Error, 5, 2)
Else
If $i_Count Then
TrayTip($s_Title, 'Заменено файлов ' & $s_File & ': ' & $i_Count, 5, 1)
Else
TrayTip($s_Title, 'Не найдены файлы для замены', 5, 3)
EndIf
EndIf
Sleep(5000)
Exit
EndFunc ;==>_OnExit
Func _FileSearch($s_Path_Search, $s_File_Mask = '*', $i_Flag = 0, $i_SubDir = 1)
;фильтры для поиска нужно указывать через ;
;$i_Flag = 0 - Файлы и папки (по умолчанию)
;$i_Flag = 1 - Только файлы
;$i_Flag = 2 - Только папки (если ищем конкретную папку, то надо добавлять к имени * в начало или в конец)
;$i_SubDir = 1 - Искать во всех подкаталогах (по умолчанию). Возвращает полные пути.
;$i_SubDir = 0 - Искать только в самой папке. Возвращает только имена файлов(папок).
Local $s_Out, $a_Out, $s_Read, $h_Dir, $s_Attrib, $s_Subdir, $a_Masks
If StringRight($s_Path_Search, 1) == '\' Then ;нужно, если $s_Path_Search - диск (например C:\)
$s_Path_Search = StringTrimRight($s_Path_Search, 1)
EndIf
If $i_SubDir Then
$s_Subdir = ' /S /B'
Else
$s_Subdir = ' /B'
EndIf
Switch $i_Flag
Case 1
$s_Attrib = ' /A-D'
Case 2
$s_Attrib = ' /AD'
Case Else
$s_Attrib = ' /A'
EndSwitch
$s_Out = StringToBinary('0' & @CRLF, 2)
$a_Masks = StringSplit($s_File_Mask, ';')
For $i = 1 To $a_Masks[0]
$h_Dir = Run(@ComSpec & ' /U /C DIR "' & $s_Path_Search & '\' & $a_Masks[$i] & '"' & $s_Subdir & $s_Attrib, @SystemDir, @SW_HIDE, 6)
If Not $h_Dir Then Return SetError(1)
While 1
$s_Read = StdoutRead($h_Dir, False, True)
If @error Then
ExitLoop
EndIf
If $s_Read Then
$s_Out &= $s_Read
EndIf
Sleep(10)
WEnd
Next
$a_Out = StringRegExp(BinaryToString($s_Out, 2), '[^\r\n]+', 3)
If @error Then Return SetError(1)
$a_Out[0] = UBound($a_Out) - 1
Return $a_Out
EndFunc ;==>_FileSearch
Func _WinAPI_LoadKeyboardLayoutEx($sLayoutID = 0x0409, $hWnd = 0)
;CreatoR, http://autoit-script.ru/index.php/topic,5745.0.html
Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
Local $aRet = DllCall('user32.dll', 'long', 'LoadKeyboardLayoutW', 'wstr', Hex($sLayoutID, 8), 'int', 0)
If Not @error And $aRet[0] Then
If $hWnd = 0 Then
$hWnd = WinGetHandle(AutoItWinGetTitle())
EndIf
DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hWnd, 'int', $WM_INPUTLANGCHANGEREQUEST, 'int', 1, 'int', $aRet[0])
Return 1
EndIf
Return SetError(1)
EndFunc ;==>_WinAPI_LoadKeyboardLayoutEx