Войти

Показать полную графическую версию : [архив - Часть 2] 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Creat0R
20-08-2007, 23:29
spooll,
желательно опробовать на паре компов
Ага, мнеб один мой родной (единственный) в порядок привести... ;)

Попробую скачаю, завтра отпишусь о результатах..

Maza Faka,
2-ой вариант, тоже не работает
У меня работает, ты просто не считаешь счётчики в двух циклах... я так понял нужно во всех каталогах удалить все файлы?


Dim $PathFile[2][2] = [["c:\test", "c:\1"], ["soccer5.bmp", "soccer9.bmp"]]

Dim $Del = 0

For $i = 0 To UBound($PathFile)-1
For $j = 0 To UBound($PathFile)-1
$Del += DeleteFile($PathFile[0][$i], $PathFile[1][$j])
Next
Next

MsgBox(64, "Result", $Del & " files deleted")

Func DeleteFile($path, $delFile)
Local $count = 0
$search = FileFindFirstFile($path & "\*.*")
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
$Full_file = $path & "\" & $file
If FileGetAttrib($Full_file) = "D" Then
$count += DeleteFile($Full_file, $delFile)
ElseIf $file = $delFile Then
$count += FileDelete($Full_file)
EndIf
WEnd
FileClose($search)
Return $count
EndFunc

Maza Faka
21-08-2007, 11:21
Как правильно изменять размерность массива? Вот так не работает:

#include <Array.au3>
$var = DriveGetDrive("All")

_ArrayDelete($var, 1)
$var[0] -= 1
ReDim $var[$var[0]-1]

MsgBox(0, "", $var[0])
For $i = 1 To $var[0]
MsgBox(64, "", $var[$i])
Next

amel27
21-08-2007, 11:35
Вот так не работаета зачем ReDim()?.. _ArrayDelete() и без него уменьшает размерность на 1

Creat0R
21-08-2007, 15:14
spooll

Кажется нашёл твою проблему(ы)...

У тебя видимо в настройках автоматом подставляется Организация:, если там пусто (у тех у кого этого не происходит), то кнопка Далее не активна, отсюда могут быть многие зависания.
Поэтому нужно проверять это дело...

Далее, окно с подтверждением этой информации, и многие другие окна почему то требует активирования чтобы нормально нажать кнопку..

У тебя ожидается окно "Создание нового каталога", как ты уверен что оно появится? а вдруг каталог уже существует?

С такими скриптами нужно стараться учитывать все варианты ;)

Вот что у меня получилось:


Opt("RunErrorsFatal", 0)
Opt("WinTitleMatchMode", -4)

$RegRead1CPath = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\1C\1Cv7\7.7\1С:Предприятие для SQL", "1CPath")
If FileExists($RegRead1CPath) Then Exit

$1c_InstallPath = "\\192.168.11.198\Distrib\1s_install"

BlockInput(1)

Run($1c_InstallPath & "\B770023\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки 1С:Предприятия.")
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки 1С:Предприятия.", "Button1")

WinWait("Выбор варианта установки", "Выберите вариант установки программы 1С:Предприятие.")
ControlClick("Выбор варианта установки", "Выберите вариант установки программы 1С:Предприятие.", "Button6")

$UserInfoInputText = "Введите Ваше имя и название Вашей организации."
WinWait("Информация о пользователе", $UserInfoInputText)
$GetText_1 = ControlGetText("Информация о пользователе", $UserInfoInputText, "Edit1")
$GetText_2 = ControlGetText("Информация о пользователе", $UserInfoInputText, "Edit2")
If $GetText_1 = "" Then ControlSetText("Информация о пользователе", $UserInfoInputText, "Edit1", @UserName)
If $GetText_2 = "" Then ControlSetText("Информация о пользователе", $UserInfoInputText, "Edit2", @UserName)
ControlClick("Информация о пользователе", "Введите Ваше имя и название", "Button2")

WinWait("Информация о пользователе", "Верна ли информация для регистрации?")
WinActivate("Информация о пользователе", "Верна ли информация для регистрации?")
ControlClick("Информация о пользователе", "Верна ли информация для регистрации?", "Button1")

WinWait("Выбор каталога для установки", "Программа установки поместит 1С:Предприятие в выбранный каталог.")
$GetPathText = ControlGetText("Выбор каталога для установки", _
"Программа установки поместит 1С:Предприятие в выбранный каталог.", "Static2")
WinActivate("Выбор каталога для установки", "Программа установки поместит 1С:Предприятие в выбранный каталог.")
ControlClick("Выбор каталога для установки", "Программа установки поместит 1С:Предприятие в выбранный каталог.", "Button1")

If Not FileExists($GetPathText) Then
WinWait("Создание нового каталога", "Вы ввели следующее имя каталога:", 5)
If WinExists("Создание нового каталога", "Вы ввели следующее имя каталога:") Then
WinActivate("Создание нового каталога", "Вы ввели следующее имя каталога:")
ControlClick("Создание нового каталога", "", "Button1")
EndIf
EndIf

WinWait("Выбор программной группы", "Выберите из существующих или")
WinActivate("Выбор программной группы", "Выберите из существующих или")
ControlClick("Выбор программной группы", "Выберите из существующих или", "Button2")

WinWait("Установка 1С:Предприятия", "Программа установки скопировала файлы")
WinActivate("Установка 1С:Предприятия", "Программа установки скопировала файлы")
ControlClick("Установка 1С:Предприятия", "Программа установки скопировала файлы", "Button2")

WinWait("Установка 1С:Предприятия", "Установка программы 1С:Предприятие успешно завершена.")
WinActivate("Установка 1С:Предприятия", "Установка программы 1С:Предприятие успешно завершена.")
ControlClick("Установка 1С:Предприятия", "Установка программы 1С:Предприятие успешно завершена.", "Button1")

Run($1c_InstallPath & "\B770025\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки")
WinActivate("Добро пожаловать", "Добро пожаловать в программу установки")
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button1")

WinWait("Список установленных программ", "Из списка найденных на данном компьютере")
ControlClick("Список установленных программ", "Из списка найденных на данном компьютере", "Button4")

WinWait("Обновление 1С:Предприятия", "При работе с сетевыми версиями")
WinActivate("Обновление 1С:Предприятия", "При работе с сетевыми версиями")
ControlClick("Обновление 1С:Предприятия", "При работе с сетевыми версиями", "Button2")

WinWait("Обновление 1С:Предприятия", "Обновление программы 1С")
WinActivate("Обновление 1С:Предприятия", "Обновление программы 1С")
ControlClick("Обновление 1С:Предприятия", "Обновление программы 1С", "Button1")
BlockInput(0)

Run($1c_InstallPath & "\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
If @error Then Quit()

$PathTitle = "regexp=Патч 1С:Предприятие [0-9]"

WinWait($PathTitle, "Вы запустили программу")
ControlClick($PathTitle, "Вы запустили программу", "Button1")

WinWait("PatchWise Updater", "ОК")
WinActivate("PatchWise Updater", "ОК")
ControlClick("PatchWise Updater", "ОК", "Button1")

WinWait($PathTitle, "&Обновить")
ControlClick($PathTitle, "&Обновить", "Button2")

Run($1c_InstallPath & "\link.cmd")

Quit()

Func Quit()
BlockInput(0)
Exit
EndFunc


Maza Faka,
Если я правильно понял, то в этом случае можно вообще не трогать массив:


$var = DriveGetDrive("All")

MsgBox(0, "", $var[0])

For $i = 2 To $var[0]
MsgBox(64, "", $var[$i])
Next

Maza Faka
21-08-2007, 16:39
Creat0R
можно вообще не трогать массив:
$var = DriveGetDrive("All") я привёл для примера, просто интересует корректное изменение размерности массива при помощи "Redim".

amel27, _ArrayDelete() и без него уменьшает размерность на 1
Да, он удаляет элемент из массива, но размерность остаётся прежней:

#include <Array.au3>
$var = DriveGetDrive("All")

_ArrayDelete($var, 1)

MsgBox(64, "", $var[0]) ;Размерность остаётся неизменной
For $i = 1 To UBound($var) - 1
MsgBox(64, "", $var[$i])
Next

Приведите ПЛЗ пример с использованием "Redim".

Creat0R
21-08-2007, 17:37
Maza Faka,
размерность остаётся прежней:
Это не размерность, а значение в нулевом элементе, видимо ошибка _ArrayDelete()...

Приведите ПЛЗ пример с использованием "Redim".


#include <Array.au3>

Dim $Array[5] = [4, 1, 2, 3, 4]

_ArrayDisplay($Array)

ReDim $Array[4]
$Array[0] = 3

_ArrayDisplay($Array)

Maza Faka
21-08-2007, 18:42
Creat0R
Спасибо за пример.
Так вроде тоже работает:

#include <Array.au3>

Dim $Array[5] = [4, 1, 2, 3, 4]

_ArrayDisplay($Array)

ReDim $Array[4]
;$Array[0] = 4

_ArrayDisplay($Array)

Maza Faka
21-08-2007, 19:33
Как сделать, что бы работал $Gui_Event_Close в цикле "For"?


#include <GUIConstants.au3>

$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()

Select
Case $msg = $Button
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
For $i = 10 To 100 Step 10
Sleep(300)
GUICtrlSetData($Progress, $i)
If $i = 100 Then $i = 0
Next
WEnd

Case $msg = $Gui_Event_Close
ExitLoop
EndSelect
WEnd

Creat0R
22-08-2007, 00:27
Maza Faka,
Так вроде тоже работает:
Тут же не вопрос о работоспособности :) - Я просто привёл пример, и то что ты закоментировал, как раз и предназначено для присвоения нового значения размерности массива нулевому элементу.

Кстати, amel27 как то у меня спрашивал, откуда у меня такое недоверие к $Array[0], вот именно функция _ArrayDelete() и доказывает, что надёжнее использовать Ubound($Array)-1 ;)

Вот ещё пример с ReDim...


#include <Array.au3>

Dim $NewArray[1] ;Массив практический пуст...

;Отобразим его...
_ArrayDisplay($NewArray)

; А теперь заполним добавляя каждый раз новый элемент
For $i = 1 To 10
ReDim $NewArray[ UBound($NewArray) + 1 ]
$NewArray[ UBound($NewArray) - 1 ] = "Array Element Data #" & $i
Next
$NewArray[0] = UBound($NewArray) - 1

;Отобразим его снова, но уже заполненный ;)...
_ArrayDisplay($NewArray)



Как сделать, что бы работал $Gui_Event_Close в цикле "For"?
Уменьшить Sleep (до 30 к примеру) и проверять GUIGetMsg() в теле цикла...
Хотя я бы в данном случае использовал Events (события) метод...


#include <GUIConstants.au3>

$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()
Select
Case $msg = $Button
For $i = 10 To 100 Step 1
If GUIGetMsg() = $GUI_EVENT_CLOSE Then ExitLoop 2
Sleep(30)
GUICtrlSetData($Progress, $i)
If $i = 100 Then $i = 0
Next
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd

Creat0R
22-08-2007, 01:09
А многие ли знают о том, что скомпилированный скрипт работает почти как полноценный интерпритатор кода AutoIt?
Т.е если мы скомпилируем скрипт, перенесём екзешник на компьютер где нет аутоита, и совершенно в любом файле (текстового характера), впишем код с синтаксисом AutoIt, то примерно следующая строка сможет выполнить этот файл как любой au3 файл где установлен AutoIt:

Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteScript "test.app"')

Это же открывает ворота в совсем иное измерение! :yahoo:
Таким образом к примеру, можно даже создавать собственный (примитивный однако) язык программирования :clever-ma .
А ещё можно выполнять код программы без вывода критических сообщении (если скрипт выпадает).

amel27
22-08-2007, 04:41
amel27 как то у меня спрашивал, откуда у меня такое недоверие к $Array[0], вот именно функция _ArrayDelete() и доказывает, что надёжнее использовать Ubound($Array)-1ничего это не доказывает - нужно просто внимательно читать документацию по функции, в _ArrayDelete() индекс может быть равен нулю значит она не поддерживает счетчики. Строго говоря, "массив со счетчиком" - это специальный пользовательский тип данных (UDT), отличный от обычного массива... соответственно, функция должна "понимать" этот тип

примерно следующая строка сможет выполнить этот файл как любой au3 файл где установлен AutoItдля полноты картины - можно выполнять не только файлы, но и отдельные команды:Run(@AutoItExe & " /ErrorStdOut /AutoIt3ExecuteLine " & chr(34) &"MsgBox(0, 'Привет', 'Привет от:'& @CR & @computername)"& chr(34))

Creat0R
22-08-2007, 05:18
amel27,
индекс может быть равен нулю значит она не поддерживает счетчики.
Я просто ориентируюсь на встроенных функциях, все они возвращают в нулевом элементе массива общее число элементов.

ожно выполнять не только файлы, но и отдельные команды
Я вкурсе :) - Это то и дало мне толчок в эту сторону... я раньше думал, что используя @AutoItExe & " /AutoIt3ExecuteLine ...", нужен обязательно установленный AutoIt... но оказывается нужен всего лишь закомпилированный скрипт.

Maza Faka
22-08-2007, 08:26
Creat0R
Спасибо за примеры с Redim и Progress!

А многие ли знают о том, что скомпилированный скрипт работает почти как полноценный интерпритатор кода AutoIt?

Запустить AutoIt3 скрипт на выполнение из скомпилированного AutoIt3 сценария:
Compiled.exe [/ErrorStdOut] [/AutoIt3ExecuteScript file] [params ...]
Эта форма позволяет сэкономить размер установки и использовать копию интерпретатора AutoIT3.exe, который уже находится внутри скомпилированного скрипта

P.S. ErrorStdOut Позволяет перенаправить все фатальные ошибки на стандартное устройство вывода (StdOut), которое можно перенаправить в приложения, например, редактор Scite
И как это сделать?

Creat0R
22-08-2007, 08:36
Maza Faka,
И как это сделать?
Что именно? пренаправить? вроде это приложение само должно перехватывать из этого устройства (методом StdRead).
А вот как заставить первичный скрипт не выпадать с фатальной ошибкой (т.е выпадть, но без сообщении), я если честно и сам не могу сообразить... разве что писать весь код программы во временный файл, и запускать с нужными параметрами из закомпилированного скрипта... но это кажется не очень практично.

mikola1983
22-08-2007, 09:21
как сделать предложение пользователю. хочешь установить? если да то происходит установка если нет то генерится сообщение и высылается на емайлесли у кого есть готовый скрипт поделитесь пожалуйста.

Creat0R
22-08-2007, 09:34
mikola1983,
как сделать предложение пользователю. хочешь установить?

Не знаю как (и возможно ли вообще) на email отсылать, но вот пример с вопросом:


$Ask = MsgBox(36, "Вопрос", "хочешь установить?")
If $Ask = 6 Then
MsgBox(64, "Ответ", "Отлично, устанавливаем!")
;тут устанавливаем
Else
MsgBox(48, "Ответ", "А жаль :(")
;тут отсылаем на email ;)
EndIf

Maza Faka
22-08-2007, 09:40
Creat0R
Как сделать это-же, только в режиме OnEvent?

#include <GUIConstants.au3>
Dim $i = 1
$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()

Select
Case $msg = $Button
GUICtrlSetData($Button, "Abort")
For $i = $i To 100
If GUIGetMsg() = $Button Then
GUICtrlSetData($Button, "Start")
ExitLoop
EndIf
Sleep(30)
GUICtrlSetData($Progress, $i)
If $i = 100 Then $i = 0
Next

Case $msg = $Gui_Event_Close
ExitLoop
EndSelect
WEnd


Пока топчусь на том, что не могу даже закрыть Gui-окно, во время цикла For :(


#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)
Dim $end = 1
$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")
GUICtrlSetOnEvent($Button, "Progress")
GUISetState(@SW_SHOW)

While 1
Sleep(500)
WEnd

Func Progress()
For $i = 10 To 100 Step 10
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")
Sleep(300)
If $i = 100 Then $i = 0
GuiCtrlSetData($Progress, $i)
Next
EndFunc

Func CloseGui()
Exit
EndFunc

amel27
22-08-2007, 10:07
Creat0R
А вот как заставить первичный скрипт не выпадать с фатальной ошибкой (т.е выпадть, но без сообщении), я если честно и сам не могу сообразить... разве что писать весь код программы во временный файл, и запускать с нужными параметрами из закомпилированного скрипта... но это кажется не очень практичноНе понял... Зачем временный файл? Ключ "/ErrorStdOut" вроде никак не связан с "/AutoIt3ExecuteScript". :blink:

mikola1983
22-08-2007, 10:16
Пасипа ... а есть какой нибуть вообще вариант отчета ....возможно 1 файл в который дабавятся имена ПК или логоны юзеров ...что нибуть такое по чему можно былобы определить кто отказался от установки.?

spooll
22-08-2007, 11:16
Creat0R,

Огромный труд, поклон тебе, мне до такого не дорасти наверное;)
У меня на компе также виснет 1ый экран, но тут явно, что я его затаскал уже вконец:)
Буду ставить юзерям, думаю все ок будет.Спасибо еще раз 8)




© OSzone.net 2001-2012