Войти

Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Creat0R
23-01-2007, 07:51
Diamond
А функция не работает то :( - нужно Global $GetPath = 0 ставить вне функции, т.к каждый вызов подфункции, вне зависимости от того найден ли файл, задаёт переменной $GetPath значение 0, таким образом цикл не прирывается, и пока не проверяются все файлы функция действует...

Вот немного изменил её (сорри если что), а также добавил в неё определение файла в корневом каталоге (в $Path):

Global $GetPath=0
$ret = find(@ProgramFilesDir,"qip.exe")
If Not $ret=0 Then
MsgBox(0,"",$ret)
; Записываем значение $ret в реестр...
Else
MsgBox(0,"","Файл не найден.")
EndIf

;=================================

; $Path - Путь поиска. ( Не должен заканчиваться слэшем!!! )
; $FileName - Имя искомого файла.
; Возвращает полный путь к каталогу (не к файлу), если файл осутствует возвращает 0

Func find($Path,$FileName)
$ModPath=$Path & "\*" ; Формирую строку поиска (толко для инициализации)
$file=FileFindFirstFile($ModPath) ; Инициализация поиска
While 1
; Условие для прерывания всех циклов - чтобы быстро выйти из функции
If $GetPath <> 0 Then ; Если нужный нам файл уже найден тогда
ExitLoop ; Прерываю циклы всех подфункций
EndIf
$get=FileFindNextFile($file) ; Поиск...
If @error Then ExitLoop
$string=$Path & "\" & $get ; Формирую новый путь
If Not StringInStr(FileGetAttrib($string),"D") Then ;Если не является папкой тогда:
If $get=$FileName Then
$GetPath=$Path
ExitLoop
EndIf
Else
find($string,$FileName) ; Запуск подфункции для поиска в подпапке
EndIf
WEnd
FileClose($file) ;Завершение инициализации
Return $GetPath
EndFunc

Файл в корневом каталоге и раньше определялся (если убрать Global $GetPath = 0 из функции), но так быстрее ;)
P.S. всё изменённое выделенно.

Creat0R
23-01-2007, 08:44
Diamond
Немного “гуинизировал” твою функцию для поиска файла :biggrin: - в первом поле задаём путь в котором нужно искать, а в нижнем запрос (имя файла) - неверно набранный путь (если не существует или содержит слеш на конце) определяется, а также определяется если набранное имя файла содержит непозволенные символы (< > | ? : * / \ "):


Opt("GuiOnEventMode", 1)

Global $Progress = 0.1, $GetPath = 0
$PathForSearch = @ProgramFilesDir
$FileToFind = "FileName.exe"

$Gui = GUICreate("File Finder", 300, 170, -1, -1, -1, 0x00000088)
GUISetOnEvent(-3, "ExitScript")

GUICtrlCreateLabel("Path to search on:", 20, 30)
$PathInput = GUICtrlCreateInput($PathForSearch, 20, 50, 270)

GUICtrlCreateLabel("File to find:", 20, 90)
$FileNameInput = GUICtrlCreateInput($FileToFind, 20, 110, 270)

$SearchButton = GUICtrlCreateButton("Search", 70, 140, 60, 20)
GUICtrlSetOnEvent(-1, "SearchButton")
$CancelButton = GUICtrlCreateButton("Cancel", 180, 140, 60, 20)
GUICtrlSetOnEvent(-1, "ExitScript")

GUISetState()

While 1
Sleep(100)
WEnd

Func _FindFile($Path, $FileName)
$ModPath = $Path & "\*" ; Формирую строку поиска (толко для инициализации)
$File = FileFindFirstFile($ModPath) ; Инициализация поиска
While 1
; Условие для прерывания всех циклов - чтобы быстро выйти из функции
If $GetPath <> 0 Then ExitLoop ; Прерываю циклы всех подфункций
$Get = FileFindNextFile($File)
If @error Then ExitLoop
$String = $Path & "\" & $Get ; Формирую новый путь
ProgressSet($Progress, $Path & @CR & $Get)
$Progress = $Progress + 0.1
If $Progress >= 100 Then $Progress = 0.1
If Not StringInStr(FileGetAttrib($String), "D") Then ;Если не является папкой тогда:
If $Get = $FileName Then
$GetPath = $Path
ExitLoop
EndIf
Else
_FindFile($String, $FileName) ; Запуск подфункции для поиска в подпапке
EndIf
WEnd
FileClose($File) ;Завершение инициализации
Return $GetPath
EndFunc

Func SearchButton()
If Not FileExists(GUICtrlRead($PathInput)) Then
_MsgBox(16, "Error", "You must type an existing path", $Gui)
ElseIf StringRight(GUICtrlRead($PathInput), 1) = "\" Then
_MsgBox(48, "Attention!", "The path must not have a slash (\) at the end of it.", $Gui)
ElseIf GUICtrlRead($FileNameInput) = "" Then
_MsgBox(16, "Error", "You must type a file name", $Gui)
ElseIf Not _IsFileName(GUICtrlRead($FileNameInput)) Then
_MsgBox(16, 'Error', 'The file name include an invalid characters' & @CR & '< > | ? : * / \ "', $Gui)
Else
$PathForSearch = GUICtrlRead($PathInput)
$FileToFind = GUICtrlRead($FileNameInput)
GUISetState(@SW_HIDE, $Gui)
ProgressOn("Please wait...", "Search is in progress...", $PathForSearch, -1, -1, 16)
$SearchResults = _FindFile($PathForSearch, $FileToFind)
ProgressOff()
If Not $SearchResults = 0 Then
MsgBox(262144+64, "Done!", "File <" & $FileToFind & "> was found in this path <" & $SearchResults & ">.")
Else
MsgBox(262144+48, "Attention!", "File <" & $FileToFind & "> was not found on <" & $PathForSearch & "> and it subfolders." & @CR & @CR & "OK ---> EXIT")
EndIf
GUISetState(@SW_SHOW, $Gui)
EndIf
EndFunc

Func _IsFileName($Test)
If StringRegExp($Test, '[<>|?:"*/\\]') <> 0 Then
Return False
Else
Return True
EndIf
EndFunc

Func _MsgBox ($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $mainGUI=0)
$ret = DllCall ("user32.dll", "int", "MessageBox", _
"hwnd", $mainGUI, _
"str", $MsgBoxText , _
"str", $MsgBoxTitle, _
"int", $MsgBoxType)
Return $ret [0]
EndFunc

Func ExitScript()
Exit
EndFunc

Diamond
23-01-2007, 09:30
Creat0R
Такого конкретного стиля (кажется) нетВот и я так подумал что в самом AutoIt классического стиля нет. Мне кажется, что это сама система навязывает свой стиль(Windows XP). Т.е. это как например если не указать конкретно цвет фона для GUI, то цвет фона по умолчанию становится системный(BtnFace). Вот если бы это дело можно было как-то "блокировать", думаю нужно копать в сторону WinApi.
тогда можно перетаскивать окно тягая этот контроль:Отлично! Что-то вроде этого я как раз и искал. :) Спасибо! Жалко только что GuiCtrlCreateLabel перекрывает мои кнопки.
твой, ровно в два раза быстрее!Я считаю что мой скрипт значительно уступает твоему по функциональности. :not-me:
цикл не прирывается, и пока не проверяются все файлы функция действуетДа действительно... я добавил Global $GetPath=0 в самый последний момент, и видимо как следует не протестировал, :blush: а до того у меня стоял Global $GetPath без всяких нулей - соответственно, при отсутствии файла возвращалось пусто (""). В принципе, $GetPath можно оставить и внутри функции (только не приравнивать нулю или, проверять переменную на декларирование), а на скорости я думаю это сильно не отразится. Кстати протестировал на скорость у меня разница где-то 1,5 раза. Спасибо что указал на ошибку! :)
А вот ExitLoop что ты добавил, никак не влияет на прерывание! :nono:

Creat0R
23-01-2007, 10:27
Diamond
ExitLoop что ты добавил, никак не влияет на прерывание!
Создай в C:\program files файл test.txt, и задай вместо qip.exe - test.txt, теперь запусти функцию без ExitLoop (засеки время поиска), и запусти с ExitLoop, файл найден почти сразу же ;)

Diamond
24-01-2007, 02:45
Creat0R
запусти функцию без ExitLoop (засеки время поиска), и запусти с ExitLoop, файл найден почти сразу жеТвой способ проверки (сравнение по времени) оказался не стабилен. Я долго гонял:maniac:скрипт и, во многих случаях получалось как раз то всё наоборот. Но я решил подставлять Msgbox() в разных места и при различных вариантах. Получается что ты прав! И даже больше!!! :UP:

Когда дочерняя подфункция находит файл, она завершаясь возвращает контроль родительской функции, которая в свою очередь (как я понял) продолжает работу с того места откуда последний раз запускала дочернюю подфукцию, а вот тут-то :moderator её будет поджидать твой ExitLoop. Исходя из всего выше сказаного, я думаю (моё) "условие для прерывания всех циклов" - абсолютно лишнее!
Т.е. когда стоит твой ExitLoop, то до моего условия (прерывания), дело вообще не доходит!!! Уф-ф... В общем, я убираю его (условие)... :)

Creat0R
24-01-2007, 17:36
Нашёл в аутоите баг (или это так задуманно?) - При BlockInput(1), вроде всё кроме Ctrl Alt Del должно быть заблокированно, но срабатывает нажатие и на Sleep и на Power.
Собственно вопрос: Возможно ли перед блокировкой, назначить другое действие для этих клавиш? (т.е чтобы при их нажатии ничего не происходило) - Очень очень нужно :( .

P.S
Задать клавишу Sleep можно, но она почему то продолжает работать (как Sleep)

Creat0R
24-01-2007, 21:47
Давно искал способ сделать “плавающее окошко”, чтобы ещё при “плавании” :), перемещалось хаотично по экрану. Когда ещё только начинал разбирать гуи в AutoIt'е, думал это не реально, и забросил эту затею, но вот тут ни с того ни с сего, я вдруг вспомнил об этом, и решил попробовать реализовать (всё же знании уже побольше), и, реализовал! (довольно без проблем, и быстро)...

Вот Пример:


#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)

;Создаём стильны гуи для показа ;-)
GUICreate("Fading GUI", 200, 100, -1, -1, $WS_POPUP+$WS_DLGFRAME, $WS_EX_CLIENTEDGE+$WS_EX_TOPMOST)
GUISetOnEvent(-3, "ExitScript")
GUISetBkColor(0xC1C9FD)
;Активируем гуи в скрытом режиме, в целях избежания мерцания окна при первом запуске
GUISetState(@SW_HIDE)
;Устанавливаем самый высокий уровень (0) прозрачности окна гуи
WinSetTrans("Fading GUI", "", 0)
;Показываем обратно гуи в невидемом состоянии (100 % прозрачности)
GUISetState(@SW_SHOW)

$Close = GUICtrlCreateButton("Close", 70, 40, 60, 20)
GUICtrlSetOnEvent(-1, "ExitScript")

;Включаем функцию утухания и перемещения окна каждые 100 м"с
AdlibEnable("GUIFad", 100)
While 1
Sleep(10)
WEnd

Func GUIFad()
;Задаём интервал исчезновения окна и проходимся по нему
For $i = 0 To 255
Sleep(10)
WinSetTrans("Fading GUI", "", $i)
Next
Sleep(50)
;Задаём интервал появления окна и проходимся по нему (в обратном порядке)
For $j = 255 To 0 Step -1
Sleep(10)
WinSetTrans("Fading GUI", "", $j)
Next
;Двигаем окно в хаотичном порядке (хм, парадокс получается ;) ), в соответствии с координатами разрешения экрана
WinMove("Fading GUI", "", Random(0, @DesktopWidth-200), Random(0, @DesktopHeight-200))
EndFunc

Func ExitScript()
Exit
EndFunc


Очень подходит если нужно сделать своего рода призентацию, или просто слайдшоу картинок или ещё чего нибудь :blush2: .

Creat0R
26-01-2007, 03:48
Оказывается, можно вызвать MsgBox не в стильном виде (не испоьзуя стиль WinXP) - т.е сообщение будет выглядеть как системное в Win98...

Нужно просто перед основным флагом, ставить стиль 0x20000:

MsgBox(0x20000+64, "Hello!", "I am styleless MsgBox ;) ")

Я вот только не знаю как убрать атрибут “поверх всех окон”, перепробовал кучу номеров, но так и не нашёл подходящий.

borzoy
27-01-2007, 01:32
Привет всем!!!
Помогите пожалуйста с скриптом для установкой Fraps и Runpad Shell.
Для тихой установки уже наверное все ключики перепробывал, но не помогает, всеравно вылазиет табличка с уведомлением установить программу.

Creat0R
27-01-2007, 10:28
borzoy
Для тихой установки уже наверное все ключики перепробывал
Эта инфа, я полагаю должна сопоставляться с установщиком...
А вообще, нужно было создавать отдельный топик:

Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений" (http://forum.oszone.net/announcement.php?f=61&announcementid=43). Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров (http://forum.oszone.net/announcement.php?f=32&announcementid=24).

borzoy
27-01-2007, 19:12
Creat0R
Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме).
Видимо Модераторы плохо знают правила раз сами их не знают. Сделал как и написано было тему [autoit]Fraps и Punpad Shell4 но какой то модератор удалил эту тему!!!

jameszero
28-01-2007, 00:39
borzoy
Я отправил вам оповещение, что ваша тема [autoit] Fraps и Punpad Shell4, с просьбой помочь создать скрипт, перенесена в созданную вами же тему Помогите с тихой установкой Fraps и Runpad Shell (http://www.forum.oszone.ru/thread-78131.html), в которой уже начато обсуждение.
Зачем создавать одинаковые темы? ОПК (http://forum.oszone.net/rules.html) - пункт 2.1
(Тема переименована в [autoit] Fraps и Runpad Shell, ни один пост не удалён)

Creat0R
29-01-2007, 18:44
В AutoIt'е плохо (а точнее не корректно) работает функция FileDelete - например если написать её так:

FileDelete(@TempDir & "\")

То в папке @TempDir будут удалены все файлы (не папки), т.е если я укажу файл для удаления в виде переменной, и каким то образом эта переменная окажется пуста (""), то может произойти нежеланная катастрофа :blush2: - будьте очень остарожны, я на днях попал на эту удочку (правда к счастью у меня был бекап уалившихся файлов).

Diamond
30-01-2007, 06:28
Creat0R
В AutoIt'е плохо (а точнее не корректно) работает функция FileDelete
Здесь, если даже не включать проверку на существование файла, то (в случае с пустой переменной или отсутствием файла) скрипт завершиться с ошибкой, но ничего удалено не будет! :tongue:
Думаю всё же, такой способ надёжней в плане безопасности, чем мучаться и придумывать разные хитрости, пытаясь исправить баг AutoIt'а. :)
Dim $fso
;~ Создание объекта
$fso = ObjCreate("scripting.filesystemobject")

;~ Удаление файла
Func DeleteFile($FileSpec)
If $fso.FileExists($FileSpec) Then
$fso.DeleteFile($FileSpec, True)
EndIf
EndFunc

;~ Удаление папки
Func DeleteFolder($FolderSpec)
If $fso.FolderExists($FolderSpec) Then
$fso.DeleteFolder($FolderSpec, True)
EndIf
EndFunc

Creat0R
04-02-2007, 06:38
Diamond
Да, это неплохой способ, спасибо, возьмём его пожалуй в арсенал функции аутоита ;)

[hr]

Я что-то не нашёл функции, которая проверяла бы данное число на чётность/не чётность, и решил её сам сделать (понадобилась сея функция), но не уверен что это правильное решение, может уже есть подобная функция, или у кого то есть более универсальное предложение? :shuffle:


$iNumber = 2075674

If _IsEven($iNumber) Then
MsgBox(64, "Even check", "The given number <" & $iNumber & "> is an Even number")
Else
MsgBox(64, "Even check", "The given number <" & $iNumber & "> is not an Even number (it is Odd)")
EndIf

Func _IsEven($NumString)
If $NumString < 1 Then
$NumStrArr = StringSplit($NumString, ".")
If IsArray($NumStrArr) And $NumStrArr[0] > 1 Then $NumString = $NumStrArr[2]
EndIf
If IsFloat($NumString / 2) Then
Return 0
Else
Return 1
EndIf
EndFunc


.........
И ещё, заметил вроде ещё багу в аутоите, проверить очень просто:

MsgBox(0, "", 0.00001)

Получаем 1e-005 - и это так должно быть? я понимаю что можно заключить в кавычки, и тогда будет отображать дословно, но просто интересно, почему это происходит? :blink:

amel27
04-02-2007, 07:18
Creat0R
Привет, на самом деле все гораздо проще:Func _IsEven ($num)
If Mod($num,2)=0 Then
Return 1
Else
Return 0
EndIf
EndFunc
...хотя твои манипуляции с точкой наводят на мысль что обычной четности тебе мало (имеет смысл только для целых чисел).
И ещё, заметил вроде ещё багу в аутоитеЭто не баг, это фича. ;) ...Это разное представление одного числа, поэтому все вполне корректно.
Для однозначного представления используй StringFormat:MsgBox (0,'',StringFormat('%.5f',0.00001))

amel27
04-02-2007, 08:29
Creat0R
Diamond

Красивый способ для FileDelete с форума поддержки:Func _FileDelete ($file)
If Not StringInStr(FileGetAttrib($file),'D') Then
FileDelete($file)
EndIf
EndFunc

Diamond
04-02-2007, 20:34
Подскажите, как с помощью WinApi поменять частоту обновления экрана?
В интернете есть множество примеров с использованием библиотеки: user32.dll функция: ChangeDisplaySettingsA, но как реализовать это в AutoIt совершенно не представляю. Очень надо!!!

Creat0R
05-02-2007, 00:51
amel27
на самом деле все гораздо проще
Действительно, а главное, этот пример есть и в справке, как я его упустил :) спасибо!

твои манипуляции с точкой наводят на мысль что обычной четности тебе мало
Просто хотел проверять и чётность дробных чисел.

Красивый способ для FileDelete с форума поддержки
Хм, это видимо самый верный способ, просто проверяется если это не папка, тогда удаляется файл... а разработчики вкурсе об этом? почему не сделают “офицеальную” команду в таком же духе ;)

[hr]

Такой вопрос:
Как послать обычное нажатие клавишы Windows (с изображением окон)? нужно отдельно в експлорере вызвать контекстное меню, и единственны способ который мне пришел в голову, так это нажать эту клавишу...
Пробую так:
Send("#")
Ничего не происходит, в полукруглые скобки заключать пробовал, тоже никакого эффекта, есть идеи?

Или, как можно обновить окно експлорера, но не посыланием F5, а именно полноценным обновлением (в некоторых случаях F5 не помагает).

Creat0R
06-02-2007, 04:32
Ещё способ удаления файла:


Func _FileDelete($Path, $FileName)
If StringLen($FileName) >= 1 Then FileDelete($Path & "\" & $FileName)
EndFunc


А также способ подсчёта количества символов в файле:


$FileName = @ScriptDir & "\test.txt"
$FileCharCount = _FileCountChar($FileName, 0)
If $FileCharCount <> -1 Then
MsgBox(64, "File Characters Count", "In the file <" & $FileName & "> was found [" & $FileCharCount & "] characters (including Carriage Returns and Line Feeds)")
Else
MsgBox(16, "Error!", "The file <" & $FileName & "> was not found")
EndIf

Func _FileCountChar($FileName, $Flag=0)
If Not FileExists($FileName) Then Return -1
Local $CharsCount = 0
$fRead = FileRead($FileName, FileGetSize($FileName))
$fReadArr = StringSplit($fRead, "")
If IsArray($fReadArr) Then
For $i = 1 To $fReadArr[0]
If ($Flag = 1 And $fReadArr[$i] <> @CR And $fReadArr[$i] <> @LF) Or ($Flag = 2 And $fReadArr[$i] <> @CR) Or ($Flag = 3 And $fReadArr[$i] <> @LF) Or $Flag = 0 Then $CharsCount += 1
Next
Return $CharsCount
EndIf
EndFunc



Если поставить последний параметр как 1 ($Flag=1), то подсчёт не будет учитывать возврат каретки и перевод строки (@CRLF), если поставить параметр на 2, то будут учитываться все символы кроме @CR, ну а если поставит параметр $Flag = 3, то будут учитываться все символы за исключением символа перевода строки (@LF).




© OSzone.net 2001-2012