|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты |
|
|
[архив - Часть 2] AutoIt скрипты
|
|
(*.*) Сообщения: 36572 |
Внимание! Тема переведена в архивное состояние Текущая тема http://forum.oszone.net/thread-98914.html (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе c AutoIt. ![]() Сайт программы Русская справка Коллекция AutoIt скриптов от Sanja Alone Коллекция AutoIt скриптов от MSFN (могут быть устаревшие). Справочник по командам rundll32 (команды запуска диалоговых окон и не только...) AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо). Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров. Цитата Vadikan:
|
||
|
------- Отправлено: 00:02, 05-02-2006 |
|
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать gregaz
Цитата:
также и с папками... Но учти, в версии 3.2.2.0 и ранее, есть баг - если пытаться переименовать файл в то же имя но с разным регистром, файл удаляется, к примеру вот так: Файл C:\test.txt будет удалён. Я дал знать разработчикам об этом баге, и в версиях выше чем 3.2.2.0 они вроде это поправили. Цитата:
.amel27 Цитата:
Func _InetGetSpeed($Sleep=1000)
Local $BytesCheckBefore = @InetGetBytesRead
Sleep($Sleep)
Local $BytesCheckAfter = @InetGetBytesRead
Local $RetSpeedByBytes = $BytesCheckAfter - $BytesCheckBefore
If $RetSpeedByBytes < 0 Then $RetSpeedByBytes = 0
Return $RetSpeedByBytes
EndFunc
Цитата:
. |
||||
|
------- Отправлено: 19:36, 11-06-2007 | #11 |
|
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
If Not(InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "xpSP2_ru.exe", 1, 1)) Then MsgBox (16,'','')
$begin = TimerInit()
While @InetGetActive
Sleep(250)
$AverageSpeed = (@InetGetBytesRead / TimerDiff($begin))
TrayTip("Downloading", "Average Speed = " & Int($AverageSpeed) & " Kbyte/sec", 10, 16)
Wend
Цитата:
Global $InetSpeed = 0, $InetGetBytesRead = 0, $InetTimeStamp = 0
AdlibEnable ("_InetGetSpeed", 1000)
InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
While @InetGetActive
Sleep(250)
TrayTip("Downloading", "Speed = " & Int($InetSpeed) & " Kbyte/sec", 10, 16)
Wend
Func _InetGetSpeed()
If @InetGetActive Then
If @InetGetBytesRead <> -1 Then
Local $ticks = TimerDiff($InetTimeStamp)
If $ticks>0 Then $InetSpeed = (@InetGetBytesRead-$InetGetBytesRead) / $ticks
EndIf
$InetGetBytesRead = @InetGetBytesRead
$InetTimeStamp = TimerInit()
Else
$InetGetBytesRead = 0
$InetSpeed = 0
EndIf
EndFunc
|
||
|
Последний раз редактировалось amel27, 13-06-2007 в 03:11. Отправлено: 09:38, 12-06-2007 | #12 |
|
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Хотя это можно совмещать... но почему бы не поместить функцию в цикл, и передавать ей как параметр чтение байтов, и возвращать с неё данные о скорости? это мне кажется лучший вариант... Global $InetSpeed = 0, $InetGetBytesRead = 0, $InetTimeStamp = 0, $begin = TimerInit()
InetGet("http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.4.4-setup.exe", "test.exe", 1, 1)
While @InetGetActive
Sleep(200)
$Bytes = @InetGetBytesRead
$InetSpeed = _InetGetSpeed($Bytes)
$AverageSpeed = $Bytes*1000 / TimerDiff($begin)
TrayTip("Downloading", "Speed = " & Round($InetSpeed/1024, 1), 10, 16)
Wend
MsgBox(0, "", "Avarage speed is: " & Round($AverageSpeed/1024, 1))
Func _InetGetSpeed($Bytes)
If @InetGetActive Then
If $InetTimeStamp Then
Local $Ticks = TimerDiff($InetTimeStamp)
If $Ticks > 0 Then $InetSpeed = ($Bytes-$InetGetBytesRead)*1000 / $Ticks
EndIf
$InetGetBytesRead = $Bytes
$InetTimeStamp = TimerInit()
Else
$InetTimeStamp = 0
$InetGetBytesRead = 0
$InetSpeed = 0
EndIf
Return $InetSpeed
EndFunc
Спасибо за примеры, вроде всё работает как надо .P.S А среднюю скорость мне нужно не в цикле отображать, а подсчитать её для конечного вывода (чтобы показать юзеру с какой скоростью (средней) закаивался файл за весь промежуток закачки). Diamond По теме словарей (Dictionary): http://www.autoitscript.com/forum/in...6entry352256 |
|
|
------- Отправлено: 03:02, 13-06-2007 | #13 |
|
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
З.Ы. скрипт привел к работоспособному виду. |
|
|
Отправлено: 03:24, 13-06-2007 | #14 |
|
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
P.S А по поводу средней скорости.... на выходе из цикла переменная $AverageSpeed будет содержать общую среднюю скорость закачки на промежуток времени всей закачки, или она будет содержать последнюю засеченную среднюю скорость (на выходе из цикла)? |
|
|
------- Отправлено: 04:51, 13-06-2007 | #15 |
|
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
тем более, что у него нет ограничений на количество запусков...Цитата:
Цитата:
Global $AdLibMS=500, $InetBytesBack = 10
Global $InetSpeed = 0, $InetTimeStamp
Global $InetBytesRead[$InetBytesBack+1]
AdlibEnable ("_InetGetSpeed", $AdLibMS)
InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
While @InetGetActive
Sleep(100)
$bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1000)
$speed = StringFormat('Speed: %d Kb/Sec',$InetSpeed)
TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend
Func _InetGetSpeed()
Local $nb ; Значение массива по текущему индексу до его обновления (цикл назад)
If @InetGetActive Then
; Если первый раз, то инициализируем массив
If $InetBytesRead[0]=0 Then $InetBytesRead[0] = 1
; Ищем следущую ячейку массива
$InetBytesRead[0]+=1
If $InetBytesRead[0] > $InetBytesBack Then $InetBytesRead[0]=1
; Сохраняем значение массива в переменной (сколько было байт 1 цикл назад)
$nb = $InetBytesRead[$InetBytesRead[0]]
; Записываем новое значение загруженных байт
$InetBytesRead[$InetBytesRead[0]] = @InetGetBytesRead
; Выбираем формулу в зависимости от того проходим первый цикл или уже нет
If $nb >0 Then
$InetSpeed = ($InetBytesRead[$InetBytesRead[0]]-$nb)/($AdLibMS * $InetBytesBack)
Else
$InetSpeed = $InetBytesRead[$InetBytesRead[0]]/($AdLibMS * $InetBytesRead[0])
EndIf
Else
; Если нет закачки затираем массив и сбрасываем параметры
If $InetBytesRead[0]>0 Then Global $InetBytesRead[$InetBytesBack+1]
$InetSpeed = 0
EndIf
EndFunc
|
|||
|
Последний раз редактировалось amel27, 13-06-2007 в 12:39. Отправлено: 12:18, 13-06-2007 | #16 |
|
Новый участник Сообщения: 10
|
Профиль | Отправить PM | Цитировать Написал скрипты установки MathCAD 2001 и AutoCAD 2006 Mechanical.
В MathCAD 2001 после установки при первом запуске программы производится какая-то настройка. При этом необходимо не вынимать установочный диск. Грубо говоря, тыкаешь ярлык к mathcad.exe и запускается прогресс бар msi-настройщика длящийся около минуты. У ярлыка не указаны никакие ключи командной строки (точнее поле объект в свойствах ярлыка вообще неактивно и недоступно для просмотра). Поэтому простой запуск Run (@Programfilesdir & 'Mathsoft\Mathcad 2001 professional\mathcad.exe') Processwait('процесс') ProcessWaitClose('процесс') ProcessClose ('mathcad.exe') не помогает! При этом первой строчкой запускается сам Маткад и никакой настройки не производится. Настройка происходит только при запуске через ярлык. Как узнать что именно при этом происходит? В AutoCAD 2006 Mechanical после установки при первом запуске запускается процесс регистрации. Только строчка Run (@Programfilesdir & '...\...\Acad.exe') тоже не помогает. При отработке этой строчки из скрипта, выскакивает диалоговое окно сообщающее о том, что система не может найти како-то .dll. Если же сразу после этого запустить AutoCAD вручную - то все нормально! Помогите! |
|
Отправлено: 14:34, 13-06-2007 | #17 |
|
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Внедрённый HTML объект
Анимированный gif, звук (в бесконечном цикле!), плюс эффект с текстом. З.Ы. Пытался с помощью дополнительных стилей убрать рамку у объекта , но нашёл лишь несколько новых рамок... и всё же есть одна небольшая хитрость: В коде есть четыре закомментированных параметра, если их задействовать - то рамка исчезнет. $sound=@ScriptDir & "\MUSIC9.MID"
$image=@ScriptDir & "\butterfly.gif"
Opt("GUIOnEventMode",1)
#include <GUIConstants.au3>
$hGUI=GUICreate("Embedded Web control Test", 442, 300)
GUISetOnEvent($GUI_EVENT_CLOSE,"Quit")
$oIE = ObjCreate("Shell.Explorer.2")
$GUIActiveX = GUICtrlCreateObj($oIE, 1, 1, 440, 62)
$oIE.navigate ("about:blank")
While $oIE.busy
Sleep(200)
WEnd
$oIE.document.write('<bgsound loop="-1" src="' & $sound & '">')
$oIE.document.write('<marquee behavior="alternate" direction="right"><font size="+3" color="#ff00ff"><b>Web control Test</b></font></marquee>')
$oIE.refresh
;~ $oIE.height=66
;~ $oIE.width=444
;~ $oIE.left=-4
;~ $oIE.top=-4
$oIE.document.body.scroll = "no"
$oIE.document.body.bgcolor = "buttonface"
$oIE.document.body.leftmargin = "2"
$oIE.document.body.rightmargin = "2"
$oIE.document.body.topmargin= "10"
$oIE.document.body.background = $image
GUICtrlSetStyle($GUIActiveX,-1,0x1999)
GUICtrlSetState($GUIActiveX,$GUI_DISABLE)
GUISetState(@SW_SHOW)
While 1
Sleep(1000)
WEnd
Func Quit()
Exit
EndFunc
Цитата:
![]() В любом случае, большое спасибо! ![]() |
|
|
Последний раз редактировалось Diamond, 19-06-2007 в 20:38. Причина: добавил в коде кое что... Отправлено: 18:33, 13-06-2007 | #18 |
|
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Цитата:
Вот как я сделал: Global $InetBytesRead[10+1]
InetGet("http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.4.4-setup.exe", "test.exe", 1, 1)
$begin = TimerInit()
While @InetGetActive
Sleep(100)
$InetSpeed = _InetGetSpeed(100)
$bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1024)
$speed = StringFormat('Speed: %d Kb/Sec',$InetSpeed)
TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend
MsgBox (64,'', "Download is finished with Avarage Speed of: " & Int(FileGetSize("test.exe")/TimerDiff($begin)) & " kb/s")
Func _InetGetSpeed($AdLibMS=500)
Local $nb ; Значение массива по текущему индексу до его обновления (цикл назад)
Local $InetSpeed = 0, $InetBytesBack = 10
If @InetGetActive Then
; Если первый раз, то инициализируем массив
If $InetBytesRead[0]=0 Then $InetBytesRead[0] = 1
; Ищем следущую ячейку массива
$InetBytesRead[0]+=1
If $InetBytesRead[0] > $InetBytesBack Then $InetBytesRead[0]=1
; Сохраняем значение массива в переменной (сколько было байт 1 цикл назад)
$nb = $InetBytesRead[$InetBytesRead[0]]
; Записываем новое значение загруженных байт
$InetBytesRead[$InetBytesRead[0]] = @InetGetBytesRead
; Выбираем формулу в зависимости от того проходим первый цикл или уже нет
If $nb >0 Then
$InetSpeed = ($InetBytesRead[$InetBytesRead[0]]-$nb)/($AdLibMS * $InetBytesBack)
Else
$InetSpeed = $InetBytesRead[$InetBytesRead[0]]/($AdLibMS * $InetBytesRead[0])
EndIf
Else
; Если нет закачки затираем массив и сбрасываем параметры
If $InetBytesRead[0]>0 Then Global $InetBytesRead[$InetBytesBack+1]
$InetSpeed = 0
EndIf
Return $InetSpeed
EndFunc
Кстати, у тебя в примере чтобы получить кб, байты деляться на 1000: Разве не на 1024 нужно делить? |
||
|
------- Отправлено: 22:20, 13-06-2007 | #19 |
|
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
![]() AdLib хорош тем, что он не зависит от скрипта (есть соединение или нет) и временной интервал всегда одинаков. В твоем варианте интервал между "временнЫми засечками" на самом деле >100 ровно на столько, сколько потребуется скрипту на выполнение команд после Sleep(100). Обычно это неcущественно, но в общем случае он может быть любым (особенно если где-нибудь есть еще один Sleep() ), соответственно показания скорости будут неверными. Для сохранения точности придется в дополнение к @InetGetBytesRead сохранять показания TimerInit(), хотя интервал замера уже перестанет быть фиксированным... Кроме того инициализацию массива придется возложить на основной скрипт, так как функция не знает старая это закачка или новая.
Global $InetBytesRead
InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
_GetProgressSpeed ($InetBytesRead, @InetGetBytesRead, 100)
While @InetGetActive
Sleep(100)
$bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1024)
$speed = StringFormat('Speed: %d Kb/Sec',_GetProgressSpeed ($InetBytesRead, @InetGetBytesRead) *0.9765625)
TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend
Func _GetProgressSpeed (ByRef $arrValueBack, $intValue = -1, $intCountBack = 0)
Local $nb, $nt, $bound = UBound($arrValueBack,1)
If $intCountBack<=0 Then $intCountBack = $bound-1 ; Восстанавливаем актуальное значение глубины отката
; Блок инициализации массива и контроля ошибок
If $intCountBack<=0 Then Return SetError(1, 0, -1) ; Ошибка размерности 1
If $intValue<0 Then
Dim $arrValueBack [$intCountBack+1][2] = [[1,TimerInit()]]
Return 0
ElseIf $intCountBack<>$bound-1 Then
Dim $arrValueBack [$intCountBack+1][2] = [[1,TimerInit()],[$intValue,TimerInit()]]
Return 0
Else
If UBound($arrValueBack,2)<2 Then Return SetError(2, 0, -1) ; Ошибка размерности 2
If ($arrValueBack[0][0]<=0) Or ($arrValueBack[0][0]>$intCountBack) Then Return SetError(3, 0, -1) ; Ошибка целостности
EndIf
; Ищем следующую ячейку массива
$arrValueBack[0][0]+=1
If $arrValueBack[0][0] > $intCountBack Then $arrValueBack[0][0]=1
; Сохраняем значения массива в переменных (цикл назад)
$nb = $arrValueBack[$arrValueBack[0][0]][0]
$tb = $arrValueBack[$arrValueBack[0][0]][1]
; Записываем новые значения загруженных байт и время
$arrValueBack[$arrValueBack[0][0]][0] = $intValue
$arrValueBack[$arrValueBack[0][0]][1] = TimerInit()
; Выбираем формулу в зависимости от того проходим первый цикл или нет
If $nb =0 Then Return $arrValueBack[$arrValueBack[0][0]][0] / TimerDiff($arrValueBack[0][1])
Return ($arrValueBack[$arrValueBack[0][0]][0]-$nb) / TimerDiff($tb)
EndFunc
Цитата:
...кстати, множитель 0.9765625 как раз отвечает за перевод исходной величины Byte/ms в KByte/sec |
|||
|
Последний раз редактировалось amel27, 15-06-2007 в 06:02. Отправлено: 10:55, 14-06-2007 | #20 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Открывая 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 | |
|