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

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

Закрытая тема
Настройки темы
[Архив - Часть 1.3] AutoIt скрипты

Старожил


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

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


Изменения
Автор: Vadikan
Дата: 25-01-2008
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.

Помогите пожалуйста. Нужен маленький скриптик для решения некоторых рутинных задачь.
Вот что нужно сделать последовательно:

1) в папке DIR1 находим и удаляем файлы в названии которых присутствует text_1
2) в папке DIR2 находим xxx.sif и удаляем строки, в которых присутствует text_1
3) в папке DIR3 находим xxx.inf и добавляем в его секцию [XXX] несколько строчкек (text_2, text_3, ..., text_n)
4) в папке DIR4 находим yyy.inf ищем в его секции [YYY] text_4 и заменяем его на text_5
5) сохраняем все изменения и выводим отчёт о проделанной работе :-)

Заранее благодарен.

Отправлено: 05:05, 03-12-2006

 

Googler


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

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


Creat0R
Цитата:
сделал нужные для себя функции связанные с массивами
несколько замечаний... и свой вариант.
- во избежание проблем индексные переменные в функциях нужно объявлять как Local;
- пустые массивы (счетчик со значением 0) нужно обрабатывать отдельно перед входом в цикл;
- учитывая, что счет индекса идет всегда с единицы, одной проверки IsArray() явно недостаточно. На самом деле все приведенные функции работают с пользовательским типом данных - "массив со счетчиком"… вот на принадлежность этому типу и надо проверять. Более того, при наличии уверенности в корректности массива можно обойтись без лишнего пользования UBound() - достаточно взять значение по индексу 0.
- параметр $JoinedArray в функции _ArrayJoin() имхо избыточный, при нужде поменять параметры проблемы не составит:
Код: Выделить весь код
If $JoinedArray Then
    _ArrayJoin ($arr1, $arr2)
Else
    _ArrayJoin ($arr2, $arr1)
EndIf
- зачем нужна _ArrayClear(), если можно обычным оператором присвоения переинициализировать массив?
- в функции _ArrayReplace две строки перепутаны местами.
Код: Выделить весь код
#include <Array.au3>

Func _IsCountArray (ByRef $arr)
    If IsArray ($arr) Then
        If $arr[0] = UBound ($arr)-1 Then Return True
    EndIf
    Return False
EndFunc

Func _ArrayJoin (ByRef $arrFrom, ByRef $arrTo)
    If _IsCountArray($arrFrom) And _IsCountArray($arrTo) Then
        Local $i, $n=0
        If $arrFrom[0] =0 Then Return 0
        For $i=1 To $arrFrom[0]
            $n+=_ArrayAdd ($arrTo, $arrFrom [$i])
        Next
        $arrTo[0]+=$n
        Return $n
    EndIf
    SetError (1)
    Return -1
EndFunc

Func _ArrayClone (ByRef $arr, $count = 1)
    Local $i, $n=0, $tmp = $arr
    If _IsCountArray ($arr) Then
        For $i=1 To $count
            $n+=_ArrayJoin ($tmp, $arr)
        Next
        Return $n
    EndIf
    SetError(1)
    Return -1
EndFunc

Func _ArrayDeleteClones (ByRef $arr, $iCaseSense = 0)
    If _IsCountArray ($arr) Then
        Local $i, $n=0, $iClone
        If $arr[0] <2 Then Return 0
        For $i=$arr[0] To 2 Step -1
            $iClone = _ArraySearch ($arr, $arr[$i], 1, $i-1, $iCaseSense)
            If $iClone >0 Then
                $n+=_ArrayDelete ($arr, $iClone)
                $i-=1
            EndIf
        Next
        $arr[0] = UBound($arr) -1
        Return $n
    EndIf
    SetError(1)
    Return -1
EndFunc

Func _ArrayReplace (ByRef $Array, $ValueToReplace, $NewValue)
    Local $i, $n=0
    If _IsCountArray($Array) And IsString ($ValueToReplace) Then
        For $i = 1 To $Array[0]
            If StringInStr ($Array[$i], $ValueToReplace) Then
                $Array[$i] = StringReplace ($Array[$i], $ValueToReplace, $NewValue)
                $n+=1
            EndIf
        Next
        Return $n
    EndIf
    SetError(1)
    Return -1
EndFunc
Цитата:
А как определять является ли массив двухмерным, или нет?
UBound ($Array,0) вернет размерность массива
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:40, 19-02-2007 | #211



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

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


Googler


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

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


Creat0R
Цитата:
Кому интересна фича
не стоит приводить код одной функции дважды, кстати я не вижу разницы между этими двумя примерами...
Цитата:
Вот если бы ещё найти способ как внедрить пункт в контекстное меню папки
это сюда: http://forum.oszone.net/showthread.php?t=62252
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:28, 19-02-2007 | #212


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
несколько замечаний
Спасибо!

Цитата:
во избежание проблем индексные переменные в функциях нужно объявлять как Local
Ну у меня вроде бы все так обьявляется.

Цитата:
достаточно взять значение по индексу 0
Я знаю, но мне казалось что Ubound надёжнее, и к тому же иногда в индексе 0 может ничего и не быть (не формальный массив ).

Цитата:
зачем нужна _ArrayClear(), если можно обычным оператором присвоения переинициализировать массив?
А вот тут поподробнее плиз, я что то не совсем понял, как это реализовать на практике? (нужно “опусташить” массив).

Цитата:
в функции _ArrayReplace две строки перепутаны местами.
Нет, я так специально сделал, ведь если нечего заменять, то ничего не будет тронуто, а проверка на наличие значения только лишь для того чтобы вернуть из функции статус о том, произошла ли замена - но твой пример куда продвинутый, в нём также подсчитывается количество замен!

Цитата:
UBound ($Array,0) вернет размерность массива
О! Спасибо, это я и хотел узнать.

Цитата:
не вижу разницы между этими двумя примерами
Упс! - перепутал при вставке из разукрашалки - поправил.

Цитата:
это сюда:
Уау! спасибо, будем смотреть.

P.S
Думаю мне можно простить ошибки которые я допустил в функциях, т.к совсем недавно я вовсе не мог работать с массивами (для меня это было что то страшное и неопознанное), и то что я осмелился написать сам нужные мне функции, это что то - и благодаря таким замечаням как твои, думаю я вскоре освою их основы :UP: .

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 10:16, 19-02-2007 | #213


Googler


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

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


Creat0R
Цитата:
Ну у меня вроде бы все так обьявляется
возьми к примеру $iR - она используется в цикле без предварительного объявления
Цитата:
но мне казалось что Ubound надёжнее
не спорю - надежней, но еще надежней ужесточить проверку на входе...
Цитата:
А вот тут поподробнее плиз, я что то не совсем понял, как это реализовать на практике? (нужно “опусташить” массив)
легко... скажем, для случая массива со счетчиком:
Код: Выделить весь код
Func _ArrayClear (ByRef $arr)
    Dim $arr[1] = [0]
EndFunc
...теперь вопрос: нужно ли для этого создавать отдельную функцию?

Цитата:
думаю я вскоре освою их основы
не сомневаюсь
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:44, 19-02-2007 | #214


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
возьми к примеру $iR - она используется в цикле без предварительного объявления
Интересно, а я об этом не подумал, почему то считал что испольование переменной в цикле For (в начале) не объявляет её, а просто использует для конкретного цикла, но теперь если вдуматься, то далее после цикла можно будет использовать эту же переменную (и значение она будет иметь тоже что и значение поставленное после To - если конечно не прервать цикл), так что спасибо за подсказку, буду это учитывать

Цитата:
легко...
Действительнно легко! Спасибо!

Цитата:
нужно ли для этого создавать отдельную функцию?
Ну только разве что для проверки на массивность и возврата кода ошибочности (если к примеру пытаемся опусташить не массив)

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 21:25, 19-02-2007 | #215


Аватара для Creat0R

Must AutoIt


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

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


amel27
На основе твоего примера для определения цифрового значения, я сделал функцию для обнажения всех НЕ числовых значении, т.е в результате возвращается значение содержащее только цифры:

Код: Выделить весь код
Func _StringStripNotNumber($String, $RetType=0)
    If StringLen($String) < 2 Then
        If StringRegExp($String, '^ *([0-9]+\.{0,1}[0-9]*|0x[0-9]+) *$') Then Return $String
        Return ""
    EndIf
    Local $i, $RetNumber, $AllStringArr = StringSplit($String, "")
    For $i = 1 To $AllStringArr[0]
        If StringRegExp($AllStringArr[$i], '^ *([0-9]+\.{0,1}[0-9]*|0x[0-9]+) *$') Then $RetNumber &= $AllStringArr[$i]
    Next
    If $RetType = 1 And StringLen($RetNumber) >= 1 Then
        $AllStringArr = StringSplit($RetNumber, "")
        Return $AllStringArr
    EndIf
    Return $RetNumber
EndFunc
Если в качестве второго параметра поставить 1, то функция вернёт массив с найденными цифрами, если оставить по умолчанию (0), то возвращается обычная переменная с найденными цифрами.

Может у кого то есть более оригинальное название для этой функции? мне если честно ничего другого в голову не пришло.




А как можно получить весь путь до файла, за исключением самого имени файла?
Т.е к примеру, имеем путь C:\test\test.zip - и нужно получить только путь C:\test - хотел бы узнать как это можно осуществить исключительно регулярными вырожениями....

Я до сих пор обходился так:

Код: Выделить весь код
$Path = "C:\test\test.zip"
$Path = StringTrimRight($Path, StringLen(StringRegExpReplace($Path, "^.*\\", ""))+1)
Но может есть путь по короче? я имею в виду так чтобы одной функцией StringRegExpReplace получить этот же эффект.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 04:28, 20-02-2007 | #216


Аватара для Creat0R

Must AutoIt


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

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


amel27
Извини что достаю тебя уже третьий пост подряд, но я нашел небольшой недочёт в функции _FileSelectFolder() - там заголовок (первый параметр $title) не отображается

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 06:02, 20-02-2007 | #217


Googler


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

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


Creat0R
Цитата:
сделал функцию для обнажения всех НЕ числовых значении
честно говоря не очень представляю назначение этой функции, но тем не менее.... можно и так:
Код: Выделить весь код
Func _StringStripNotNumber ($String, $RetType=0)
    $String = StringRegExpReplace ($String,'[^0-9]','') ; Удаляем все не-цифры
    If $RetType = 1 Then Return StringSplit ($String, "")
    Return $String
EndFunc
Цитата:
А как можно получить весь путь до файла, за исключением самого имени файла?
например так:
Код: Выделить весь код
StringRegExpReplace ($file, '[^\\]*$', '')

Отправлено: 08:38, 20-02-2007 | #218


Googler


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

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


Creat0R
Цитата:
нашел небольшой недочёт в функции _FileSelectFolder() - там заголовок (первый параметр $title) не отображается
спасибо, исправил... забыл я про него совсем

Отправлено: 08:54, 20-02-2007 | #219


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата:
честно говоря не очень представляю назначение этой функции
Я позже выложу скрипт примера (там скрипт предназначен для выбора файлов (кстати обе твои функции используются), и затем их архивирования, весь процесс архивирования считывается через StdOutRead() и из полученного значения нужно получать только цифры, т.к их нужно использовать для прогресс бара ).

Цитата:
можно и так:
Уау! в три раза короче, и в 10 раз правильнее! спасибо!

Цитата:
например так:
Класс! спасибо (см. ниже, выложил свою версию для функции _PathSplit())

Цитата:
спасибо, исправил... забыл я про него совсем
Да нет, это тебе спасибо за эту функцию, я уже успешно её имплонтировал в один из своих скриптов (тот что для архивирования)




Моя версия на функцию деления пути используя регулярные выражения:

Код: Выделить весь код
#include <Array.au3>
$Path = "c:\my test\path\test.zip"

$PathArr = _PathSplitByRegExp($Path)

_ArrayDisplay($PathArr, "Demo of _PathSplitByRegExp()")

Func _PathSplitByRegExp($sPath, $pDelim="\")
    Local $RetArray[8], $iArr
    $pDelim = "\" & $pDelim
    $RetArray[0] = $sPath
    $RetArray[1] = StringRegExpReplace($sPath,  $pDelim & '.*', $pDelim) ;Drive letter
    $RetArray[2] = StringRegExpReplace($sPath, $pDelim & '[^' & $pDelim & ']*$', '') ;Path without FileName and extension
    $RetArray[3] = StringRegExpReplace($sPath, '\.[^.]*$', '') ;Full path without File Extension
      $RetArray[4] = StringRegExpReplace($sPath, '^.' & $pDelim & '*:', '') ;Full path without drive letter
    $RetArray[5] = StringRegExpReplace($sPath, '^.*' & $pDelim, '') ;FileName and extension
    $RetArray[6] = StringRegExpReplace(StringRegExpReplace($sPath, '^.*' & $pDelim, ''), '\.[^.]*$', '') ;Just Filename
    $RetArray[7] = StringRegExpReplace($sPath, '^.*\.', '') ;Just Extension of a file
    ;Проверяем все значения (элементы массива), если в каком то из них небыла произведена замена, то присваеваем ему пустое значение ("")
    For $iArr = 1 To 7
        If $RetArray[$iArr] = $sPath Then $RetArray[$iArr] = ""
    Next
    Return $RetArray
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 11:27, 20-02-2007 | #220



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход