#Region / Описание.
;§§[ INDEX ]§§ ============================================================================================================================
; Имя название ...............: Поиск и замена текста в файлах.
; Версия .....................: 1.2.0.0 ~> 1. Февраль. 2011.
; Последняя модификация ......: 01.02.2011
; Требования .................: AutoIt v3.3.6.0+, испытано на работоспособность, на WindowsXP SP3 RUS.
; Язык .......................: Русский
; Описание ...................: Пойск и замена текста в файлах.
; [ Возможность указать более одного фильтра (маска) для файлов.
; [ Возможность указать более одного параметра замены.
; [ Возможность указать более одного фильтра замены текста.
; [ Хорошая скорость поиска файлов, и замены текста - если фильтры (маски) указанны в разумных пределах. :)
; [ Есть параметр - зависит/не зависит, от регистра написания.
; [ Есть возможность постоянной зоздания резервной копии, не перезаписывая прошлую резервную копию.
; Включённые библиотеки ......: ~ ~ ~ ~
; Примечания .................: Опсуждение 'http://autoit-script.ru/index.php?topic=3852.msg28088;topicseen#new'
; Автор ......................: Andress. P. <[§ DRON §]>
; Включенные функции .........:
; [ _Files_Search Предложенный код от 'Creat0R' на форуме 'http://forum.oszone.net/post-1324937.html'
; [ _Find_And_Replace_Text
; [ _Vrite_To_File
; Недокументированые функции .: Отсутствуют.
; История версии .............:
; [ 1.2.0.0 ~> Созданна первая версия, на данный момент 'Beta'
; Пример испытуемого файла ...:
#Cs Проверенно на данной структуре - на трёх файлах в разных директориях - по назначению '$hDirectory' с тремя фильтрами замены.
2 1 2
3"Заменяемый текст 5"
4 Заменяемый текст б 76
5Заменяемый текст 7
45654645 45654654654654 45654654654654 Заменяемый текст 6 5654654654645654 65454
(Заменяемый текст 8)(Заменяемый текст 5)(Заменяемый текст 7)(Заменяемый текст 6)'
Заменяемый текст 7 Заменяемый текст А
1
2 Заменяемый текст 9|Заменяемый текст в|
3"Заменяемый текст 1"
4
5Заменяемый текст 3 6 7 7
45654645 45654654654654 45654654654654 Заменяемый текст 2 5654654654645654 65454
(Заменяемый текст 4)(Заменяемый текст 1)(Заменяемый текст 3)(Заменяемый текст 2)'
Заменяемый текст 3 Заменяемый текст в
#Ce
;==========================================================================================================================================
#EndRegion
Opt('MustDeclareVars', 1)
#Region / Настройки пользователя.
;==========================================================================================================================================
; Настройка отображения иконки в трее.
Opt('TrayIconHide', 1)
; 0 = Показать иконку в трее.
; 1 = Скрыть иконку в трее.
;==========================================================================================================================================
; Фильтр искомого/искомых файла/ов.
Global $sMasks = '*.cfg'
;~ Global $sMasks = '*.txt;*.ppk'
; Например...
; [ 'Tekst1.txt;Tekst2.txt;Tekst3.txt' ]
; [ '*.txt;*.ini' ]
; [ '*.txt' ]
; [ '*.*' ]
;==========================================================================================================================================
; Директория в которой искать.
Global $hDirectory = @DesktopDir&'\000'
; Например...
; [ 'C:\Windows' ]
; [ 'C:\Documents and Settings\Desktop' ]
;==========================================================================================================================================
; Новые тексты.
Global $sNewTexts = 'Новый текст 1;Новый текст 2;Новый текст 3'
; Например...
; [ 'Новый текст 1' ] Для одной замены.
; [ 'Новый текст 1;Новый текст 2' ] Для Двух замен.
; Для каждого 'Новыго текста' должна быть ячейка с текстом для замены, под соотведствуюшим номером.
;==========================================================================================================================================
; Тексты, которые нужно заменить новыми текстами.
Global $sOldTexts1 = 'Заменяемый текст 1;Заменяемый текст 2;Заменяемый текст 3;Заменяемый текст 4' ;> на - новый текст 1
Global $sOldTexts2 = 'Заменяемый текст 5;Заменяемый текст 6;Заменяемый текст 7;Заменяемый текст 8' ;> на - новый текст 2
Global $sOldTexts3 = 'Заменяемый текст 9;Заменяемый текст А;Заменяемый текст б;Заменяемый текст в' ;> на - новый текст 3
; Для одной замены ячейка с текстами или одним текстом под номером [ 1 ]
; Для Двух замен, две ячеики с номерами [ 1 ] и [ 2 ] И,Т,Д.
;==========================================================================================================================================
; Режим замены. Рекомендованно значение '1'
Global $Flag = 1
; Flag = Замена производитса...
; 0 = не зависит от регистра написания согласно языку пользователя (по умолчанию).
; 1 = зависит от регистра написания.
; 2 = не зависит от регистра написания согласно базовому/наиболее быстрому сравнению.
;==========================================================================================================================================
; Настройка резервной копии. Рекомендованно значение '1'
Global $iBack = 1
; 0 = Не делать резервную копию.
; 1 = Делать резервную копию.
#EndRegion
#Region / Основные параметры.
;==========================================================================================================================================
Global $TIMER_TOTAL = TimerInit() ; Таймер 'старт'...
Global $iTIMER_SEARCH, $aFile[1]
Global $aTotalFiles = 0
Global $iTotalRepl = 0
; ..............................
#EndRegion
_Find_And_Replace_Text($hDirectory, $sMasks, $sNewTexts, $Flag, $iBack)
;~ ConsoleWrite('Файлов найденно: '&$aFile[0]&' За: '&$iTIMER_SEARCH&' Мсек'&@CR)
;~ ConsoleWrite('Замен произведенно: '&$iTotalRepl&' В файлах: '&$aTotalFiles&' За: '&Round(TimerDiff($TIMER_TOTAL)/1000, 1)&' Мсек'&@CR)
#Region / Функции.
;==========================================================================================================================================
; Функция _Find_And_Replace_Text
Func _Find_And_Replace_Text($hDirectory, $sMasks, $sNewTexts, $Fl, $iBack)
Local $aFile = _Files_Search($hDirectory, $sMasks)
If $aFile = False Then Exit
For $i1 = 1 To $aFile[0]
Local $TIMER_REPL = TimerInit(), $iExt = 0, $sFileText
Local $sFileText = FileRead($aFile[$i1])
If $sFileText = -1 Then Return SetError(1, 2, 0) ; Фаил не удалось открыть.
If Not $sFileText = '' Then
Local $sNewText = StringSplit($sNewTexts, ';')
For $i2 = 1 To $sNewText[0]
Local $sOldTexts = StringSplit(Eval('sOldTexts' & $i2), ';', 2)
For $sOldText In $sOldTexts
If $sOldText = '' Then Return SetError(2, 2, 0) ; Не обозначен заменяемый текст.
If StringInStr($sFileText, $sOldText, $Fl) Then
$sFileText = StringReplace($sFileText, $sOldText, $sNewText[$i2])
$iExt += @extended
$iTotalRepl += @extended
EndIf
Next
Next
EndIf
If $iExt > 0 Then
Local $aResult = _Vrite_To_File($aFile[$i1], $sFileText, $iBack)
If $aResult = 0 Then Return SetError(3, 2, 0) ; Небыла произведена запись
$aTotalFiles += $aResult
;~ ConsoleWrite( _
;~ '===================================================================================='&@CR& _
;~ 'Фаил: '&$aFile[$i1]&@CR& _
;~ 'Замен произведенно: '&$iExt&' За: '&Round(TimerDiff($TIMER_REPL)/1000, 1)&' Мсек'&@CR& _
;~ '===================================================================================='&@CR)
EndIf
Next
Return $iTotalRepl
EndFunc ;==>_Find_And_Replace_Text
;==========================================================================================================================================
; Функция _Vrite_To_File ; Запись в файл обработанных данных...
Func _Vrite_To_File($sFile, $sData, $iBack = 1, $iF = 1)
If ($sFile = '' Or $sData = '') Then Return SetError(1, 3, 0) ; Указанны неверние параметры.
;~ If Not FileExists($sFile)
If StringInStr(FileGetAttrib($sFile), "R") Then Return SetError(2, 3, 0)
If $iBack = 1 Then
While FileExists($sFile &'.bak_' &$iF) ; Если резервный файл уже сушествует.
$iF += 1
WEnd
FileCopy($sFile, $sFile &'.bak_' &$iF, 0)
EndIf
Local $hFile=FileOpen($sFile,2)
If $hFile = -1 Then Return SetError(3, 3, 0) ; Фаил не удалось открыть.
Local $hWriteFile = FileWrite($hFile,$sData)
FileClose($hFile)
If $hWriteFile = -1 Then Return SetError(4, 3, 0 ) ; Фаил не удалось создать.
Return 1
EndFunc
;==========================================================================================================================================
; Функция _Files_Search ; Поиск файлов...
Func _Files_Search($sPath, $sFileMask)
Local $hDir, $sRead, $aOut, $TIMER_SEARCH = TimerInit()
Local $sPIF = StringInStr(FileGetAttrib($sPath & "\"), "D")
If Not $sPIF Then Return SetError(MsgBox(0, 'Ошибка!', 'Не верно указанна директория.'), '', 0)
Local $sOut = StringToBinary('0' & @CRLF, 2)
Local $aMasks = StringSplit($sFileMask, ';')
For $i = 1 To $aMasks[0]
If $aMasks[$i] = '' Then Return SetError(MsgBox(0, 'Ошибка!', 'Не верно обозначенна маска файлов.'), '', 0)
$hDir = Run(@ComSpec &' /U /C DIR "'& $sPath &'\'& $aMasks[$i] &'" /S/B/A-D', @SystemDir, @SW_HIDE, 6)
While 1
$sRead = StdoutRead($hDir, False, True)
If @error Then ExitLoop
If $sRead <> "" Then
$sOut &= $sRead
EndIf
Wend
Next
$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
If @error Then Return SetError(3, 1, 0)
$aOut[0] = UBound($aOut)-1
$iTIMER_SEARCH = Round(TimerDiff($TIMER_SEARCH)/1000, 1)
Return $aOut
EndFunc ;==>_Files_Search
#EndRegion
;