Ну вот примерно так.
Код: Выделить всё
#include <GUIConstantsEx.au3>
If $CmdLine[0] < 1 Then
MsgBox (0, "", "Недостаточно параметров, должен быть 1.")
Exit
EndIf
Global $aList = _TCHLoadFileList($CmdLine[1])
Global $gReplaces = 0, $gMask
$hGUI = GUICreate("Поиск и замена", 563, 260, -1, -1)
$edSrc = GUICtrlCreateEdit("", 8, 72, 265, 145)
$edTrg = GUICtrlCreateEdit("", 288, 72, 265, 145)
$btnOK = GUICtrlCreateButton("OK", 400, 224, 75, 25)
$btnCancel = GUICtrlCreateButton("Отмена", 480, 224, 75, 25)
GUICtrlCreateLabel("Текст для поиска", 8, 54, 94, 17)
GUICtrlCreateLabel("Текст для замены", 288, 54, 98, 17)
$cbCaseSence = GUICtrlCreateCheckbox("Учитывать регистр", 8, 232, 137, 17)
$edMask = GUICtrlCreateInput("*.*", 8, 24, 265, 21)
GUICtrlCreateLabel("Маска файлов", 8, 6, 78, 17)
GUISetState(@SW_SHOW)
If $aList[0] = 0 Then GUICtrlSetState($btnOK, $GUI_DISABLE)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $btnCancel
Exit
Case $btnOK
$gMask = _MaskToRegexp(GUICtrlRead($edMask))
For $i = 1 To $aList[0]
If StringRight($aList[$i], 1) = "" Then
_DoFolder($aList[$i])
Else
_DoFile($aList[$i])
EndIf
Next
MsgBox (0, "", "Выполнено замен: " & $gReplaces, 0, $hGUI)
Exit
EndSwitch
WEnd
Func _DoFolder($sFolder)
If $sFolder = "" Then Return
Local $sDirs = ""
Local $hSearch = FileFindFirstFile($sFolder & "*.*")
If @error Then Return
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
$sDirs &= $sFolder & $sFile & "" & @LF
ContinueLoop
EndIf
_DoFile($sFolder & $sFile)
Wend
FileClose($hSearch)
; Обработку каталогов приходится делать отдельно,
; чтобы не оставлять открытый поисковый хэндл,
; их максимально может быть 64
$aDirs = StringSplit($sDirs, @LF)
For $i = 1 To $aDirs[0]
_DoFolder($aDirs[$i])
Next
EndFunc
Func _DoFile($sFile)
If StringRegExp($sFile, $gMask) = 0 Then Return
Local $sSrcText = FileRead($sFile)
Local $sTrgText = StringReplace($sSrcText, GUICtrlRead($edSrc), GUICtrlRead($edTrg), 0, _
BitAND(GUICtrlRead($cbCaseSence), $GUI_CHECKED))
If @extended Then
$gReplaces += @extended
Local $hFile = FileOpen($sFile, 2)
FileWrite($hFile, $sTrgText)
FileClose($hFile)
EndIf
EndFunc
Func _MaskToRegexp($sMask)
$sMask = StringRegExpReplace($sMask, "(\\|\.|\+|\^|\(|\)|\[|\]|\{|\}|\$)", "\\\1")
$sMask = StringReplace($sMask, "?", ".")
$sMask = StringReplace($sMask, "*", ".+?")
Return("(?i)^" & $sMask & "$")
EndFunc
Func _TCHLoadFileList($sFileName)
Local $asList[1] = [0]
Local $hfList = FileOpen($sFileName, 0)
While 1
$sLine = FileReadLine($hfList)
If @error Then Exitloop
ReDim $asList[UBound($asList)+1]
$asList[UBound($asList)-1] = $sLine
Wend
FileClose($hfList)
$asList[0] = UBound($asList)-1
Return $asList
EndFunc
Да в принципе всё возможно. Только "окно на части" - это как? Тогда уж проще динамически сделать несколько табов с полями ввода. Ну или просто не закрывать окно после выполнения и менять код в первом поле.