Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
Creat0R
Как видно, добавляется в начало span id="BeginvidDesc....">, а иногда и в конце тоже добавляются теги. Реально ли одно-разовым вызовом StringRegExp (и без дополнительных циклов) получить то что нужно? »опять не понял смысл квадратных скобок в твоем выражении, попробуй так:$sSource = FileRead("test.txt")
$avArray = StringRegExp($sSource, '(?i)(?s)<div class="vldesc">\s*(?:<span id="BeginvidDesc[^">]*">)?\s*(.*?)\s*(?:</span>|</div>)', 3)
For $i=0 To UBound($avArray)-1
ConsoleWrite($avArray[$i]&@CRLF)
Next
Maza FakaА поиск во вложенных контейнерах сложная задача? »думаю нужно что-то типа рекурсии, на MSDN есть подробная инструкция с примером: Determining Available Network Resources (http://msdn.microsoft.com/en-us/library/aa922358(printer).aspx). Статья для Windows Mobile, но общий алгоритм одинаков.
amel27, опять не понял смысл квадратных скобок в твоем выражении
:) - Я не знал как указать движку RegExp что я хочу искать в начале либо одно, либо другое, но при этом чтобы то что я ищу не попало в результат.
попробуй так:
Спасибо огромное! Вроде всё отлично отрабатывает, но хотелось бы понять как?! :unsure: Почему то, что в первых круглых скобках не попадает в результат (в строки массива)? И что означает «:?» ?
Ответ на последеий мой вопрос предоставляет объяснение и на первый вопрос :)
(?: ... ) - Non-capturing group. Behaves just like a normal group, but does not record the matching characters in the array nor can the matched text be used for back-referencing.
И как я это мог упустить в справке...
266903582
06-07-2008, 16:19
В windowinfo есть инструмент finder tool: наводим его на объект и получаем информацию о нем. Хочу написать что-то подобное для получения только некоторой необходимой информации и сбрасывать ее в файл, осталось только разобраться как получать инфо об объекте под курсором...
Привет всем. У меня вопрос по autoit. Вопрос вроде легкий, а решить уже 2 дня не могу. И в связи что легкий нигде нет ответа, а по совету из справки у меня получается каламбур. Подскажите знающие. Мне нужен скрипт, который бы проверял дату на компе с моей введенной (например 08/08/2008) и если совпадает, то запуск "моей программы", а если нет то выход. Спасибо. :help
266903582, как получать инфо об объекте под курсором... »
Продвинуты пример (сам делал (http://www.autoitscript.com/forum/index.php?s=&showtopic=60155&view=findpost&p=453580) :) ):
#include <GuiConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>
;
Opt("GuiOnEventMode", 1)
HotKeySet("{ESC}", "QuitApp")
Global $hSquare_GUI = -1
Global $hCtrl = -1
Global $Last_hControl = -1
Global $Frame_Color = 0xFF0000
Global $Frame_Width = 3
$Main_GUI = GUICreate("Highlight Controls Demo")
WinSetOnTop($Main_GUI, "", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "QuitApp")
GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")
GUICtrlCreateButton("Button", 20, 20)
GUICtrlCreateCheckbox("CheckBox", 20, 60)
GUICtrlCreateLabel("Info: ", 20, 150)
GUICtrlSetFont(-1, 9, 800)
$Info_Edit = GUICtrlCreateEdit("", 80, 150, 300, 220, $GUI_SS_DEFAULT_EDIT + $ES_READONLY)
GUISetState()
While 1
Sleep(10) ;So the CPU will not increes "badly" while we play with the mouse cursor :)
_IdleWait()
If _IsPressed(1) Then
GUIDeleteSquare($hSquare_GUI)
While _IsPressed(1)
Sleep(10)
Check_Highlight_Controls_Proc()
WEnd
$Last_hControl = -1
EndIf
Check_Highlight_Controls_Proc()
WEnd
Func Check_Highlight_Controls_Proc()
Local $hCtrl = _ControlGetHovered()
If $hCtrl <> 0 And $Last_hControl <> $hCtrl And $hSquare_GUI <> $hCtrl Then
$Last_hControl = $hCtrl
Local $aCtrlPos = WinGetPos($hCtrl)
GUICtrlSetData($Info_Edit, _
"X = " & $aCtrlPos[0] & @CRLF & _
"Y = " & $aCtrlPos[1] & @CRLF & _
"W = " & $aCtrlPos[2] & @CRLF & _
"H = " & $aCtrlPos[3] & @CRLF & @CRLF & _
"Control/Win Class Name: " & _WinGetClassNameNN($hCtrl) & @CRLF & _
"Control/Win Handle: " & $hCtrl & @CRLF & _
"Control ID: " & _HwndToID($hCtrl) & @CRLF & @CRLF & _
"Control Data:" & @CRLF & ControlGetText($hCtrl, "", ""))
GUIDeleteSquare($hSquare_GUI)
$hSquare_GUI = GUICreateSquare($aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3])
EndIf
EndFunc
Func GUICreateSquare($i_X = -1, $i_Y = -1, $i_W = -1, $i_H = -1)
Local $hSquare_GUI = GUICreate("", $i_W, $i_H, $i_X, $i_Y, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
GUISetBkColor($Frame_Color)
_GUISetHole($hSquare_GUI, $Frame_Width, $Frame_Width, $i_W - ($Frame_Width * 2), $i_H - ($Frame_Width * 2))
GUISetState(@SW_SHOWNOACTIVATE, $hSquare_GUI)
Return $hSquare_GUI
EndFunc
Func GUIDeleteSquare($hSquare_GUI)
If IsHWnd($hSquare_GUI) And $hSquare_GUI <> $Main_GUI Then GUIDelete($hSquare_GUI)
EndFunc
Func _ControlGetHovered()
Local $aRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))
If @error Or Not IsArray($aRet) Then Return SetError(1, 0, 0)
Return HWnd($aRet[0])
EndFunc
Func _HwndToID($hWnd)
If Not IsHWnd($hWnd) Then Return SetError(1, 0, "")
Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hWnd)
If Not IsArray($aRet) Then Return SetError(2, 0, "")
Return $aRet[0]
EndFunc
Func _WinGetClassName($hWnd)
$aClassName = DllCall("user32.dll", "int", "GetClassName", "hWnd", $hWnd, "str", "", "int", 64)
If Not @error And $aClassName[0] <> 0 Then Return $aClassName[2]
Return ""
EndFunc
Func _WinGetClassNameNN($hCtrlWnd)
$hParent = _WinAPI_GetAncestor($hCtrlWnd, $GA_ROOTOWNER)
$hCtrlWnd = ControlGetHandle($hParent, "", $hCtrlWnd)
$sClassList = StringSplit(StringStripCR(_WinGetNumeratedClassList($hParent)), @LF)
For $i = $sClassList[0] To 1 Step -1
If $sClassList[$i] = "" Then ContinueLoop
If ControlGetHandle($hParent, "", $sClassList[$i]) = $hCtrlWnd Then Return $sClassList[$i]
Next
Return _WinGetClassName($hCtrlWnd)
EndFunc
Func _WinGetNumeratedClassList($sTitle, $sText = "")
Local $sClassList = WinGetClassList($sTitle, $sText)
Local $aClassList = StringSplit($sClassList, @CRLF)
Local $sRetClassList = "", $sHold_List = "|"
Local $aiInHold, $iInHold
For $i = 1 To UBound($aClassList) - 1
If $aClassList[$i] = "" Then ContinueLoop
If StringRegExp($sHold_List, "\|" & $aClassList[$i] & "~(\d+)\|") Then
$aiInHold = StringRegExp($sHold_List, ".*\|" & $aClassList[$i] & "~(\d+)\|.*", 1)
$iInHold = Number($aiInHold[UBound($aiInHold) - 1])
If $iInHold = 0 Then $iInHold += 1
$aClassList[$i] &= "~" & $iInHold + 1
$sHold_List &= $aClassList[$i] & "|"
$sRetClassList &= $aClassList[$i] & @CRLF
Else
$aClassList[$i] &= "~1"
$sHold_List &= $aClassList[$i] & "|"
$sRetClassList &= $aClassList[$i] & @CRLF
EndIf
Next
Return StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc
Func _GUISetHole($hWin, $i_X, $i_Y, $i_SizeW, $i_SizeH)
Local $aWinPos, $Outer_Rgn, $Inner_Rgn, $Wh, $Combined_Rgn
Local Const $RGN_DIFF = 4
$aWinPos = WinGetPos($hWin)
$Outer_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", $aWinPos[2], "long", $aWinPos[3])
$Inner_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", $i_Y, "long", $i_Y, "long", $i_Y + $i_SizeW, _
"long", $i_Y + $i_SizeH)
$Combined_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
DllCall("gdi32.dll", "long", "CombineRgn", "long", $Combined_Rgn[0], "long", $Outer_Rgn[0], "long", $Inner_Rgn[0], _
"int", $RGN_DIFF)
DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $hWin, "long", $Combined_Rgn[0], "int", 1)
EndFunc
Func _IdleWait($IdleSec = 0)
Local $iSave, $stLastInput = DllStructCreate("uint;dword")
DllStructSetData($stLastInput, 1, DllStructGetSize($stLastInput))
DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($stLastInput))
Do
$iSave = DllStructGetData($stLastInput, 2)
Sleep(20)
DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($stLastInput))
Until (DllStructGetData($stLastInput, 2) - $iSave) > $IdleSec
Return DllStructGetData($stLastInput, 2) - $iSave
EndFunc
Func WM_WINDOWPOSCHANGED($hWndGUI, $MsgID, $WParam, $LParam)
If $hWndGUI <> $Main_GUI Then Return $GUI_RUNDEFMSG
GUIDeleteSquare($hSquare_GUI)
Check_Highlight_Controls_Proc()
$Last_hControl = -1
EndFunc
Func QuitApp()
Exit
EndFunc
beve, Мне нужен скрипт, который бы проверял дату на компе с моей введенной (например 08/08/2008) и если совпадает, то запуск "моей программы", а если нет то выход. »
Примерно так:
$sSystemDate = @MDAY & "/" & @MON & "/" & @YEAR
If $sSystemDate = "08/08/2008" Then
Run("Моя программа.exe")
Else
Exit
EndIf
:)
Спасибо, Creat0R за ответ. Мой вопрос решен.
266903582
06-07-2008, 23:28
Creat0R, спасибо.
Я тоже без дела не сидел :) небольшой концептик получился, по свободняку расширю его твоим примером:
#include <Misc.au3>
FileDelete("file.txt")
$dll = DllOpen("user32.dll")
$file = FileOpen("file.txt", 1)
$ffi=""
While 1
if _IsPressed("11", $dll) Then ;ctrl ctrltext & classn
wr(ControlGetText("","",ControlGetFocus(""))&@lf&ControlGetFocus(""))
EndIf
if _IsPressed("12", $dll) Then ;alt title & alltext
wr(WinGetTitle("")&@lf&"-------"&@lf&WinGetText(""))
EndIf
if _IsPressed("1b", $dll) Then Exit ;esc
sleep(50)
WEnd
DllClose($dll)
FileClose($file)
Func wr($ff)
if $ffi<>$ff then ;исключаем попадание многократных копий захваченного текста в файл
FileWrite($file,$ff&@LF&"-------"&@lf) ;пишем форматированный текст
$ffi=$ff
ToolTip($ffi)
EndIf
EndFunc
Maza Faka
поиск во вложенных контейнерах сложная задача?
как оказалось можно без рекурсии - нужно только правильно заполнить структуру стартового контейнера
Спасибо за пример »
будешь удивлен, но в штатных функциях AutoIT уже есть API-врапперы: :biggrin:
_WinNet_OpenEnum()
_WinNet_CloseEnum()
_WinNet_EnumResource()
но мне они показались неудобными в применении, посуди сам:
- значения флагов не совпадают со значениями системных констант;
- нет функций по обработке структур NETRESOURCE;
- излишняя (ИМХО) перегруженность функций параметрами ByRef
поэтому, поскольку уже зацепился на днях выложу свой вариант UDF
ALL
может кто еще выскажется по функциям из группы _WinNet_* ?
Maza Faka
08-07-2008, 16:54
amel27
будешь удивлен, но в штатных функциях AutoIT уже есть API-врапперы
Ну надо же! :)
поэтому, поскольку уже зацепился на днях выложу свой вариант UDF
ОК! Ждёмс... ;)
Тут у меня спросили скрипт определения пути, куда установилась программа. У кого нибудь уже есть решение?!
NikLok, скрипт определения пути, куда установилась программа »
Смотря какая программа, вопрос довольно смутный, подробнее можно?
Вот такой вопрос: хочу вставить условие в условие, примерно вот так:
if (MsgBox(4100, "Внимание", "Окно выбора")) = 6 Then
$sSystemDate = @MDAY & "/" & @MON
If $sSystemDate = "08/07" Then
SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
Sleep(1000)
SplashOff()
Exit
Else
EXIT
ENdif
Тоесть если в первом окне ответить ДА, то началось второе условие, а если нет, то выход вобще. Но при моей раскладке требует ENdif, но я же не могу вставить ENdif ибо второе условие выполнятся не будет. Помогите советом.
beve, если в первом окне ответить ДА, то началось второе условие, а если нет, то выход вобще »
Можно проверять не 6, а 7, и тогда просто Exit.
при моей раскладке требует ENdif, но я же не могу вставить ENdif ибо второе условие выполнятся не будет »
Там нехватает ещё одного EndIf в конце, т.к на каждый If .... Then должно быть EndIf (если после Then идёт перевод строки и ещё команды)...
;Первый вариант, всё находится в условии, <если нажата кнопка "Да">.
If MsgBox(4100, "Внимание", "Окно выбора") = 6 Then
$sSystemDate = @MDAY & "/" & @MON
If $sSystemDate = "08/07" Then
SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
Sleep(1000)
SplashOff()
Exit
Else
Exit
EndIf
EndIf
;Второй вариант, выход из скрипта если нажата кнопка "Нет".
If MsgBox(4100, "Внимание", "Окно выбора") = 7 Then Exit
$sSystemDate = @MDAY & "/" & @MON
If $sSystemDate = "08/07" Then
SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
Sleep(1000)
SplashOff()
Exit
Else
Exit
EndIf
amel27,
Не подскажешь ещё такой момент в RegExp...
Мне нужно заменить число в имени файла, тоже на число, на единицу больше, но при этом нужно оставить все остальные значения, т.е я просто решил что на каждый нужный мне кусок с имени файла будет назначена группа, а в параметре Replace она будет Использоваться, и между группами я просто подставляю нужное число, но получается что оно как бы добавляет к значению группы :wacko:
$Num = "2"
$Var = StringRegExpReplace("FileName (1).txt", "(.*)(1)(.*)$", "\1" & $Num & "\3")
ConsoleWrite($Var)
Тут получается что используется не «\1», а «\12» :( - Как можно отменять числа в этом случае?
P.S
Без групп почему то не получается...
Creat0R, Смотря какая программа, вопрос довольно смутный, подробнее можно? »
Да я в общем так и ответил. -
каждая программа хранит свои данные об установке в разных ключах реестра, потому универсальный скрипт вряд ли прокатит! Скорее всего придется знать ветку для каждой программы!
$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\8.0\Installer", "Path")
if @error then
MsgBox(4096, "Program files are in:", "Progarm Adobe not installed")
Else
MsgBox(4096, "Program files are in:", $var)
EndIf
$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\9.0\Installer", "Path")
if @error then
MsgBox(4096, "Program files are in:", "Progarm Adobe not installed")
Else
MsgBox(4096, "Program files are in:", $var)
EndIf
exit
Есть более актуальный вопрос!!! Как определить ставлюсь я на виртуальной машине или на реальной!
Я использую VMWare, и пока думаю делать это проверкой наличия их видеоадаптера с VEN_15AD&DEV_0405
Как обстоят дела под другими виртуалками и каие есть готовые скрипты у кого нибудь.
Связано это с тем, что например программы работающие со SMART таблицами дисков под VMWare ставить пока вроде смысла нет, так как не эмулируются и выдаются всякие нештатные сообщения. (6.0.0 b45731)
поправьте ссылку в шапке
Русская справка »
на http://www.autoitscript.com/autoit3/docs.shtml
Creat0R
Тут получается что используется не «\1», а «\12» »
да, на оффсайте поднимали эту тему неоднократно, но по-моему глухо
могу предложить обходной вариант =)
$Num = "2"
$Var = StringRegExpReplace("FileName (1).txt" &$Num, "(.*)(1)(.*)(\d)$", "\1\4\3")
ConsoleWrite($Var&@CRLF)
amel27, на оффсайте поднимали эту тему неоднократно »
Вот найти бы где....
могу предложить обходной вариант
Хм.. необычный вариант :) - Но имхо, он не очень надёжный, всегда остаётся риск того что на конце имени файла будет добавлена лишняя цифра...
Я ещё так придумал:
$iFind_Num = 1
$iNum = $iFind_Num + 1
$sDelim1 = " ("
$sDelim2 = ")"
$sDelim1_RE = StringRegExpReplace($sDelim1, '([][{}()|.?+*\\^])', '\\\1')
$sDelim2_RE = StringRegExpReplace($sDelim2, '([][{}()|.?+*\\^])', '\\\1')
$Var = StringRegExpReplace("FileName (1).txt", "(.*)" & $sDelim1_RE & $iFind_Num & $sDelim2_RE, "\1" & $sDelim1 & $iNum & $sDelim2)
ConsoleWrite($Var & @CRLF)
:biggrin:
Мне просто известны заранее разделители, а вот цифра которую нужно найти и заменить может всё время меняться, а может и вовсе не существовать (просто FileName.txt).
P.S
Это я доделываю функцию _FileNewNameEx(), чтобы не получилось имён с лишними добавками (типа "FileName (1)(1).txt"). Позже выложу...
Ситуация:
В системе два пользователя, админ и просто юзер.
Есть программа, которая может запускаться только с админскими правами.
Программа в процессе работы должна брать файлы с сетевого диска.
Что я сделал:
Залогинился под админом, сделал автомонтирование сетевого диска. Всё отлично работает, при каждом входе под админом автоподключается сетевой диск.
Скомпилировал скриптик запуска этой проги с правами админа: RunAsWait("Администратор", "org.local", "пароль", 4, "прога с полным путём").
Проблема:
Когда из под юзера запускаю эту прогу, что через скрипт, что через "Запуск от имени администратора" - программа не видит сетевой диск, лезу через Open file, а сетевой диск перечеркнут.
Вопрос:
Так и должно быть, что из под RunAs винда (vista) не автомантирует сетевой диск?
Как можно с помощью скрипта подмонтировать его? И как потом размонтировать, если это необходимо?
Creat0R
Вот найти бы где »я сходу тоже не нашел, но помню что в ответ было молчание...
всегда остаётся риск того что на конце имени файла будет добавлена лишняя цифра »угу, требуется соблюдение формата, значит придется сначала проверять обычным ReExp()
Я ещё так придумал »ну тогда можно еще в два захода - сначала заменить цифру на спецсимвол, не встречающийся в именах файлов (*?), а потом его заменить на нужную подстановку :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.