Что нового

Найти и удалить и заменит

StarEdik

Новичок
Сообщения
365
Репутация
4
Версия AutoIt: 3.3.6.1

Описание:
Привет и спасибо всем отзывающимся.
Проблема такая. Вместе со скриптом имеется папка DefaultData.А в этой папке имеются еше 2 папки Default1 и Default2 и в каждом из этих папок лежит файл Version.txt. В Default1 файл без изменения а в Default2 файл с измененными настройками.
Нужен скрипт который должен
При запуске
1.Найти и удалить C:\...\ initializeData.log файл.
2.Найти и заменит C:\...\ Version.txt на файл (@ScriptDir & "\ DefaultData\ Default2\ Version.txt ")

При завершении
1.Найти и заменит C:\...\ Version.txt на файл (@ScriptDir & "\ DefaultData\ Default1\ Version.txt ")

Примечания:

Файлы находятся в корневом диске С:\ (точный путь не известен)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik [?]
При запуске...
При завершении
1. При запуске скрипта или системы?
2. При завершении скрипта (если да, то как и когда он должен завершиться) или системы?
3. Я у себя на диске C:\ нашел три файла Version.txt. Как скрипт должен определить, какой из них менять?
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles [?]
1. При запуске скрипта или системы?
Скрипт запускаю сам.Так что - При запуске скрипта
2. При завершении скрипта (если да, то как и когда он должен завершиться) или системы?
Я сам звершаю выполнения скрипта
3. Я у себя на диске C:\ нашел три файла Version.txt. Как скрипт должен определить, какой из них менять?

Всё что найдет пусть заменяет
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Не знаю разберёшся ты или нет, но вот ;D:
Код:
HotKeySet('^q', '_OnExit');CTRL + Q для выхода

DirCopy(@ScriptDir & "\DefaultData", 'D:\') ;Копируем папку DefaultData в диск D:\

;1)Найти и удалить  C:\...\ initializeData.log   файл.
$Search1 = _FileSearch("C:", "InitializeData.log", 1)   ;Ищет файл initializeData.log в диске C:

If $Search1[0] = 0 Then    ;Если не найден не один файл, то...
    MsgBox(64, 'Ошибка', 'Файл не найдет')
Else    ;Если найден(ы) файл(ы), то...
    For $i = 1 To $Search1[0]
        FileDelete($Search1[$i]) ;Удаляет все найденные файлы InitializeData.log
    Next
EndIf

;2)Найти и заменит C:\...\ Version.txt  на  файл (@ScriptDir & "\ DefaultData\ Default2\ Version.txt  ")
$Search2 = _FileSearch("C:", "Version.txt", 1)   ;Ищет файл Version.txt в диске C:

If $Search2[0] = 0 Then    ;Если не найден не один файл, то...
    MsgBox(64, 'Ошибка', 'Файл не найдет')
Else    ;Если найден(ы) файл(ы), то...
    For $j = 1 To $Search2[0]
        FileCopy(@ScriptDir & "\DefaultData\Default2\Version.txt", $Search2[$j], 1) ;Заменяет все найденные файлы Version.txt на @ScriptDir & "\DefaultData\Default2\Version.txt"
    Next
EndIf

Run(@ScriptDir & '\DataRef.exe') ;Запускаем программу

While 1
	If Not ProcessExists('DataRef.exe') Then _OnExit() ;Если закрыть программу DataRef.exe
    Sleep(100)
WEnd

;3)Найти и заменит C:\...\ Version.txt  на  файл  (@ScriptDir & "\  DefaultData\ Default1\ Version.txt  ")
Func _OnExit() ;Функция для завершения
    $Search3 = _FileSearch("C:", "Version.txt", 1)   ;Ищет файл Version.txt в диске C:

    If $Search3[0] = 0 Then    ;Если не найден не один файл, то...
        MsgBox(64, 'Ошибка', 'Файл не найдет')
    Else    ;Если найден(ы) файл(ы), то...
        For $h = 1 To $Search3[0]
            FileCopy(@ScriptDir & '\DefaultData\Default1\Version.txt', $Search3[$h], 1) ;Заменяет все найденные файлы Version.txt на @ScriptDir & '\DefaultData\Default1\Version.txt'
        Next
    EndIf

	FileCopy("D:\DefaultData", @ScriptDir, 1) ;Копируем папку DefaultData из диска D:\ в папку скрипта
	Exit
EndFunc

;Функция для поиска файла
Func _FileSearch($sPath, $sFileMask, $iFlag = 0)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1

    Return $aOut
 EndFunc
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Zaramot [?]
Не знаю разберёшся ты или нет
Спасибо Огромное.После такой доскональности Постараюсь понят.
И вот еше.
Если прогу запускаю с помощью скрипта программа запускается с моими настройками, а так с настройками по умолчанию.Тепер скрипт должен изменит настройки а потом запустить программу на выполнения
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
StarEdik, что за настройки ? :blink:

После выполнения 1 и 2 пункта он должен запустить некую программу ?
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Zaramot [?]
После выполнения 1 и 2 пункта он должен запустить некую программу ?
Да.
И вот ,скрипт выдает ошибку
ERROR: FileDelete() [built-in] called with wrong number of args.
FileDelete('InitializeData.log', $Search1[$i], 1)
Error:Incorrect number of parameters in function call.

При нажатии CTRL + Q для выхода скрипт не завершает свою работу
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Спасибо Получилось.
Но есть одно Но.Если я запускаю скрипт с диска С где он находится вместе с файлами то эти файлы тоже заменяются.Думаю файлы в папке должны быть под другими именами , ну например Version_1.txt и Version_2.txt .А при замене должны сохранятся с именами Version.txt .Как сделать это.
И как после этой процедуры запустит прогамму DataRef.exe
А при завершение (закрытии ) программы DataRef.exe завершить работу скрипта
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
И вот ,скрипт выдает ошибку
ERROR: FileDelete() [built-in] called with wrong number of args.
FileDelete('InitializeData.log', $Search1[$i], 1)
Error:Incorrect number of parameters in function call.

При нажатии CTRL + Q для выхода скрипт не завершает свою работу

Исправил.

И как после этой процедуры запустит прогамму DataRef.exe
А при завершение (закрытии ) программы DataRef.exe завершить работу скрипта

Исправил.

P.S. А если перед пунктом 1, скопировать Version_1.txt и Version_2.txt в другой диск, а по завершению скопировать обратно ?
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Zaramot

Если я запускаю скрипт с диска С где он находится вместе с файлами то эти файлы тоже заменяются.Думаю файлы в папке должны быть под другими именами , ну например Version_1.txt и Version_2.txt .А при замене должны сохранятся с именем Version.txt .Как сделать это.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Если я запускаю скрипт с диска С где он находится вместе с файлами то эти файлы тоже заменяются.Думаю файлы в папке должны быть под другими именами , ну например Version_1.txt и Version_2.txt .А при замене должны сохранятся с именем Version.txt .Как сделать это.
Исправил. Первое что делает скрипт, это копирует папку DefaultData в диск D:\ (если что - замени). А по завершению копирует её обратно.

Можно ещё записать инфо. из файлов Version.txt в переменные, а по завершению записать их назад:
Код:
HotKeySet('^q', '_OnExit');CTRL + Q для выхода

$Read1 = FileRead(@ScriptDir & '\DefaultData\Default1\Version.txt') ;Записываем текст из файла Default1\Version.txt в переменныю
$Read2 = FileRead(@ScriptDir & '\DefaultData\Default2\Version.txt') ;Записываем текст из файла Default2\Version.txt в переменныю

;1)Найти и удалить  C:\...\ initializeData.log   файл.
$Search1 = _FileSearch("C:", "InitializeData.log", 1)   ;Ищет файл initializeData.log в диске C:

If $Search1[0] = 0 Then    ;Если не найден не один файл, то...
    MsgBox(64, 'Ошибка', 'Файл не найдет')
Else    ;Если найден(ы) файл(ы), то...
    For $i = 1 To $Search1[0]
        FileDelete($Search1[$i]) ;Удаляет все найденные файлы InitializeData.log
    Next
EndIf

;2)Найти и заменит C:\...\ Version.txt  на  файл (@ScriptDir & "\ DefaultData\ Default2\ Version.txt  ")
$Search2 = _FileSearch("C:", "Version.txt", 1)   ;Ищет файл Version.txt в диске C:

If $Search2[0] = 0 Then    ;Если не найден не один файл, то...
    MsgBox(64, 'Ошибка', 'Файл не найдет')
Else    ;Если найден(ы) файл(ы), то...
    For $j = 1 To $Search2[0]
        FileCopy(@ScriptDir & "\DefaultData\Default2\Version.txt", $Search2[$j], 1) ;Заменяет все найденные файлы Version.txt на @ScriptDir & "\DefaultData\Default2\Version.txt"
    Next
EndIf

Run(@ScriptDir & '\DataRef.exe') ;Запускаем программу

While 1
	If Not ProcessExists('DataRef.exe') Then _OnExit() ;Если закрыть программу DataRef.exe
    Sleep(100)
WEnd

;3)Найти и заменит C:\...\ Version.txt  на  файл  (@ScriptDir & "\  DefaultData\ Default1\ Version.txt  ")
Func _OnExit() ;Функция для завершения
    $Search3 = _FileSearch("C:", "Version.txt", 1)   ;Ищет файл Version.txt в диске C:

    If $Search3[0] = 0 Then    ;Если не найден не один файл, то...
        MsgBox(64, 'Ошибка', 'Файл не найдет')
    Else    ;Если найден(ы) файл(ы), то...
        For $h = 1 To $Search3[0]
            FileCopy(@ScriptDir & '\DefaultData\Default1\Version.txt', $Search3[$h], 1) ;Заменяет все найденные файлы Version.txt на @ScriptDir & '\DefaultData\Default1\Version.txt'
        Next
    EndIf

	;Удаляем файлы Version.txt из папок Default1 и Default2
	FileDelete(@ScriptDir & '\DefaultData\Default1\Version.txt')
	FileDelete(@ScriptDir & '\DefaultData\Default2\Version.txt')
	
	Sleep(100)
	
	;Сохраняет (создаёт) файлы Version.txt в папках Default1 и Default2
	FileWrite(@ScriptDir & '\DefaultData\Default1\Version.txt', $Read1)
	FileWrite(@ScriptDir & '\DefaultData\Default2\Version.txt', $Read2)
	Exit
EndFunc

;Функция для поиска файла
Func _FileSearch($sPath, $sFileMask, $iFlag = 0)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1

    Return $aOut
 EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Мой вариант:
Код:
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
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Zaramot

Просто нет слов.Ну очень впечатлительно. :smile:Большое и огромное вам спасибо.Сейчас проверю скрипт .А на последок хотелось бы узнать.
Как то можно папку DefaultData с субпапками и файлами вшить в скрипт (в ехе).Если да то в скрипте будут какие ни будь изменения



Добавлено:
Сообщение автоматически объединено:

madmasles
скрипт файл InitializeData.log не удалил и завершил свою работу не заменяя файл Version.txt

Zaramot
Копирование папки DefaultData в локальный диск D не происходить.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik [?]
скрипт файл InitializeData.log не удалил и завершил свою работу не заменяя файл Version.txt
Значит Вы не все говорите, я свой скрипт тестрировал.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Zaramot
Копирование папки DefaultData в локальный диск D не происходить.
Исправил, нужно было поменять FileCopy на DirCopy :smile:

Как то можно папку DefaultData с субпапками и файлами вшить в скрипт (в ехе).Если да то в скрипте будут какие ни будь изменения
Вот. Я запихнул только файлы Default1\Version.txt и Default2\Version.txt. Больше не надо иметь папку около скрипта для замены, так как скрипт будет заменять найденные файлы - файлами из самого .exe:
Код:
;Добавляем файлы
#AutoIt3Wrapper_Res_File_Add=DefaultData\Default1\Version.txt, rt_rcdata, VERSION_DEFAULT_1
#AutoIt3Wrapper_Res_File_Add=DefaultData\Default2\Version.txt, rt_rcdata, VERSION_DEFAULT_2

#include <Resources.au3> ;Подключаем библиотеку

HotKeySet('^q', '_OnExit');CTRL + Q для выхода

;1)Найти и удалить  C:\...\ initializeData.log   файл.
$Search1 = _FileSearch("C:", "InitializeData.log", 1)   ;Ищет файл initializeData.log в диске C:

If $Search1[0] = 0 Then    ;Если не найден не один файл, то...
    MsgBox(64, 'Ошибка', 'Файл не найдет')
Else    ;Если найден(ы) файл(ы), то...
    For $i = 1 To $Search1[0]
        FileDelete($Search1[$i]) ;Удаляет все найденные файлы InitializeData.log
    Next
EndIf

;2)Найти и заменит C:\...\ Version.txt  на  файл (@ScriptDir & "\ DefaultData\ Default2\ Version.txt  ")
$Search2 = _FileSearch("C:", "Version.txt", 1)   ;Ищет файл Version.txt в диске C:

If $Search2[0] = 0 Then    ;Если не найден не один файл, то...
    MsgBox(64, 'Ошибка', 'Файл не найдет')
Else    ;Если найден(ы) файл(ы), то...
    For $j = 1 To $Search2[0]
        _ResourceSaveToFile($Search2[$j], 'VERSION_DEFAULT_2', $RT_RCDATA) ;Заменяет все найденные файлы Version.txt на @ScriptDir & "\DefaultData\Default2\Version.txt"
    Next
EndIf

Run(@ScriptDir & '\DataRef.exe') ;Запускаем программу

While 1
    If Not ProcessExists('DataRef.exe') Then _OnExit() ;Если закрыть программу DataRef.exe
    Sleep(100)
WEnd

;3)Найти и заменит C:\...\ Version.txt  на  файл  (@ScriptDir & "\  DefaultData\ Default1\ Version.txt  ")
Func _OnExit() ;Функция для завершения
	ProcessClose('DataRef.exe') ;Закрывает процес программы DataRef.exe
	Do
	Until Not ProcessExists('DataRef.exe') ;Ждёт завершение программы DataRef.exe
    $Search3 = _FileSearch("C:", "Version.txt", 1)   ;Ищет файл Version.txt в диске C:

    If $Search3[0] = 0 Then    ;Если не найден не один файл, то...
        MsgBox(64, 'Ошибка', 'Файл не найдет')
    Else    ;Если найден(ы) файл(ы), то...
        For $h = 1 To $Search3[0]
            _ResourceSaveToFile($Search3[$h], 'VERSION_DEFAULT_1', $RT_RCDATA) ;Заменяет все найденные файлы Version.txt на @ScriptDir & '\DefaultData\Default1\Version.txt'
        Next
    EndIf
    Exit
EndFunc

;Функция для поиска файла
Func _FileSearch($sPath, $sFileMask, $iFlag = 0)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1

    Return $aOut
 EndFunc

1) Resources.au3 скачать можешь тут.
2) Скомпилируй с помощью AutoIt3Wrapper. Скачать его можешь тут.

P.S Надеюсь ты меня понял ;D
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Zaramot
Спасибо.Я так понял что он из ресурса берет эти файлы.Просто гений. Все ОК !!! :smile:
Отдельное благодарность тебе за терпение ,за аккуратность ,за объяснения и за хотения помочь.
Только прошу добавит код в Func _OnExit() чтоб при нажатии CTRL + Q скрипт сперва завершал выполнение программы DataRef.exe а потом все остальное выполнялось.
Скрипт должен ждать выгрузку программы DataRef.exe, убедиться что его нет .Это прграмма пока свою базу и настройки проверит пройдет время.




Добавлено:
Сообщение автоматически объединено:

madmasles
Извиняюсь за свою неточность .Ваш код работает .Но я вижу тепер отредактированный код.Я не этот код тестировал .Спасибо вам за помощь.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Только прошу добавит код в Func _OnExit() чтоб при нажатии CTRL + Q скрипт сперва завершал выполнение программы DataRef.exe а потом все остальное выполнялось.
Скрипт должен ждать выгрузку программы DataRef.exe, убедиться что его нет .Это прграмма пока свою базу и настройки проверит пройдет время.

Исправил. (Ответ 15 :smile:)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Zaramot
Ответ 15 принят с удоволствием
Спасибо за отклик. Желаю удачи и жду вашего ответа на другие мои вопросы :-[
 
Верх