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

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

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

(*.*)


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


Конфигурация

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


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







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


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


Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).
Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).



Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата Vadikan:
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.

-------
Канал Windows 11, etc | Чат @winsiders

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

Отправлено: 00:02, 05-02-2006

 

Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
_StripLead...
Спасибо!
Я кстати нашёл ещё один способ как это можно сделать, только не уверен надёжен ли он:

Код: Выделить весь код
StringRegExpReplace($Str, '\A' & $Char & '+', '')

И для конечных символов...

StringRegExpReplace($Str, $Char & '+\z', '')


Цитата:
как обычно... если задан флаг, то для "калассики" работает штатный метод, а для "нового стиля" автоматом подключается CallBack-функция
Я флаги вовсе не ставлю, но кнопка всё ровно не активна, как будто флаг $BIF_RETURNONLYFSDIRS используется

Заметил один глюк при использовании $BIF_BROWSEINCLUDEFILES - Если сразу после появления окна нажать Отмена или ОК (на выбранном элементе), то функция не сразу возвращает (проходит около секунды).

И ещё, значки для файлов (если есть таковы в начальном каталоге), все имеют иконку Internet Explorer - А остальные значки (для папок и системные элементы), вовсе не имеют значков, все как будто папки... это длится также около секунды, потом всё нормально становится.

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

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

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, 06-08-2007 | #231



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

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


Googler


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

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


Creat0R
Цитата:
кстати нашёл ещё один способ как это можно сделать
угу, в принципе то же самое, только у тебя для одного символа, а у меня для произвольного набора начальных символов... а "плюсик" ты правильно подметил ... у себя тоже поправил, и укоротил строку замены
Цитата:
флаги вовсе не ставлю, но кнопка всё ровно не активна
исправил (с битовыми операциями намутил), и еще добавил симуляцию "селекта" для дефолтовой папки - на ней не срабатывало затенение "Ок" (так как не было сообщения $BFFM_SETSELECTION)
Цитата:
Если сразу после появления окна нажать Отмена или ОК (на выбранном элементе), то функция не сразу возвращает (проходит около секунды).
да нет, у меня вроде без тормозов
Цитата:
значки для файлов (если есть таковы в начальном каталоге), все имеют иконку Internet Explorer - А остальные значки (для папок и системные элементы), вовсе не имеют значков, все как будто папки... это длится также около секунды, потом всё нормально становится.
ну, это експлорер так обновляет элементы... тут видимо ничего не поделать

Отправлено: 07:46, 06-08-2007 | #232


Аватара для Creat0R

Must AutoIt


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

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


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

Код: Выделить весь код
$Char = '\t'

$Char = StringRegExpReplace($Char, '([][{}()|.?+*\\^])', '\\\1')
$Ret = StringRegExpReplace("\\test", '(?i)^[' & $Char & ']+([^' & $Char & '])', '\1')

ConsoleWrite($Ret)
Т.е под символ \ подставляется ещё один такой символ (для его отмены), и тогда неверно возвращается (должно в этом случае вернуться исходное значение - без изменении, так как в начале не найдено вхождение \t).



Вот функция (для чего вообще мне и требовалось сия опция), позволяет стриппить (обножать) определённый(е) символ(ы):

Код: Выделить весь код
;=======================================
;$Flag = 0 (или любое значение кроме 1,2, и 3) - обычная замена всех вхождении заданного символа
;$Flag = 1 - убирание заданного символа в начале $String
;$Flag = 2 - убирание заданного символа в конце $String
;$Flag = 3 - убирание заданного символа в начале и в конце $String
;
;$ReplaceAll = 0 (по умолчанию) - заменяется только первое вхождение заданного(ных) символа(ов)
;$ReplaceAll = 0 - заменяются все вхождения символов с заданой стороны (в зависимости от значения $Flag)
;=======================================
Func _StringStripChars($String, $Char, $Flag=0, $ReplaceAll=0)
    If StringLen($String) = 0 Or Not StringInStr($String, $Char) Then Return SetError(1, 0, $String)
    Local $Patern, $RetStr = $String
    $Char = StringRegExpReplace($Char, '([][{}()|.?+*\\^])', '\\\1')
    Switch $Flag
        Case 1
            $Patern = '(?i)\A' & $Char
            If $ReplaceAll = 1 Then $Patern = '(?i)\A' & $Char & '+'
            $RetStr = StringRegExpReplace($String, $Patern, '')
            Return $RetStr
        Case 2
            $Patern = '(?i)' & $Char & '\z'
            If $ReplaceAll = 1 Then $Patern = '(?i)' & $Char & '+\z'
            $RetStr = StringRegExpReplace($String, $Patern, '')
            Return $RetStr
        Case 3
            $Patern = '(?i)\A' & $Char & '|' & $Char & '\z'
            If $ReplaceAll = 1 Then $Patern = '(?i)\A' & $Char & '+|' & $Char & '+\z'
            $RetStr = StringRegExpReplace($String, $Patern, '')
            Return $RetStr
        Case Else
            $String = StringReplace($String, $Char, '')
            Return SetError(0, @extended, $String)
    EndSwitch
    Return SetError(2, 0, $String)
EndFunc
В этой функции хотелось бы реализовать ещё одну тему - чтобы в качестве $ReplaceAll можно было задать параметр для указания того, сколько символов следует убирать. Т.е если передать к примеру 3, тогда только три первых(/последних/с обоих сторон) символа (заданных через $Char) будут убираться, если же оставить этот параметр по умолчанию (0), то чтобы убирался только первый символ, для убирания всех начальных/конечных символов, задавать -1.
Это конечно можно сделать проверкой длины и т.п... но хотелось именно средствами RegExp...

Цитата:
исправил
Что-то я если честно запутался уже - где следует использовать функцию _MyFSFCallbackProc(), а где _FileSFCallbackProc()

Цитата:
у меня вроде без тормозов
Это при использовании флага $BIF_BROWSEINCLUDEFILES? без него всё нормально.

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

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

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


Последний раз редактировалось Creat0R, 06-08-2007 в 09:30.


Отправлено: 08:57, 06-08-2007 | #233


Googler


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

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


Creat0R
Цитата:
должно в этом случае вернуться исходное значение - без изменении, так как в начале не найдено вхождение \t
дык это уже получается замена подстроки, а не символов... у меня удаляются любые символы (из заданного множества) в любом сочетании, в твоей функции в это множество входит только один символ
Цитата:
В этой функции хотелось бы реализовать ещё одну тему - чтобы в качестве $ReplaceAll можно было задать параметр для указания того, сколько символов следует убирать.
Код: Выделить весь код
; $Chars - удаляемые символы
; $Flags - тип замены:
;   $Flag = 0 - удаление символов по всей строке
;   $Flag = 1 - удаление символов в начале строки
;   $Flag = 2 - удаление символов в конце строки
;   $Flag = 3 - удаление символов в начале И в конце строки
;   другие значения флагов равносильны $Flag = 0, $Count=0
; $Count - количество удаляемых символов
;   $Count<=0 - глобальное удаление всех вхождений (для заданных значений флагов)
Func _StringStripChars($String, $Chars, $Flag=0, $Count=0)
    $Chars = StringRegExpReplace($Chars, '([]\\^])', '\\\1')
    Local $Pattern = '(?i)[' & $Chars & ']', $sCnt = '{1,'& $Count &'}'
    If $Count<=0 Then $sCnt='+'
    If $Flag <>0 Then $Count = 0
    If $Flag=1 Then $Pattern= '(?i)^['& $Chars &']'& $sCnt
    If $Flag=2 Then $Pattern= '(?i)[' & $Chars &']'& $sCnt &'$'
    If $Flag=3 Then $Pattern= '(?i)^['& $Chars &']'& $sCnt &'|[' & $Chars &']'& $sCnt &'$'
    Return StringRegExpReplace($String, $Pattern, '', $Count)
EndFunc
Цитата Creat0R:
Что-то я если честно запутался уже - где следует использовать функцию _MyFSFCallbackProc(), а где _FileSFCallbackProc()
пока хватает штатной имхо _MyFSFCallbackProc не нужна

Последний раз редактировалось amel27, 07-08-2007 в 02:54. Причина: ошибка в скрипте

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

Отправлено: 11:49, 06-08-2007 | #234


Аватара для Creat0R

Must AutoIt


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

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


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

Спасибо за (довольно укороченную) функцию _StringStripChars() - но в ней тоже есть проблема...

К примеру:

Код: Выделить весь код
$Ret = _StringStripChars("_test_", '-_', 1, 0)

ConsoleWrite($Ret)
Получаем на выходе test_ - а должно вернуться _test_, т.е должно заменяться только найденное в начале (из за того что указан $Flag = 1), ведь там нету символа -.

А вот к примеру если имеем такую строку: -_-_test_, то используя $Count = 1 должно вернуться -_test_

Код: Выделить весь код
$Ret = _StringStripChars("-_-_test_", '-_', 1, 1)

ConsoleWrite($Ret)
А возвращается _-_test_ - я понимаю что заменяется только первое вхождение, но суть этой функции в том, чтобы заменялось то вхождение, которое передаётся через $Chars, вне зависимости от количества символов, т.е чтобы оно расматривалось как одно целое значение (символ).

У меня получилось это сделать обычными средствами (циклами и проверками String...), но это не так быстро как через RegExp .

Цитата:
пока хватает штатной
Спасибо, теперь всё стало ясно! в принципе больше от этой функции (я имею в виду вообще всё что касается _FileSelectFolder() ), ничего и не требуется, достигнут как говорится - идеал!

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

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

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:07, 06-08-2007 | #235


Googler


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

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


Creat0R
Цитата:
т.е чтобы оно расматривалось как одно целое значение (символ)
"несколько символов как одно целое" вроде и есть строка тогда и UDF должна по другому называться:
Код: Выделить весь код
; $SubString - удаляемая подстрока
; $Flags - тип замены:
;   $Flag = 0 - удаление вхождений подстроки по всей строке
;   $Flag = 1 - удаление вхождений подстроки в начале строки
;   $Flag = 2 - удаление вхождений подстроки в конце строки
;   $Flag = 3 - удаление вхождений подстроки в начале И в конце строки
;   другие значения флагов равносильны $Flag = 0, $Count=0
; $Count - количество удаляемых вхождений
;   $Count<=0 - глобальное удаление всех вхождений (для заданных значений флагов)
Func _StringStripString($String, $SubString, $Flag=0, $Count=0)
    $SubString = StringRegExpReplace($SubString, '([][{}()|.?+*\\^])', '\\\1')
    Local $Pattern = '(?i)(' & $SubString & ')', $sCnt = '{1,'& $Count &'}'
    If $Count<=0 Then $sCnt='+'
    If $Flag <>0 Then $Count = 0
    If $Flag=1 Then $Pattern= '(?i)^('& $SubString &')'& $sCnt
    If $Flag=2 Then $Pattern= '(?i)(' & $SubString &')'& $sCnt &'$'
    If $Flag=3 Then $Pattern= '(?i)^('& $SubString &')'& $sCnt &'|(' & $SubString &')'& $sCnt &'$'
    Return StringRegExpReplace($String, $Pattern, '', $Count)
EndFunc
Цитата:
достигнут как говорится - идеал
тут идеала ИМХО не бывает ... к примеру, есть идея добавить автоматическое "раскрытие" содержимого папки для флага $BIF_BROWSEINCLUDEFILES... как ты думаешь?.. Ну и далеко не все возможности SHBrowseForFolder() еще использованы

З.Ы. в функции _StringStripChars() была ошибка - слово "Pattern" кое-где было с одной "t" (исправил)
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:45, 07-08-2007 | #236


Аватара для Creat0R

Must AutoIt


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

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


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

Цитата:
есть идея добавить автоматическое "раскрытие" содержимого папки для флага $BIF_BROWSEINCLUDEFILES... как ты думаешь?
Да, было бы полезно.

Кстати, теперь почему то не нужно проверять окончание начального каталога, т.е работает без тех двух добавленных строк (с ними кстати НЕ работает ).

Цитата:
в функции _StringStripChars() была ошибка - слово "Pattern" кое-где было с одной "t" (исправил)
Да, я заметил, забыл сказать

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

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

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:34, 07-08-2007 | #237


Googler


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

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


Creat0R
Цитата:
Да, было бы полезно
обломс... помучил я сообщение $BFFM_SETEXPANDED и мне не понравилось. Да, оно открывает папку, но не всегда - если файлов в папке многовато, то папка отображается вообще как пустая (без "плюсика"), причем не нашел возможности потом "обновить" список папок, хотя может только у меня такой глюк? Странно, что нигде в тырнете не нашел ничего подобного... Одно радует - в "классическом" варианте папка всегда открывается. Можешь сам проверить - попробуй в CallBack-функции вместо:
Код: Выделить весь код
DllCall ("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB,1))
подставить:
Код: Выделить весь код
DllCall ("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $BFFM_SETEXPANDED, "int", 1, "wstr", DllStructGetData($uCB,1))
Цитата:
Кстати, теперь почему то не нужно проверять окончание начального каталога, т.е работает без тех двух добавленных строк (с ними кстати НЕ работает )
прямо мистика... тут я ничего не менял, хотя первую-то строчку наверное надо оставить?

Отправлено: 11:23, 07-08-2007 | #238


Аватара для spooll

Новый участник


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

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


Премного извиняюсь, почитал документацию, немного разобрался, стал скрипты писать, все ок, но теперь понадобилось сделать так, чтобы если программа уже установлена, то скрипт завершался, сразу не нашел , а тут страниц очень много, подскажите пожалуйста
Типа такого:
if exists ("c:\1c\1c.exe") Then Exit

Отправлено: 12:43, 07-08-2007 | #239


Аватара для Maza Faka

Ветеран


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

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


spooll,
Либо так и проверять, к примеру:
Код: Выделить весь код
If FileExists(@ProgramFilesDir & "\MyProgram\Program.exe") Then
    Exit
Else
    ;...Your script
EndIf
Либо проверять ключ в реестре:
Код: Выделить весь код
If RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ICQLite", 1) Then
    Exit
Else
    ;...Your script
EndIf
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:13, 07-08-2007 | #240



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

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

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




 
Переход