Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как заменить строку в ENTRIES.INI средствами автоматизации.

Ответить
Настройки темы
[решено] Как заменить строку в ENTRIES.INI средствами автоматизации.

Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Изменения
Автор: semiono
Дата: 28-03-2009
Нужно немножко не сложной автоматики, но лучше чтоб кто-то подсказал...
Условия:
Имеется директория в которой файлы:
SVCPACK\
ENTRIES.INI

ENTRIES.INI выглядит так
Код: Выделить весь код
[EditFile]
SVCPACK.INF,SetupHotfixesToRun,AddProgram

[AddProgram]
filename.exe /verysilent
Мне нужно каждый раз положить в папку SVCPACK файл с новым именем *.exe и прописать его имя в ENTRIES.INI вместо filename.exe
и после этого запаковать в rar- архив.
rar a newname -ac -m3 -r -t SVCPACK ENTRIES.INI

Самое сложное наверное для меня заменить строку в ENTRIES.INI. Хотя и получить переменную прочитав SVCPACK\*.exe наверное тоже
не просто?

-------
Полезное сообщение


Отправлено: 03:13, 28-03-2009

 

Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Пожалуйста, добейте этот скрипт?
Нужны ещё две команды ->
FileDelete(@ScriptDir & $sFileName) ; это не обязательно, но желательно.
И главное для архивации ->
ShellExecute(@SystemDir & "\rar.exe", "a" & $sFileName & "-ac -m3 -r -t SVCPACK ENTRIES.INI", @ScriptDir, "", @SW_HIDE)
Хотя тут сложность в замене расширения .exe на .zip если брать $sFileName из в вашей функции.
Я сколько возился, никак не могу сам зделать... В общем виде примерно такое нужно.

Код: Выделить весь код
Global  $sIniFileName = 'entries.ini'
Global  $sDirPath = @ScriptDir & '\SVCPACK'

FileSetAttrib(@ScriptDir,"-RASHNOT",1)
FileSetAttrib(@ScriptDir,"-RASHNOT",1)
FileSetAttrib(@ScriptDir,"-RASHNOT",1)
FileSetTime(@ScriptDir,"20010101000000",0,1)
FileSetTime(@ScriptDir,"20010101000000",1,1)
FileSetTime(@ScriptDir,"20010101000000",2,1)

; FileDelete(@ScriptDir & $sFileName)

If StringRight($sDirPath, 1) == '\' Then $sDirPath = StringTrimRight($sDirPath, 1)
_FindFile()

Func _FindFile()
    Local $hFind, $sFileName

    $hFind = FileFindFirstFile($sDirPath & '\*.*')
    If $hFind == -1 Then
        MsgBox(16, '', 'FILE_NOT_FOUND')
        Exit
    EndIf

    While 1
        $sFileName = FileFindNextFile($hFind)
        If @error Then ExitLoop

        If $sFileName = $sIniFileName Then ContinueLoop

        _WriteFileName($sFileName)
        ExitLoop
    WEnd

    FileClose($hFind)
EndFunc

Func _WriteFileName($sFileName)
    Local $sIniFileText = FileRead($sIniFileName)
    $sIniFileText = StringRegExpReplace($sIniFileText, '(?s)(\[.+\]).+', '\1') & @CRLF & $sFileName & ' /verysilent'

    Local $hFile = FileOpen($sIniFileName, 2)
    FileWrite($hFile, $sIniFileText & @CRLF)
    FileClose($hFile)
EndFunc

; ShellExecute(@SystemDir & "\rar.exe", "a" & $sFileName & "-ac -m3 -r -t SVCPACK ENTRIES.INI", @ScriptDir, "", @SW_HIDE)
Exit

-------
Полезное сообщение


Отправлено: 01:09, 08-04-2009 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
Global  $sIniFileName = 'entries.ini'
Global  $sDirPath = @ScriptDir & '\SVCPACK'
If StringRight($sDirPath, 1) == '\' Then $sDirPath = StringTrimRight($sDirPath, 1)

FileSetAttrib($sDirPath, '-RASHNOT', 1)
FileSetAttrib($sDirPath, '-RASHNOT', 1)
FileSetAttrib($sDirPath, '-RASHNOT', 1)
FileSetTime($sDirPath, '20010101000000', 0, 1)
FileSetTime($sDirPath, '20010101000000', 1, 1)
FileSetTime($sDirPath, '20010101000000', 2, 1)

_FindFile('del')
MsgBox(64, 'Внимание', 'Скопирутей необходимый файл в папку:' & @CRLF & $sDirPath)
_FindFile('write')

Func _FindFile($sAction)
    Local $hFind, $sFileName

    $hFind = FileFindFirstFile($sDirPath & '\*.*')
    If $hFind == -1 Then
        MsgBox(16, '', 'FILE_NOT_FOUND')
        Exit
    EndIf

    While 1
        $sFileName = FileFindNextFile($hFind)
        If @error Then ExitLoop

        If $sFileName = $sIniFileName Then ContinueLoop

        If $sAction == 'write' Then
            _WriteFileName($sFileName)
            ExitLoop
        Else
            FileDelete($sDirPath & '\' & $sFileName)
        EndIf
    WEnd

    FileClose($hFind)
EndFunc

Func _WriteFileName($sFileName)
    Local $sIniFileText = FileRead($sIniFileName)
    $sIniFileText = StringRegExpReplace($sIniFileText, '(?s)(\[.+\]).+', '\1') & @CRLF & $sFileName & ' /verysilent'

    Local $hFile = FileOpen($sIniFileName, 2)
    FileWrite($hFile, $sIniFileText & @CRLF)
    FileClose($hFile)

    $sFileName = StringTrimRight($sFileName, 3) & 'zip'

;~  Run(@SystemDir & '\rar.exe', 'a' & $sDirPath & '\' & $sFileName & '-ac -m3 -r -t SVCPACK ENTRIES.INI', @ScriptDir, '', @SW_HIDE)
EndFunc

Про архивацию не понял, расскажите подробней.
Как / куда / откуда / что и кто / дожен архивироваться ...

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:39, 08-04-2009 | #12


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать



WinRAR.zip содержит:
*/SVCPACK/WinRAR.exe
*/ENTRIES.INI

rar.exe лежит в %пути%, как это и положенно в system32, если с этим что не понятно вдруг.
Всё происходит в @ScriptDir, файлик ENTRIES.au3 - это я так назвал автоит... когда зделаю основательно перегоню в EXE.
Ну а вся заморочка как обычно, чтоб различные имена подставлять.
Например, в другой раз имя архива и экзешника будут другими, не WinRAR, а скажем
SVCPACK\WinRoll.exe и > WinRoll.zip

Команда паковки была полностью правильная
ShellExecute(@SystemDir & "\rar.exe", "a " & $var &".zip -ac -m3 -r -t SVCPACK ENTRIES.INI", @ScriptDir, "", @SW_HIDE)
если только $var определить, с чем я не справляюсь.

В консоли так:
# rar.exe a WinRAR.zip -ac -m3 -r -t SVCPACK ENTRIES.INI

Совсем было бы хорошо потом ещё и скопировать (после создания архива)
@ScriptDir & "\SVCPACK\WinRAR.exe" в "D:\Apps" ; хранилище бинарей.
@ScriptDir & "\WinRAR.zip" в "D:\Patch" ; моё хранилище хотфиксов
Так как тут снова понадобиться каждый раз менять имя, то есть WinRAR нельзя оставить...
Но я могу обойтись. Хотяб запаковать автоматически

Сразу забыл сказать, удаление архива нужно лишь для чистоты работы, как бы предостережение от
создания архива поверх архива... Хотя впринципе это возможно, но как бы грязная работа...
Если архивы перетаскивать скриптом в хранилище, то можно и не зачищать скрипт директорию тогда.

Может что-то и не понятно всёравно? Я объясню. И спасибо, что уже облегчили мне рутинный труд.

-------
Полезное сообщение


Последний раз редактировалось semiono, 08-04-2009 в 08:17.


Отправлено: 07:52, 08-04-2009 | #13


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


работаю со вчеращено утра, читаю и понимаю - что ни чего не понимаю
проверьте так:

Код: Выделить весь код
Global  $sIniFileName = 'entries.ini'
Global  $sDirSvcPackPath = @ScriptDir & '\SVCPACK'
Global  $sDirAppsPath  = 'D:\Apps'
Global  $sDirArhivPath = 'D:\Patch'

If StringRight($sDirSvcPackPath, 1) == '\'  Then $sDirSvcPackPath = StringTrimRight($sDirSvcPackPath, 1)
If StringRight($sDirAppsPath, 1) == '\'     Then $sDirAppsPath = StringTrimRight($sDirAppsPath, 1)
If StringRight($sDirArhivPath, 1) == '\'    Then $sDirArhivPath = StringTrimRight($sDirArhivPath, 1)

If NOT FileExists($sDirSvcPackPath) Then DirCreate($sDirSvcPackPath)
If NOT FileExists($sDirAppsPath)    Then DirCreate($sDirAppsPath)
If NOT FileExists($sDirArhivPath)   Then DirCreate($sDirArhivPath)

FileSetAttrib($sDirSvcPackPath, '-RASHNOT', 1)
FileSetAttrib($sDirSvcPackPath, '-RASHNOT', 1)
FileSetAttrib($sDirSvcPackPath, '-RASHNOT', 1)
FileSetTime($sDirSvcPackPath, '20010101000000', 0, 1)
FileSetTime($sDirSvcPackPath, '20010101000000', 1, 1)
FileSetTime($sDirSvcPackPath, '20010101000000', 2, 1)

_FindFile()
_FindFile('del'); все что будет найденно в $sDirSvcPackPath будет удаленно

Func _FindFile($sAction='')
    Local $hFind, $sFileName

    $hFind = FileFindFirstFile($sDirSvcPackPath & '\*.*')
    If $hFind == -1 Then
        MsgBox(16, '', 'FILE_NOT_FOUND')
        Exit
    EndIf

    While 1
        $sFileName = FileFindNextFile($hFind)
        If @error Then ExitLoop

        If $sAction == 'del' Then
            FileDelete($sDirSvcPackPath & '\' & $sFileName)
        Else
            If $sFileName = $sIniFileName Then ContinueLoop
            _ArchivingCopyFile($sFileName)
            ExitLoop
        EndIf
    WEnd

    FileClose($hFind)
EndFunc

Func _ArchivingCopyFile($sFileName)
    Local $sIniFileText =   '[EditFile]' & @CRLF & 'SVCPACK.INF,SetupHotfixesToRun,AddProgram' & @CRLF & @CRLF & _
                            '[AddProgram]'  & @CRLF & $sFileName & ' /verysilent'

    Local $hFile = FileOpen($sIniFileName, 2)
    FileWrite($hFile, $sIniFileText & @CRLF)
    FileClose($hFile)

    Local $sFileNameZIP = StringTrimRight($sFileName, 3) & 'zip'

    Run(@SystemDir & '\rar.exe', 'a' & $sFileNameZIP & ' -ac -m3 -r -t SVCPACK ENTRIES.INI', @ScriptDir, '', @SW_HIDE)

    FileCopy($sDirSvcPackPath & '\' & $sFileName, $sDirAppsPath, 8); с перезаписью файлов с таким же названием
    FileCopy(@ScriptDir & '\' & $sFileNameZIP, $sDirArhivPath, 8); с перезаписью файлов с таким же названием
EndFunc

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:55, 08-04-2009 | #14


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


ошибка Run(@SystemDir & '\rar.exe', 'a' ...
надо так ShellExecute(@SystemDir & '\rar.exe', 'a ' ...

Екзешник полетел туда, куда надо успешно!
А вот zip почему-то в скрипт директории остаётся. Я подумаю над этим... Спасибо!!!!!
Но мне странно, почему здесь FileCopy как FileMove работает? Какраз FileMove мне более подходит!

Кажись, Sleep() надо добавить под архивацией... Теперь оно успевает, но архив действительно копируется,
а экзешник полностью перемещается из C:\SVCPACK в D:\Apps! Пока это загадка для мну... где-то баг затаился

-------
Полезное сообщение


Последний раз редактировалось semiono, 08-04-2009 в 10:31.


Отправлено: 10:09, 08-04-2009 | #15


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


недоглядел, надо так:
Код: Выделить весь код
Run(@SystemDir & '\rar.exe a' & $sFileNameZIP & ' -ac -m3 -r -t SVCPACK ENTRIES.INI', @ScriptDir, @SW_HIDE)
Цитата:
А вот zip почему-то в скрипт директории остаётся.
поройте уту строчку:
Цитата:
FileCopy(@ScriptDir & '\' & $sFileNameZIP, $sDirArhivPath, 8)
подправте адрес где находится ZIP файл: @ScriptDir & '\' & $sFileNameZIP

Цитата:
Но мне странно, почему здесь FileCopy как FileMove работает? Но мне Move какраз более подходит!
если что то лежит не в папке SVCPACK - то да.
а так, все что в папке SVCPACK, удаляется вот этой строчкой: _FindFile('del')

если кроме EXE и ZIP файла удалять больше ничего не нужно,
то _FindFile('del') можно не использовать, а использовать только FileMove

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:17, 08-04-2009 | #16


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Вообщем, я не сразу заметил _FindFile('del'), и думал что файлы зачищаются перемещением,
что собсно и выгодней было бы в моём случае.
Закоментировал _FindFile('del'), переправил все FileCopy на FileMove,
заменил Run() на ShellExecuteWait() Получилось то, что хотел! Ура!

Отличная работа! Труд не зря, спасибо! Такие скрипты надо собирать в коллекцию!

-------
Полезное сообщение


Последний раз редактировалось semiono, 08-04-2009 в 11:12.


Отправлено: 10:48, 08-04-2009 | #17


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Практически готовый конструктор для паковки хотфиксов
Вот что получилось:
Код: Выделить весь код
Global  $sDirAppsPath  = '.\Apps'
Global  $sDirArhivPath = '.\Patch'
Global  $sDirSvcPackPath = '.\SVCPACK'
Global  $sIniFileName = 'entries.ini'

If StringRight($sDirSvcPackPath, 1) == '\'  Then $sDirSvcPackPath = StringTrimRight($sDirSvcPackPath, 1)
If StringRight($sDirAppsPath, 1) == '\'     Then $sDirAppsPath = StringTrimRight($sDirAppsPath, 1)
If StringRight($sDirArhivPath, 1) == '\'    Then $sDirArhivPath = StringTrimRight($sDirArhivPath, 1)

If NOT FileExists($sDirSvcPackPath) Then DirCreate($sDirSvcPackPath)
If NOT FileExists($sDirAppsPath)    Then DirCreate($sDirAppsPath)
If NOT FileExists($sDirArhivPath)   Then DirCreate($sDirArhivPath)

FileSetAttrib(@ScriptDir, '-RASHNOT', 1)
FileSetAttrib(@ScriptDir, '-RASHNOT', 1)
FileSetAttrib(@ScriptDir, '-RASHNOT', 1)
FileSetTime(@ScriptDir, '20010101000000', 0, 1)
FileSetTime(@ScriptDir, '20010101000000', 1, 1)
FileSetTime(@ScriptDir, '20010101000000', 2, 1)

_FindFile()
; _FindFile('del'); все что будет найденно в $sDirSvcPackPath будет удаленно

Func _FindFile($sAction='')
    Local $hFind, $sFileName

    $hFind = FileFindFirstFile($sDirSvcPackPath & '\*.*')
    If $hFind == -1 Then
        MsgBox(16, '', 'FILE_NOT_FOUND')
        Exit
    EndIf

    While 1
        $sFileName = FileFindNextFile($hFind)
        If @error Then ExitLoop

;        If $sAction == 'del' Then
;            FileDelete($sDirSvcPackPath & '\' & $sFileName)
;        Else
            If $sFileName = $sIniFileName Then ContinueLoop
            _ArchivingCopyFile($sFileName)
            ExitLoop
;        EndIf
    WEnd

    FileClose($hFind)
EndFunc

Func _ArchivingCopyFile($sFileName)
    Local $sIniFileText =   '[EditFile]' & @CRLF & 'SVCPACK.INF,SetupHotfixesToRun,AddProgram' & @CRLF & @CRLF & _
                            '[AddProgram]'  & @CRLF & $sFileName & ' /verysilent'

    Local $hFile = FileOpen($sIniFileName, 2)
    FileWrite($hFile, $sIniFileText & @CRLF)
    FileClose($hFile)

    Local $sFileNameZIP = StringTrimRight($sFileName, 3) & 'zip'

	FileSetAttrib($sIniFileName, '-RASHNOT', 1)
	FileSetAttrib($sIniFileName, '-RASHNOT', 1)
	FileSetAttrib($sIniFileName, '-RASHNOT', 1)
	FileSetTime($sIniFileName, '20010101000000', 0, 1)
	FileSetTime($sIniFileName, '20010101000000', 1, 1)
	FileSetTime($sIniFileName, '20010101000000', 2, 1)

    ShellExecuteWait(@SystemDir & '\rar.exe', 'a ' & $sFileNameZIP & ' -ac -m3 -r -t SVCPACK ENTRIES.INI', @ScriptDir, '', @SW_HIDE)

    FileMove($sDirSvcPackPath & '\' & $sFileName, $sDirAppsPath, 9); с перезаписью файлов с таким же названием
    FileMove(@ScriptDir & '\' & $sFileNameZIP, $sDirArhivPath, 9); с перезаписью файлов с таким же названием
EndFunc

FileSetAttrib($sDirAppsPath, '-A+R', 1)
FileSetAttrib($sDirAppsPath, '-A+R', 1)
FileSetAttrib($sDirAppsPath, '-A+R', 1)
FileSetTime($sDirAppsPath, '20010101000000', 0, 1)
FileSetTime($sDirAppsPath, '20010101000000', 1, 1)
FileSetTime($sDirAppsPath, '20010101000000', 2, 1)

FileSetAttrib($sDirArhivPath, '-A+R', 1)
FileSetAttrib($sDirArhivPath, '-A+R', 1)
FileSetAttrib($sDirArhivPath, '-A+R', 1)
FileSetTime($sDirArhivPath, '20010101000000', 0, 1)
FileSetTime($sDirArhivPath, '20010101000000', 1, 1)
FileSetTime($sDirArhivPath, '20010101000000', 2, 1)
Exit

-------
Полезное сообщение


Последний раз редактировалось semiono, 09-04-2009 в 01:01.


Отправлено: 12:04, 08-04-2009 | #18



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как заменить строку в ENTRIES.INI средствами автоматизации.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Ресурсы - [решено] Как заменить курсоры в Windows 7? antipuh Оформление Windows 11/ 10 / 8 / 7 / Vista 5 13-04-2010 19:46
[решено] Найти и заменить в текстовом файле. Как? Pozia AutoIt 15 11-03-2010 19:12
[решено] Как переместить выделенную строку ListView malev AutoIt 3 15-11-2009 12:29
[решено] Как заменить строку [27] в файле? semiono AutoIt 8 05-04-2009 02:56
Как заменить строку <input type... Rustemal Вебмастеру 1 29-06-2003 15:26




 
Переход