Показать полную графическую версию : [решено] Как заменить строку в ENTRIES.INI средствами автоматизации.
Нужно немножко не сложной автоматики, но лучше чтоб кто-то подсказал...
Условия:
Имеется директория в которой файлы:
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 наверное тоже
не просто?
volk1234
28-03-2009, 09:59
semiono
Измените название темы. Нынешнее - Архивирование... не соответствует правилам конференции, и не раскрывает вашего вопроса.
Чем быстрее вы сформулируете ваш вопрос, тем быстрее вам помогут. Пример правильного названия Как заменить строку в ENTRIES.INI средствами автоматизации.
volk1234
30-03-2009, 00:41
Мне нужно каждый раз положить в папку SVCPACK файл с новым именем *.exe и прописать его имя в ENTRIES.INI вместо filename.exe
и после этого запаковать в rar- архив.
Пожалуйста, уточните вопрос.
Что значит каждый раз положить??
список в ini должен обновляться
или дополняться?
rar a newname -ac -m3 -r -t SVCPACK ENTRIES.INI »
именно так?
а не так:
rar.exe a filename.exe -ac -m3 -r -t
пример чтения/замены:
#region: - Option
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion
Global $sFilePath = @ScriptDir & '\SVCPACK\ENTRIES.INI'
Global $sFileText = FileRead($sFilePath)
Global $hFile, $vSerch, $sAddProgram, $sAddProgramNew
;~ Чтение:
$vSerch = StringRegExp($sFileText, '(?i)\[AddProgram\]\s*\r*\n*\s*(.+)\s+/verysilent', 1)
If @Error == 1 Then
$vSerch = ''
EndIf
If IsArray($vSerch) Then
$sAddProgram = $vSerch[0]
EndIf
MsgBox(64, 'Результат чтения:', $sAddProgram)
;~ Замена:
$sAddProgramNew = 'New_' & $sAddProgram
$sFileText = StringRegExpReplace($sFileText, '(?i)\[AddProgram\]\s*\r*\n*\s*(.*)/verysilent', '[AddProgram]' & @CRLF & $sAddProgramNew & ' /verysilent')
MsgBox(64, 'Результат записи:', $sFileText)
;~ Запись:
$hFile = FileOpen($sFilePath, 2)
FileWrite($hFile, $sFileText)
FileClose($hFile)
А хорошо! Попробую этот пример подогнать!
newname - достаточно, так как рар сам добавляет рсасширение .zip и сам открывается по rar
(zip - более подходит для дистрибутизации, так как он встроен в винду и значится у всех есть)
поясню:
я часто переделываю свои хотфиксы, и папка SVCPACK используется под разные пакеты, в файле
ENTRIES.INI лишь заменяется имя пакета, остальное всё одинаково. Например, "WinRar.exe"
А так как я делаю часто исправление и пакетов много, то хочется автоматизировать это дело.
Причём у меня свои заморочки ещё, я например люблю дату файлов выставлять одинаково
и аттрибуты A тоже сбрасывать.
Мне нужно прочесть имя файла @ScriptDir & "\SVCPACK\*.exe" а не содержимое!
Наверное будет так - FileGetLongName(@ScriptDir & '\SVCPACK\*.exe')
В StringRegExpReplace я конечно запутался :( ...так как надо отсечь только имя без пути.
Можно бы было просто вписать в четвёртую строку полученный @filename.exe & "/verisilent"
но я что-то не нашёл как установить курсор в нужную строку, чтоб не затирать весь файл от начала?
а с регексп заменой, я опять же не шарю... Думал уже сам смогу, но не получается.
Чтоб не было недразумений -
@ScriptDir & "\SVCPACK\*.exe" - это @имя некого файла, можно и так даже *.* или даже *
@ScriptDir & "\ENTRIES.INI" - этот файл редактируется, в его последнюю строку надо внести
только @имя + /VERYSILENT
Пример:
[EditFile]
SVCPACK.INF,SetupHotfixesToRun,AddProgram
[AddProgram]
TBIView.exe /verysilent
$x = FileGetShortName(@ScriptDir & "\SVCPACK\*.*",1)
MsgBox(4096,"Test",$x, 10)
Вот блин функция, что напишешь то и вернёт!
Это же тупо, написать в параметре функции путь с именем файла и на выходе его же и получить! 0O
А между тем я так и не понял, чтоли нету способа получить имя файла *.exe в папке svcpack\
Да хоть бы и с путём, хотя я запарюсь отсекать потом лишнее регеспом... ??
Я уже думал сейчас всё получится, но прежняя загвоздка в получении имени ексешнига
IniWrite(@ScriptDir & "\ENTRIES.INI","AddProgram","",$name)
Exit
Причём ещё одна неожиданность, интересно пустое поле прокатит? Так как там отсутствует KEY
TBIView.exe /verysilent - сразу идёт!
#region: - Option
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion
Global $sIniFileName = 'entries.ini'
Global $sDirPath = @ScriptDir & '\SVCPACK'
If StringRight($sDirPath, 1) == '\' Then $sDirPath = StringTrimRight($sDirPath, 1)
_FindFile()
Func _FindFile()
Local $hFind, $sFileName
$hFind = FileFindFirstFile($sDirPath & '\*.*')
If $hFind == -1 Then
MsgBox(16, 'Ошибка', 'В искомой папке ненайденно файлов')
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($sDirPath & '\' & $sIniFileName)
$sIniFileText = StringRegExpReplace($sIniFileText, '(?s)(\[.+\]).+', '\1') & @CRLF & $sFileName & ' /verysilent'
Local $hFile = FileOpen($sDirPath & '\' & $sIniFileName, 2)
FileWrite($hFile, $sIniFileText)
FileClose($hFile)
EndFunc
имхо, думаю тут многие не против помочь.
но мысли читать очень сложно, к тому же на расстоянии )))
попробуйте более точно излагать вопросы, пример:
1. Как узнать имена всех файлов в папке.
2. Как записать имя первого найденного файла, из пункта 1, в ini файл, структура ini <такая-то>, в строку ini файла <такую-то> в <такой-то форме>, сам ini файл находится <там-то>.
и т.д.
необязательно именно так, но чуть более конкретнее, тал легче ответить )))
но мысли читать очень сложно, к тому же на расстоянии »
:)
Local $hFile = FileOpen($sIniFileName, 2)
FileWrite($hFile, $sIniFileText & @CRLF)
FileClose($hFile)
Чуть не так было, ENTRIES.INI лежит рядом с папкой, но не в ней. @CRLF для красоты добавил тоже :)
А вот насчёт обыного IniWrite() для записи тут нельзя использовать? Просто интересно.
Хотя проблемма помоему, так как поле KEY не существует, хотя это и INI файл поидее...
Типа класически было бы так
[AddProgram]
value = zzzz.exe /verysilent ; но тут не стандарт какой-то.
Но полюбому спасибо, так как уже итак работает!
Пожалуйста, добейте этот скрипт?
Нужны ещё две команды ->
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
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
Про архивацию не понял, расскажите подробней.
Как / куда / откуда / что и кто / дожен архивироваться ...
http://img15.imageshack.us/img15/8270/snap1rkm.png
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 нельзя оставить...
Но я могу обойтись. Хотяб запаковать автоматически :)
Сразу забыл сказать, удаление архива нужно лишь для чистоты работы, как бы предостережение от
создания архива поверх архива... Хотя впринципе это возможно, но как бы грязная работа...
Если архивы перетаскивать скриптом в хранилище, то можно и не зачищать скрипт директорию тогда.
Может что-то и не понятно всёравно? Я объясню. И спасибо, что уже облегчили мне рутинный труд.
работаю со вчеращено утра, читаю и понимаю - что ни чего не понимаю :)
проверьте так:
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
ошибка Run(@SystemDir & '\rar.exe', 'a' ...
надо так ShellExecute(@SystemDir & '\rar.exe', 'a ' ...
Екзешник полетел туда, куда надо успешно! :)
А вот zip почему-то в скрипт директории остаётся. Я подумаю над этим... Спасибо!!!!!
Но мне странно, почему здесь FileCopy как FileMove работает? Какраз FileMove мне более подходит! :)
Кажись, Sleep() надо добавить под архивацией... Теперь оно успевает, но архив действительно копируется,
а экзешник полностью перемещается из C:\SVCPACK в D:\Apps! Пока это загадка для мну... где-то баг затаился :)
недоглядел, надо так:
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
Вообщем, я не сразу заметил _FindFile('del'), и думал что файлы зачищаются перемещением,
что собсно и выгодней было бы в моём случае.
Закоментировал _FindFile('del'), переправил все FileCopy на FileMove,
заменил Run() на ShellExecuteWait() Получилось то, что хотел! Ура!
Отличная работа! Труд не зря, спасибо! Такие скрипты надо собирать в коллекцию! :)
Практически готовый конструктор для паковки хотфиксов :)
Вот что получилось:
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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.