Войти

Показать полную графическую версию : [решено] Как заменить строку в ENTRIES.INI средствами автоматизации.


semiono
28-03-2009, 03:13
Нужно немножко не сложной автоматики, но лучше чтоб кто-то подсказал...
Условия:
Имеется директория в которой файлы:
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- архив.

Пожалуйста, уточните вопрос.
Что значит каждый раз положить??

proxy
30-03-2009, 01:26
список в 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)

semiono
31-03-2009, 16:23
А хорошо! Попробую этот пример подогнать!

newname - достаточно, так как рар сам добавляет рсасширение .zip и сам открывается по rar
(zip - более подходит для дистрибутизации, так как он встроен в винду и значится у всех есть)

поясню:
я часто переделываю свои хотфиксы, и папка SVCPACK используется под разные пакеты, в файле
ENTRIES.INI лишь заменяется имя пакета, остальное всё одинаково. Например, "WinRar.exe"
А так как я делаю часто исправление и пакетов много, то хочется автоматизировать это дело.
Причём у меня свои заморочки ещё, я например люблю дату файлов выставлять одинаково
и аттрибуты A тоже сбрасывать.

semiono
31-03-2009, 17:18
Мне нужно прочесть имя файла @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

semiono
07-04-2009, 22:07
$x = FileGetShortName(@ScriptDir & "\SVCPACK\*.*",1)
MsgBox(4096,"Test",$x, 10)
Вот блин функция, что напишешь то и вернёт!
Это же тупо, написать в параметре функции путь с именем файла и на выходе его же и получить! 0O

А между тем я так и не понял, чтоли нету способа получить имя файла *.exe в папке svcpack\
Да хоть бы и с путём, хотя я запарюсь отсекать потом лишнее регеспом... ??


Я уже думал сейчас всё получится, но прежняя загвоздка в получении имени ексешнига
IniWrite(@ScriptDir & "\ENTRIES.INI","AddProgram","",$name)
Exit
Причём ещё одна неожиданность, интересно пустое поле прокатит? Так как там отсутствует KEY
TBIView.exe /verysilent - сразу идёт!

proxy
07-04-2009, 23:06
#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 файл находится <там-то>.
и т.д.

необязательно именно так, но чуть более конкретнее, тал легче ответить )))

semiono
07-04-2009, 23:27
но мысли читать очень сложно, к тому же на расстоянии »
:)

semiono
08-04-2009, 00:03
Local $hFile = FileOpen($sIniFileName, 2)
FileWrite($hFile, $sIniFileText & @CRLF)
FileClose($hFile)
Чуть не так было, ENTRIES.INI лежит рядом с папкой, но не в ней. @CRLF для красоты добавил тоже :)

А вот насчёт обыного IniWrite() для записи тут нельзя использовать? Просто интересно.
Хотя проблемма помоему, так как поле KEY не существует, хотя это и INI файл поидее...

Типа класически было бы так
[AddProgram]
value = zzzz.exe /verysilent ; но тут не стандарт какой-то.

Но полюбому спасибо, так как уже итак работает!

semiono
08-04-2009, 01:09
Пожалуйста, добейте этот скрипт?
Нужны ещё две команды ->
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

proxy
08-04-2009, 02:39
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


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

semiono
08-04-2009, 07:52
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 нельзя оставить...
Но я могу обойтись. Хотяб запаковать автоматически :)

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

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

proxy
08-04-2009, 08:55
работаю со вчеращено утра, читаю и понимаю - что ни чего не понимаю :)
проверьте так:

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

semiono
08-04-2009, 10:09
ошибка Run(@SystemDir & '\rar.exe', 'a' ...
надо так ShellExecute(@SystemDir & '\rar.exe', 'a ' ...

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

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

proxy
08-04-2009, 10:17
недоглядел, надо так:
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

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

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

semiono
08-04-2009, 12:04
Практически готовый конструктор для паковки хотфиксов :)
Вот что получилось:

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