|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как заменить строку в ENTRIES.INI средствами автоматизации. |
|
[решено] Как заменить строку в ENTRIES.INI средствами автоматизации.
|
Ветеран Сообщения: 842 |
Нужно немножко не сложной автоматики, но лучше чтоб кто-то подсказал...
Условия: Имеется директория в которой файлы: SVCPACK\ ENTRIES.INI ENTRIES.INI выглядит так Мне нужно каждый раз положить в папку 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 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 460
|
Профиль | Отправить 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 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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 |
Старожил Сообщения: 460
|
Профиль | Отправить 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 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать недоглядел, надо так:
Run(@SystemDir & '\rar.exe a' & $sFileNameZIP & ' -ac -m3 -r -t SVCPACK ENTRIES.INI', @ScriptDir, @SW_HIDE) Цитата:
Цитата:
Цитата:
а так, все что в папке SVCPACK, удаляется вот этой строчкой: _FindFile('del') если кроме EXE и ZIP файла удалять больше ничего не нужно, то _FindFile('del') можно не использовать, а использовать только FileMove |
|||
------- Отправлено: 10:17, 08-04-2009 | #16 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Вообщем, я не сразу заметил _FindFile('del'), и думал что файлы зачищаются перемещением,
что собсно и выгодней было бы в моём случае. Закоментировал _FindFile('del'), переправил все FileCopy на FileMove, заменил Run() на ShellExecuteWait() Получилось то, что хотел! Ура! Отличная работа! Труд не зря, спасибо! Такие скрипты надо собирать в коллекцию! ![]() |
------- Последний раз редактировалось semiono, 08-04-2009 в 11:12. Отправлено: 10:48, 08-04-2009 | #17 |
Ветеран Сообщения: 842
|
Профиль | Отправить 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 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Ресурсы - [решено] Как заменить курсоры в 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 |
|