Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Замена строчки в bat файле на несколько других (http://forum.oszone.net/showthread.php?t=143912)

ZeroCrash 01-07-2009 12:27 1156285

Замена строчки в bat файле на несколько других
 
Вот код скрипта, который заменяет одну строчку батника на другую (по вашему усмотрению):

Код:

#Include <File.au3>
$FileList = _FileListToArray(@ScriptDir, "*.bat",1);создаём массив со списком всех bat файлов.
For $i = 1 to $FileList[0]; крутим цикл, столько раз, сколько у нас файлов
$File = FileOpen (@ScriptDir&"\"&$FileList[$i], 0);открыть для чтения
$File_text = FileRead ($File);читаем файл
FileClose ($File);закрываем
;Заменяем в тексте искомую строку на нашу
$File_new_text = StringReplace ($File_text, "искомая строка", "на которую нужно заменить")
$File = FileOpen (@ScriptDir&"\"&$FileList[$i], 2);открыть для записи и удалить имеющееся содержание
FileWrite ($File, $File_new_text); пишем изменённый текст в файл
FileClose ($File);закрываем
Next
MsgBox(0,"Сообщение","Операция завершена")

Но у меня возникла потребность заменить 1 строчку батника на 3 строчки....подскажите что нужно подправить в скрипте, чтобы он стал способен на это?
Заранее благодарен!

amel27 01-07-2009 12:53 1156307

ZeroCrash,

- у тебя замена не строки, а "фразы", которая может быть частью строки;
- формулируй точней: ЧТО (точное условие) и ЧЕМ заменить

ZeroCrash 01-07-2009 13:03 1156318

Заменить надо именно строку.

Допустим надо заменить
chcp 1251
на
echo ------------------------------------------->>%randomValue%.txt
echo ------------------------------------------->>%randomValue%.txt
echo ------------------------------------------->>%randomValue%.txt

amel27 01-07-2009 14:32 1156412

ZeroCrash, вариант для "правильных" файлов (все строки заканчиваются на CRLF)
Код:

#Include <File.au3>

$sFrom = "chcp 1251"
$sTo  = "echo ------------------------------------------->>%randomValue%.txt" &@CRLF& _
        "echo ------------------------------------------->>%randomValue%.txt" &@CRLF& _
        "echo ------------------------------------------->>%randomValue%.txt"

$FileList = _FileListToArray(@ScriptDir, "*.cmd", 1) ; создаём массив со списком всех bat файлов.
For $i=1 to $FileList[0] ; крутим цикл, столько раз, сколько у нас файлов
    $r = _FileLinesReplace(@ScriptDir&"\"& $FileList[$i], $sFrom, $sTo)
    ConsoleWrite("Обработан файл: "& $FileList[$i] &" произведено замен: "& $r &@CRLF)
Next

; -----------------------------------------
; Пользовательская функция (UDF)
; Замена в файле $sFile строки
; с текстом $sFrom на строку/строки $sTo
; -----------------------------------------

Func _FileLinesReplace($sFile, $sFrom, $sTo)
    Local $sText, $hFile, $iRepl

    $sFrom
= @CRLF& $sFrom
    $sTo
  = @CRLF& $sTo

    $sText
= @CRLF& FileRead($sFile)
    $hFile = FileOpen (@ScriptDir&"\"&$FileList[$i], 2)

    $sText = StringReplace($sText, $sFrom,  $sTo)
    $iRepl = @extended
    $sText = StringTrimLeft($sText, 2)

    FileWrite ($hFile, $sText)
    FileClose ($hFile)

    Return $iRepl
EndFunc ; ==> _FileLinesReplace


amel27 02-07-2009 04:12 1156913

при отладке не мог понять, почему такой простой скрипт не всегда работает - оказалось, глючил текстовый редактор FAR - проставлял один CR вместо CRLF, на этот случай сваял команду "нормализации" текстового файла - все непарные CR/LF заменяются на корректную пару (можно вставлять в скрипт для надежности):
Код:

$sText = StringRegExpReplace ($sText, "(?:\r\n|[\r\n])", @CRLF)


Время: 06:07.

Время: 06:07.
© OSzone.net 2001-