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

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

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

Ветеран


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

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


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





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


Руководство к действию по работе c AutoIt.
Можно ли с помощью AutoIt выбрать каталог? Хочу нацарапать оболочку, которая мне будет конфиги для nnBackup писать, дык выбрать каталог для бэкапа пока только вручную получается... Нельзя ли как-нть вывалить стандартный диалог по выбору файлов-папок, и получить из него результат действий пользователей?

-------
Tega AutoPatcher. Все обновления для XP в одном пакете. http://tega.ru/dirk/links.html


Отправлено: 10:47, 10-02-2006

 

Аватара для Creat0R

Must AutoIt


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

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


Sanja Alone

Цитата:
Можешь еще попробовать побороться с буфером обмена
Как не странно, но к такому (подбному) решению я пришёл до затеи использовать параметры командной строки, для записи текста в файл - в скрипте я писал так:

Код: Выделить весь код
$Text = ClipGet()

If $CmdLine[0] <> 0 Then

$Url = $CmdLine[1]

FileWrite(@ScriptDir & "\File.txt", "Скопированный текст: " & $Text & @CRLF & "Текст скопирован с документа: " & $Url)

EndIf
А команду в браузере писал так:

Код: Выделить весь код
Copy & Execute program, "Script.exe", "%u"
Таким образом, до вызова самого скрипта, выделенный текст в документе, помещается в буффер обмена, и скрипт “берёт” из буффера полный текст в переменную, и вписывает в файл. Это решение в принципе не имеет проблем, но причина по которой я хотел узнать как передавать два значения (ключа) скрипту, являлась обходом помещения текста в буффер обмена, т.е чтобы не занимать лишни раз буффер обмена.

Ещё раз спасибо за помощь!
-------------------------------------

У меня тут появилась проблема с другой сферы...

Я сделал немного примитивный (пробный) гуи интерфейс (см. код ниже), и есть пару вопросов по этому поводу:

А) Как можно сделать, чтобы после зажатия галки у надписи “Опция”, окно (MsgBox) появлялось только после зажатия, а не каждый раз. Т.е в данный момент, если я зажму галку, то сообщение появляется, если отожму, то тоже появляется - как сделать чтобы появлялось только после зажатия?

Б) У меня в гуи (GUI), есть две кнопки (кроме прочих) - Одна для отмечивания всех галок ("Выбрать все"), а другая для их снятия ("Очистить все") - Вопрос: Как сделать чтобы была такая одна кнопка, а ещё лучше тоже чекбокс, после нажатия которого\ой, выделялись бы все чекбоксы, а если отжать эту\от кнопку\чекбокс, то чтобы также и отжимались все остальные чекбоксы?

Г) Это самая большая прблема, и она у меня имеет наивысшый приоритет для решения - Я поместил в гуи прогресс бар (progressbar), и хотел бы добиться такого результата, чтобы в то время, как происходит копирование определённых файлов, этот прогресс бар был задйствован. Т.е если я копирую например большой файл (фильм к примеру), то чтобы пока он копировался, ползунок бегал в прогрес баре. Мне в принципе не нужно чтобы происходил там какого то рода подсчёт размера файла (хотя думаю в этом и заключается достижение моей задачки), и на основе чего и делался прогресс, а чтобы просто было видно что копирование в прогрессе (и не важно в каком этапе оно находится ).

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


Скрипт:

Код: Выделить весь код
#include <GUIConstants.au3>

$Form1 = GUICreate("Test", 450, 370, 214, 126)

$Opt = GUICtrlCreateCheckbox("Опция", 230, 50, 300, 20)

$File = GUICtrlCreateCheckbox("Файл", 70, 50, 97, 17)
$Edit = GUICtrlCreateCheckbox("Правка", 70, 70, 97, 17)
$View = GUICtrlCreateCheckbox("Вид", 70, 95, 97, 17)
$Bookmarks = GUICtrlCreateCheckbox("Закладки", 70, 120, 97, 17)
$Session = GUICtrlCreateCheckbox("Сеансы", 70, 145, 97, 17)

$progressbar1 = GUICtrlCreateProgress (10,10,200,20)
GUICtrlSetColor(-1,32250)

$All1 = GUICtrlCreateButton("Выбрать все", 70, 330, 90, 23)
$All2 = GUICtrlCreateButton("Очистить все", 70, 300, 90, 23)

$Start = GUICtrlCreateButton("Выполнить", 260, 330, 93, 25)
$Close = GUICtrlCreateButton("Выход", 360, 330, 70, 25)

Dim $radioval1

$group_1 = GUICtrlCreateGroup ("Группа", 255, 190, 140, 110, 100)
GUIStartGroup()
$radio_1 = GUICtrlCreateRadio ("Вариант 1", 285, 220, 90, 20)
GUICtrlSetState ($radio_1,$GUI_CHECKED)
$radio_2 = GUICtrlCreateRadio ("Вариант 2", 285, 270, 90, 20)

GUISetState(@SW_SHOW)
GUISetState ()

	While 1

; Здесь по идее, хотелось бы чтобы прогресс бар начал крутится, а остановится пусть в конце скрипта (перед wend)

$msg = GuiGetMsg()
	
	If $msg = $Opt Then MsgBox(48, "Atantion", "This is a test")
	
If $msg = $All1 Then

	GUICtrlSetState ($File,$GUI_CHECKED)
	GUICtrlSetState ($Edit,$GUI_CHECKED)
	GUICtrlSetState ($View,$GUI_CHECKED)
	GUICtrlSetState ($Bookmarks,$GUI_CHECKED)
	GUICtrlSetState ($Session,$GUI_CHECKED)
	
EndIf

If $msg = $All2 Then

	GUICtrlSetState ($File,$GUI_UNCHECKED)
	GUICtrlSetState ($Edit,$GUI_UNCHECKED)
	GUICtrlSetState ($View,$GUI_UNCHECKED)
	GUICtrlSetState ($Bookmarks,$GUI_UNCHECKED)
	GUICtrlSetState ($Session,$GUI_UNCHECKED)

EndIf
	
If $msg = $GUI_EVENT_CLOSE  Or $msg = $Close Then Exit

Select
	
	Case $msg >= $radio_1 AND $msg <= $radio_2
         $radioval1 = $msg - $radio_1

	Case $msg = $Start

If $radioval1 = 0 Then

		If GUICtrlRead($Opt) = 1 Then

EndIf

		If GUICtrlRead($File) = 1 Then


EndIf
	
		If GUICtrlRead($Edit) = 1 Then

		
EndIf

		If GUICtrlRead($View) = 1 Then


EndIf

		If GUICtrlRead($Bookmarks) = 1 Then


EndIf

		If GUICtrlRead($Session) = 1 Then

			
EndIf

If GUICtrlRead($File) <> 1 and GUICtrlRead($Edit) <> 1 and GUICtrlRead($View) <> 1 and GUICtrlRead($Bookmarks) <> 1 and GUICtrlRead($Session) <> 1 and GUICtrlRead($Opt) <> 1 Then

		MsgBox(48, "Error", "Выберите как минимум один чекбокс")
	ContinueLoop
EndIf

	MsgBox(64, "Finishing...", "Финито 1", 15)

	GUICtrlSetState ($Opt,$GUI_UNCHECKED)	
	GUICtrlSetState ($File,$GUI_UNCHECKED)
	GUICtrlSetState ($Edit,$GUI_UNCHECKED)
	GUICtrlSetState ($View,$GUI_UNCHECKED)
	GUICtrlSetState ($Bookmarks,$GUI_UNCHECKED)
	GUICtrlSetState ($Session,$GUI_UNCHECKED)
	
EndIf

If $radioval1 = 1 Then

		If GUICtrlRead($Opt) = 1 Then

EndIf

		If GUICtrlRead($File) = 1 Then

EndIf
	
		If GUICtrlRead($Edit) = 1 Then
			
EndIf

		If GUICtrlRead($View) = 1 Then

EndIf

		If GUICtrlRead($Bookmarks) = 1 Then

EndIf

		If GUICtrlRead($Session) = 1 Then
	
EndIf


If GUICtrlRead($File) <> 1 and GUICtrlRead($Edit) <> 1 and GUICtrlRead($View) <> 1 and GUICtrlRead($Bookmarks) <> 1 and GUICtrlRead($Session) <> 1 and GUICtrlRead($Opt) <> 1 Then

		MsgBox(48, "Error", "Выберите как минимум один чекбокс")
	ContinueLoop
EndIf


	MsgBox(64, "Finishing...", "Финито 2", 15)

	GUICtrlSetState ($Opt,$GUI_UNCHECKED)
	GUICtrlSetState ($File,$GUI_UNCHECKED)
	GUICtrlSetState ($Edit,$GUI_UNCHECKED)
	GUICtrlSetState ($View,$GUI_UNCHECKED)
	GUICtrlSetState ($Bookmarks,$GUI_UNCHECKED)
	GUICtrlSetState ($Session,$GUI_UNCHECKED)

EndIf
	EndSelect
		WEnd

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

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

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


Отправлено: 09:55, 01-09-2006 | #341



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

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


Пользователь


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

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


Помогите разобраться почему не работает выбор строки из выпадающего меню для Adobe Creative Suite 2 Russian by cvs/SSG

Код: Выделить весь код
ControlCommand('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1','SelectString','Photoshop CS2 9.0')
выбор строки "Photoshop CS2 9.0" не происходит

Отправлено: 21:34, 01-09-2006 | #342


Аватара для Sanja Alone

Ищу Человека…


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

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


Creat0R

А)
Код: Выделить весь код
If $msg = $Opt Then
	If GUICtrlRead($Opt)=$GUI_CHECKED Then MsgBox(48, "Atantion", "This is a test")
EndIf
Б) См. пример выше и читай о ф-циях GUICtrlRead ( controlID ), GUICtrlGetState ( [controlID] )

А где ты В) потерял?

Г) Прогрессбар - это весьма муторная штука, когда нет естественных привязок. Твой вариант - это именно тот случай (такая же проблема была и у меня в OEsr). Я не стал париться, и сделал простой "светофор" Он не мешает работе основного приложения (в данном сл. - архиватора) и дает пользователю представление о происходящем (для верности, можно в процессе/конце операции еще проигрывать звуковой файл и/или выводить сообщения в трее - SoundPlay ( "filename" [, wait] ), TrayTip ( "title", "text", timeout [, option] ) ). Я этого делать не стал, а ты можешь попробовать...



sattva
Цитата:
не работает выбор строки из выпадающего меню
Для начала, дай фокус данному эл-ту управления:
Код: Выделить весь код
ControlFocus('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1')
Если это не поможет, то замени свою строку выбора эл-та комбобокса такой:
Код: Выделить весь код
ControlCommand('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1',"SetCurrentSelection", ControlCommand('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1',"FindString",'Photoshop CS2 9.0'))
Ну, и самый тежелый случай (если 2 первых не работают):
Код: Выделить весь код
Send("{DOWN число}")
, где "число" - это требуемое к-во нажатий на кнопку для выбора нужной строки комбобокса.

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)

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

Отправлено: 04:07, 02-09-2006 | #343


Покинул форум


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

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


Sanja Alone

я не силен в скриптах пожалуста можно сделать вот скрипт

запуск c:/install/install.sfx.exe
нажать кнопку "извлечь"
вставить пароль из c:/install/password.txt
нажать кнопку "ок"
пождать пока распакуется RAR архив
подождать пока установится istall.exe
если выйдет надпись "сделать перезагрузку" нажать нет, если не выйдет надпись то ничего не делать.

Отправлено: 18:10, 02-09-2006 | #344


Пользователь


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

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


Sanja Alone

Спасибо, сработал только этот вариант
Код: Выделить весь код
Global $file='Adobe Photoshop CS2.msi', $key='keygen.exe'

; Запуск кейгена
Run ( $key )
WinWaitActive ( 'Adobe Creative Suite 2 Russian by cvs/SSG' )
ControlFocus('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1')
Send ("{DOWN}")

Отправлено: 22:19, 02-09-2006 | #345


Аватара для Sanja Alone

Ищу Человека…


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

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


prokazzza
Цитата:
вставить пароль из c:/install/password.txt
Это неструктурированный текстовый файл или ini-файл? В какой кодировке? В какой строке находится пароль?

Цитата:
подождать пока установится istall.exe
Комментарий архива в студию!

Цитата:
если выйдет надпись "сделать перезагрузку" нажать нет, если не выйдет надпись то ничего не делать
А не проще ли будет указать ключ, отменяющий перезагрузку для данного приложения прямо в строке его запуска после извлечения из архива? (например: Setup=install.exe REBOOT=ReallySuppress /qn). Я надеюсь, что это загадочное приложение использует какой-то стандартный установщик (см. статью Типы инсталляторов).

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)


Отправлено: 01:58, 03-09-2006 | #346


Googler


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

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


Возвращаясь к задаче поиска вхождений заданного слова в произвольный текст. Выше я дал маху утверждая, что AutoIT не поддерживает регулярные выражения... хотя с русским опять облом - если метасимволы \l \u \w еще работают, то (?i) ни в какую...

StringRegExp - Check if a string fits a given regular expression pattern.
StringRegExpReplace - Replace text in a string based on regular expressions.

вариант поиска слова с использованием регулярных выражений (на основе скрипта Sanja Alone):
Код: Выделить весь код
#include <File.au3>

$fileInput = 'file.txt'
$wordToFind= 'исКать'

$find = _FindTextInFile ($fileInput,$wordToFind)
If $find Then
	MsgBox (0, 'Поиск слова в файле',  'Слово "' & $wordToFind & '" найдено в ' & $find & '-й строке.')
Else
	MsgBox (0, 'Поиск слова в файле',  'Слово "' & $wordToFind & '" в файле не обнаружено.')
EndIf

Func _FindTextInFile ($ifile, $word)
	Local $i, $a, $ret=0
	_FileReadToArray($ifile, $a)
	For $i=1 To Ubound ($a)-1
		If StringRegExp ($a [$i], _WordToReg ($word) ) Then
			Return $i
		EndIf
	Next
	Return 0
EndFunc

; перевод произвольного слова в регулярное выражение
; требуется для поддержки русских слов, так как (?i)
; воспринимает только регистры английских букв;
; пример: "Кот" --> "\<[кК][оО][тТ]\>"

Func _WordToReg ($word)
	Local $i, $c, $w=""
	If StringIsASCII($word) Then
		Return '(?i)\<' & $word & '\>'
	Else
		For $i=1 To StringLen($word)
			$c = StringMid ($word, $i, 1)
			If StringLower($c) == StringUpper($c) Then
				$w=$w & $c
			Else
				$w=$w & '[' & StringLower($c) & StringUpper($c) & ']'
			EndIf
		Next
		Return '\<' & $w & '\>'
	EndIf
EndFunc

Отправлено: 11:21, 03-09-2006 | #347


Аватара для Creat0R

Must AutoIt


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

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


Sanja Alone
Снова огромно спасибо за А) и Б)

Цитата:
А где ты В) потерял?
От волнения забыл про него ...

А на счёт Г), я всё же решил немного попариться, и нашёл, я бы сказал, обходное решение...

Вместо того, чтобы копировать файл командами AutoIt'а, я повесил копирование на ком. строку:

Код: Выделить весь код
Run(@ComSpec & " /c copy /y ""c:\File.txt"" ""d:\File.txt""", "", @SW_HIDE)

; Затем заключил в вечную петлю прогресс бар, до тех пор, пока в системе висит процесс “cmd.exe”, т.е это значит, что до тех пор, пока будет делаться копирование...
While 1

	For $i = 5 To 100
	  GUICtrlSetData ($progressbar1, $i)
	  Sleep(1)
	Next
	If Not ProcessExists("cmd.exe") Then ExitLoop
Wend
	GUICtrlSetData ($progressbar1, 0)
Хотя и тут может быть проблема, ведь в этот момент, юзеру может приспичить включить ком. строку для своих целей...
Но и это можно обойти, создав той-же ком. строкой, файл во временной папке %temp%, и по завершению копирования удалять его, а проверку для завершения прогресс бара, делать так:

If Not ProcessExists("cmd.exe") or Not FileExists(@TempDir & "\mark.tmp") Then ExitLoop

Или может есть более надёжный способ, но тогда нужно узнать, возможно ли, и как, проверять когда был запущен процесс (cmd.exe), и если именно этот процесс не существует, тогда выходить с петли. Если кто-то подскажет возможно ли такое, и если да, то как осуществить, то буду очень признателен.
----------------------

У меня есть ещё один вопрос, и тоже в другом направлении -
Нужно взять в переменную, все последние символы идущие после определнного знака у значения другой переменной. Т.е, вот например значение переменной $Var ровняется c:\program files\my programm\test.zip - и нужно чтобы из этой переменной, вернулось такое значение - test.zip - в другую переменную, например в $Var1.
Но заранее, не известно, ни количество слэшей (\) в пути, ни количество символов после последнего слэша. Возможно такое осуществить?
Как я понимаю, тут как-то нужно задействовать одну из вариации команды String, но если честно, то я уже замучался в попытках подобрать подхолящюю для этой цели вариацию, и справка тоже не помогла

Я временно это решил опять-таки ком. строкой :
Код: Выделить весь код
$Var = "c:\program files\my programm\test.zip"

; Беру нужное значение, и вывожу последние его символы после последнего слэша, в файл test.tmp
Run(@ComSpec & " /c for %a in (""" & $Var & "") do echo %~nxa> """ & @ScriptDir & "\test.tmp""")

; Помещаю новое значение (из файла) в переменную $Var1
$Var1 = FileReadLine(@ScriptDir & "\test.tmp", 1)

    MsgBox(0, "", The New Value is: " & $Var1)
FileDelete (@ScriptDir & "\test.tmp")
Но ту проблема в том, что нужно создавать файл, затем удалять его, а в моём случае, таких операции мне приходится делать не раз в моём скрипте, и каждый раз заного создовать файл, а затем удалять его, не лучший вариант... тем более, что скрипт может быть запущен из флешки, а всё время писать на флешку, это её вредит (хотя можно конечно писать файл во времеенный каталог - @TempDir, но всё же не удобно).

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

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

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


Отправлено: 19:50, 03-09-2006 | #348


Аватара для Sanja Alone

Ищу Человека…


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

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


Creat0R
Цитата:
значение переменной $Var ровняется c:\program files\my programm\test.zip - и нужно чтобы из этой переменной, вернулось такое значение - test.zip - в другую переменную, например в $Var1.
Это очень просто:
Код: Выделить весь код
Func PathName($fullpath)
	Local $s=StringInStr($fullpath,'\',0,-1) ;первый слэш с конца
	Local $n=StringMid($fullpath,$s+1)
	Local $p=StringLeft($fullpath,$s-1)
	Dim $pn[2]
	$pn[0]=$p ;путь
	$pn[1]=$n ;имя
	Return $pn
EndFunc

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)


Отправлено: 02:17, 04-09-2006 | #349


Googler


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

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


Creat0R
Цитата:
Нужно взять в переменную, все последние символы идущие после определнного знака у значения другой переменной. Т.е, вот например значение переменной $Var ровняется c:\program files\my programm\test.zip - и нужно чтобы из этой переменной, вернулось такое значение - test.zip - в другую переменную, например в $Var1.
Но заранее, не известно, ни количество слэшей (\) в пути, ни количество символов после последнего слэша. Возможно такое осуществить?
Вот вариант с применением регулярных выражений:
Код: Выделить весь код
$var = 'c:\program files\my programm\test.zip'
$res = StringRegExpReplace ($var, '^.*\\', '')
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:45, 04-09-2006 | #350



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.2] 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.3] AutoIt скрипты biork AutoIt 503 09-06-2007 11:27
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход