Спасибо еще раз за то что дал ссылку на такую нужную библиотеку, а то бы я наверное неделю искал потому что с английским плохо дружу)))
» AutoIT
Partner1
Цитата:
Можно запустить скрипт, как сервис, предварительно сконфигурировав действия компьютера при сбое службы. Скажем два сбоя (выгрузка скрипта) - перезапуск службы, третий сбой - перезагрузка компьютера.
Цитата:
Не скажу, что невозможно, но очень нелегко.
Цитата:
можно ли запретить выгрузку скрипта
Можно запустить скрипт, как сервис, предварительно сконфигурировав действия компьютера при сбое службы. Скажем два сбоя (выгрузка скрипта) - перезапуск службы, третий сбой - перезагрузка компьютера.
Цитата:
И вообще скрыть его
Не скажу, что невозможно, но очень нелегко.
Maza_Faka
Цитата:
Нашел на офф. форуме:
http://www.autoitscript.com/forum/index.php?showtopic=80201&hl=service
Но без пол-литра не разобраться
Цитата:
запустить скрипт, как сервиc
Нашел на офф. форуме:
http://www.autoitscript.com/forum/index.php?showtopic=80201&hl=service
Но без пол-литра не разобраться
Partner1
Простой и надёжный способ:
Код:
SC.EXE CREATE
Простой и надёжный способ:
Код:
SC.EXE CREATE
Maza_Faka
Спасибо! Все гениальное просто
Спасибо! Все гениальное просто
Можно ли с помощью for in обработать двумерный массив?
Нужно перечисление только первого измерения, а второе известно и не меняется поэтому указано прямо.
Нужно перечисление только первого измерения, а второе известно и не меняется поэтому указано прямо.
День добрый.
Натолкните на мысль. Есть форма, необходимо:
Запускается форма, на форме есть кнопка. Если небыло нажатия кнопки, то форма ждет 30 сек и закрывается. Жду совета.
Натолкните на мысль. Есть форма, необходимо:
Запускается форма, на форме есть кнопка. Если небыло нажатия кнопки, то форма ждет 30 сек и закрывается. Жду совета.
NORIO 15:34 12-12-2008
Цитата:
А почему именно с For...In? Можно и обычно:
Код: Dim $aArray[4][2] = [["Paul", 1], ["Jim", 2], ["Richard", 3], ["Louis", 4]]
For $i = 0 To UBound($aArray, 1)-1
ConsoleWrite($aArray[$i][0] & ":" & $aArray[$i][1] & @CRLF)
Next
Цитата:
Нужно перечисление только первого измерения
А почему именно с For...In? Можно и обычно:
Код: Dim $aArray[4][2] = [["Paul", 1], ["Jim", 2], ["Richard", 3], ["Louis", 4]]
For $i = 0 To UBound($aArray, 1)-1
ConsoleWrite($aArray[$i][0] & ":" & $aArray[$i][1] & @CRLF)
Next
ViSiToR
Цитата:
Отличная штука! Только при определенных условиях из-за рекурсии глючит. Выдает что для того чтобы не было переполнения буфера из-за рекурсии Автоит закроется.
Можно без рекурсии вариант сделать? Дя меня правка такого кода пока что не совсем тривиальная задача
Цитата:
Функция для получения структуры директории включая подкаталоги
Отличная штука! Только при определенных условиях из-за рекурсии глючит. Выдает что для того чтобы не было переполнения буфера из-за рекурсии Автоит закроется.
Можно без рекурсии вариант сделать? Дя меня правка такого кода пока что не совсем тривиальная задача
timsky 04:03 13-12-2008
Цитата:
С циклами (оно вроде медленнее):
Код: #include <Array.au3>
$aFilesList = _FileListToArrayEx(@SystemDir & "\Config", "*", 1)
_ArrayDisplay($aFilesList)
Func _FileListToArrayEx($sPath, $sMask="*", $iMode=-1) ;$iMode > 0 только папки (маска игнорируется), иначе папки + файлы
If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0)
Local $aPathesArr[1000000] = [1, $sPath]
Local $hSearch, $sFindNext, $sFilePath, $iPathIsFolder, $i = 0
Local $sRegExpFilter = StringReplace(StringReplace($sMask, ".", "\."), "*", ".*")
While $i < $aPathesArr[0]
$i += 1
$hSearch = FileFindFirstFile($aPathesArr[$i] & "\*")
If $hSearch = -1 Then ContinueLoop
While 1
$sFindNext = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sFilePath = $aPathesArr[$i] & "\" & $sFindNext
$iPathIsFolder = StringInStr(FileGetAttrib($sFilePath & "\"), "D")
If $iMode <= 0 Or ($iMode > 0 And $iPathIsFolder) Then
If $iPathIsFolder Or (Not $iPathIsFolder And StringRegExp($sFindNext, "(?i)" & $sRegExpFilter)) Then
$aPathesArr[0] += 1
$aPathesArr[$aPathesArr[0]] = $sFilePath
EndIf
EndIf
WEnd
FileClose($hSearch)
Wend
ReDim $aPathesArr[$aPathesArr[0]+1]
Return $aPathesArr
EndFunc
Цитата:
Можно без рекурсии вариант сделать?
С циклами (оно вроде медленнее):
Код: #include <Array.au3>
$aFilesList = _FileListToArrayEx(@SystemDir & "\Config", "*", 1)
_ArrayDisplay($aFilesList)
Func _FileListToArrayEx($sPath, $sMask="*", $iMode=-1) ;$iMode > 0 только папки (маска игнорируется), иначе папки + файлы
If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0)
Local $aPathesArr[1000000] = [1, $sPath]
Local $hSearch, $sFindNext, $sFilePath, $iPathIsFolder, $i = 0
Local $sRegExpFilter = StringReplace(StringReplace($sMask, ".", "\."), "*", ".*")
While $i < $aPathesArr[0]
$i += 1
$hSearch = FileFindFirstFile($aPathesArr[$i] & "\*")
If $hSearch = -1 Then ContinueLoop
While 1
$sFindNext = FileFindNextFile($hSearch)
If @error Then ExitLoop
$sFilePath = $aPathesArr[$i] & "\" & $sFindNext
$iPathIsFolder = StringInStr(FileGetAttrib($sFilePath & "\"), "D")
If $iMode <= 0 Or ($iMode > 0 And $iPathIsFolder) Then
If $iPathIsFolder Or (Not $iPathIsFolder And StringRegExp($sFindNext, "(?i)" & $sRegExpFilter)) Then
$aPathesArr[0] += 1
$aPathesArr[$aPathesArr[0]] = $sFilePath
EndIf
EndIf
WEnd
FileClose($hSearch)
Wend
ReDim $aPathesArr[$aPathesArr[0]+1]
Return $aPathesArr
EndFunc
ViSiToR
Спасибо большое
У меня эта ф-я глючила после того, как я по скрипту проходился своим "дебагером". Тот самый, который предназначен для отлова ошибок в откомпиленых скриптах... который в TraySetToolTip пишет номер строки, которая начала исполняться.
Я и не наделся на столь скорый ответ, поэтому доработал его. Теперь можно выделить кусок кода, который не нужно "ТулТипить" специально для подобных случаев строками ;NO DEBUG START и ;NO DEBUG END:
Код: #include <Constants.au3>
AutoItSetOption('TrayAutoPause', 0)
AutoItSetOption('TrayOnEventMode', 1)
AutoItSetOption('TrayIconDebug', 1)
TrayItemSetText($TRAY_ITEM_PAUSE, 'Pause')
TrayItemSetText($TRAY_ITEM_EXIT, 'Exit')
If $CmdLineRaw = '' Then
$file = FileOpenDialog('Select file to write debug info', @WorkingDir & '\', 'AutoIt script (*.au3)', 1)
If @error Then
MsgBox(16, 'No file chosen...', 'Program will now close.')
Exit
EndIf
Else
$file = StringReplace($CmdLineRaw, '"', '')
EndIf
$read = FileOpen($file, 0)
$name = StringReplace($file, '.au3', '') & '-Debug.au3'
If FileExists($name) Then FileDelete($name)
$new = FileOpen($name, 1)
;$line = ''
$i = 1
While 1
$line = FileReadLine($read, $i)
If @error = -1 Then ExitLoop
If StringInStr($line, ';NO DEBUG START') Then
FileWriteLine($new, 'TraySetToolTip("Line: ' & $i & '")')
FileWriteLine($new, $line)
$i = $i + 1
While 1
$line = FileReadLine($read, $i)
If StringInStr($line, ';NO DEBUG END') Then
FileWriteLine($new, 'TraySetToolTip("Line: ' & $i & '")')
FileWriteLine($new, $line)
$i = $i + 1
ExitLoop
EndIf
FileWriteLine($new, $line)
$i = $i + 1
WEnd
EndIf
If Not StringInStr($line, ';NO DEBUG END') Then
FileWriteLine($new, 'TraySetToolTip("Line: ' & $i & '")')
FileWriteLine($new, $line)
$i = $i + 1
EndIf
WEnd
FileClose($read)
FileClose($new)
Спасибо большое
У меня эта ф-я глючила после того, как я по скрипту проходился своим "дебагером". Тот самый, который предназначен для отлова ошибок в откомпиленых скриптах... который в TraySetToolTip пишет номер строки, которая начала исполняться.
Я и не наделся на столь скорый ответ, поэтому доработал его. Теперь можно выделить кусок кода, который не нужно "ТулТипить" специально для подобных случаев строками ;NO DEBUG START и ;NO DEBUG END:
Код: #include <Constants.au3>
AutoItSetOption('TrayAutoPause', 0)
AutoItSetOption('TrayOnEventMode', 1)
AutoItSetOption('TrayIconDebug', 1)
TrayItemSetText($TRAY_ITEM_PAUSE, 'Pause')
TrayItemSetText($TRAY_ITEM_EXIT, 'Exit')
If $CmdLineRaw = '' Then
$file = FileOpenDialog('Select file to write debug info', @WorkingDir & '\', 'AutoIt script (*.au3)', 1)
If @error Then
MsgBox(16, 'No file chosen...', 'Program will now close.')
Exit
EndIf
Else
$file = StringReplace($CmdLineRaw, '"', '')
EndIf
$read = FileOpen($file, 0)
$name = StringReplace($file, '.au3', '') & '-Debug.au3'
If FileExists($name) Then FileDelete($name)
$new = FileOpen($name, 1)
;$line = ''
$i = 1
While 1
$line = FileReadLine($read, $i)
If @error = -1 Then ExitLoop
If StringInStr($line, ';NO DEBUG START') Then
FileWriteLine($new, 'TraySetToolTip("Line: ' & $i & '")')
FileWriteLine($new, $line)
$i = $i + 1
While 1
$line = FileReadLine($read, $i)
If StringInStr($line, ';NO DEBUG END') Then
FileWriteLine($new, 'TraySetToolTip("Line: ' & $i & '")')
FileWriteLine($new, $line)
$i = $i + 1
ExitLoop
EndIf
FileWriteLine($new, $line)
$i = $i + 1
WEnd
EndIf
If Not StringInStr($line, ';NO DEBUG END') Then
FileWriteLine($new, 'TraySetToolTip("Line: ' & $i & '")')
FileWriteLine($new, $line)
$i = $i + 1
EndIf
WEnd
FileClose($read)
FileClose($new)
timsky 01:02 14-12-2008
Цитата:
Я если честно не вижу как там ошибки отлавливаются. Только вывод текущей строки обработки?
Скрипт можно ускорить, например открыть файл и читать через Handle, а запись делать позже, с массива. Сорри не присмотрелся, оно в принципе почти так и делается.
Добавлено:
Не совсем верно оно добавляет нумирацию строк, например на такой тестовый скрипт:
Код: HotKeySet("^{e}", "test")
HotKeySet("^{q}", "quit")
While 1
Sleep(1000)
WEnd
Func test()
ToolTip("test")
Sleep(3000)
ToolTip("")
EndFunc
Func quit()
Exit
EndFunc
Цитата:
Незаменимая вещь при отлове ошибок скомпиленых скриптов
Я если честно не вижу как там ошибки отлавливаются. Только вывод текущей строки обработки?
Скрипт можно ускорить, например открыть файл и читать через Handle, а запись делать позже, с массива. Сорри не присмотрелся, оно в принципе почти так и делается.
Добавлено:
Не совсем верно оно добавляет нумирацию строк, например на такой тестовый скрипт:
Код: HotKeySet("^{e}", "test")
HotKeySet("^{q}", "quit")
While 1
Sleep(1000)
WEnd
Func test()
ToolTip("test")
Sleep(3000)
ToolTip("")
EndFunc
Func quit()
Exit
EndFunc
Цитата:
Я если честно не вижу как там ошибки отлавливаются. Только вывод текущей строки обработки?
Ну да, это я просто так выразился
Зато хотя бы знаешь, в каком месте затык произошел, т.к. строка -1 в этом деле точно не подсказка
Цитата:
В цикле выдаёт «Line: 5» и «Line: 6» (после Sleep), хотя это строки 9 и 10.
Щас проверю глюк.
Добавлено:
Ну все же правильно.
Это в коде так выглядит, а если скрипт запустить, то всегда отображается Line: 5, т.к. WEnd отрабатыватся мгновенно. Мне Line: 6 так и не удалось поймать.
Целью является не сколько отображение текущей позиции, сколько определение, на какой строке скрипт выдал ошибку, а здесь уже все будет четко видно. Произошла ошибка - читаем инфу о ней, смотрим Тип в трее и видим строку, где косяк порылся.
Проверено временем
А то, что
Цитата:
В цикле выдаёт «Line: 5» и «Line: 6» (после Sleep), хотя это строки 9 и 10., то это тоже так и должно быть. Править ведь "дебагнутый" скрипт жопа, да и зачем?
Я делаю так: прохожусь этим "дебагером", компилю и скрипт в этом виде работает, а ошибки правлю в исходном скрипте без ТрейТипов.
Поэтому я и сделал поддержку параметров ком. строки. Я его в Send To засунул и скармливаю легко и непринужденно ему любой скрипт перед компиляцией.
timsky
Цитата:
Хмм... неплохая идея, но скрипт нужно немного переделать, например функция FileReadLine в разы замедляет работу скрипта, впрочем, как и функция FileWriteLine, потому, как постоянно читают файл с первой строки, соответсвенно при отладке большого кода получим тормоза
Я бы посоветовал сразу "прочитать" файл в переменную и создать массив со строками, а затем обрабатывать каждый элемент массива.
Цитата:
Незаменимая вещь при отлове ошибок скомпиленых скриптов
Хмм... неплохая идея, но скрипт нужно немного переделать, например функция FileReadLine в разы замедляет работу скрипта, впрочем, как и функция FileWriteLine, потому, как постоянно читают файл с первой строки, соответсвенно при отладке большого кода получим тормоза
Я бы посоветовал сразу "прочитать" файл в переменную и создать массив со строками, а затем обрабатывать каждый элемент массива.
ViSiToR
Цитата:
Цитата:
А почему именно с For...In? Можно и обычно:
Цитата: Код:Dim $aArray[4][2] = [["Paul", 1], ["Jim", 2], ["Richard", 3], ["Louis", 4]]
For $i = 0 To UBound($aArray, 1)-1
ConsoleWrite($aArray[$i][0] & ":" & $aArray[$i][1] & @CRLF)
Next
Maza_Faka
Цитата:
Т.е. для чтения строки 10, скрипт сперва читает строки 1-9?
Все мои скрипты отрабатываются мгновенно, поэтому тормозов никогда не замечал, но сейчас попробовал на UDF в 6860 строк - действительно долго.
Позже поправлю, сейчас не до этого... даже в воскресение
Цитата:
потому, как постоянно читают файл с первой строки
Т.е. для чтения строки 10, скрипт сперва читает строки 1-9?
Все мои скрипты отрабатываются мгновенно, поэтому тормозов никогда не замечал, но сейчас попробовал на UDF в 6860 строк - действительно долго.
Позже поправлю, сейчас не до этого... даже в воскресение
timsky 03:44 14-12-2008
Цитата:
Я так понял это задумывалось как действующая строка, а не строка в скрипте? Т.е строка с кодом не считая пустых строк
Цитата:
Но если произошла ошибка, скрипт ведь вылетает, и в трее уже ничего не будет, или о какой конкретно ошибке идёт речь? Мне лично, кроме отлова критических ошибок (крах скрипта) отлавливать нечего
Цитата:
если скрипт запустить, то всегда отображается Line: 5
Я так понял это задумывалось как действующая строка, а не строка в скрипте? Т.е строка с кодом не считая пустых строк
Цитата:
Произошла ошибка - читаем инфу о ней, смотрим Тип в трее и видим строку, где косяк порылся
Но если произошла ошибка, скрипт ведь вылетает, и в трее уже ничего не будет, или о какой конкретно ошибке идёт речь? Мне лично, кроме отлова критических ошибок (крах скрипта) отлавливать нечего
#include <Constants.au3>
#include <Array.au3>
$ipconfig_all = Run(@ComSpec & " /k ipconfig /all", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
$sStdOut = ""
$sStdErr = ""
While 1
$sStdOut &= StdoutRead($ipconfig_all)
If @error Then ExitLoop
WEnd
While 1
$sStdErr &= StderrRead($ipconfig_all)
If @error Then ExitLoop
WEnd
$sStdOut = StringReplace($sStdOut, @CRLF, "")
$sStdOut = StringReplace($sStdOut, @CR & @CR, @CR)
$aString = StringSplit($sStdOut, @CR)
;_ArrayDisplay($aString)
RunWait("blat $aString -server xxx -port xxx -to xxx -f xxx -subject xxx -u xxx -pw xxx", "" , @SW_SHOW)
kak pravelino otpraviti masiv na po4tu ??? ( -dinamic IP)
#include <Array.au3>
$ipconfig_all = Run(@ComSpec & " /k ipconfig /all", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
$sStdOut = ""
$sStdErr = ""
While 1
$sStdOut &= StdoutRead($ipconfig_all)
If @error Then ExitLoop
WEnd
While 1
$sStdErr &= StderrRead($ipconfig_all)
If @error Then ExitLoop
WEnd
$sStdOut = StringReplace($sStdOut, @CRLF, "")
$sStdOut = StringReplace($sStdOut, @CR & @CR, @CR)
$aString = StringSplit($sStdOut, @CR)
;_ArrayDisplay($aString)
RunWait("blat $aString -server xxx -port xxx -to xxx -f xxx -subject xxx -u xxx -pw xxx", "" , @SW_SHOW)
kak pravelino otpraviti masiv na po4tu ??? ( -dinamic IP)
Вобщем вот моя версия на этот отладчик:
Код: #include <Constants.au3>
Opt('TrayAutoPause', 0)
Opt('TrayOnEventMode', 1)
Opt('TrayIconDebug', 1)
TrayItemSetText($TRAY_ITEM_PAUSE, 'Pause')
TrayItemSetText($TRAY_ITEM_EXIT, 'Exit')
If $CmdLine[0] = 0 Then
$sIniDir = ""
While 1
$sScript_File = FileOpenDialog('Select file to write debug info', $sIniDir, 'AutoIt script (*.au3)', 1)
If @error Then
MsgBox(16, 'Attention', 'No file chosen... Program will now close.')
Exit
EndIf
If StringRight($sScript_File, 4) = ".au3" Then ExitLoop
MsgBox(48, 'Wrong file chosen...', 'Please select AutoIt v3 Script File.')
$sIniDir = @WorkingDir
WEnd
Else
$sScript_File = StringRegExpReplace($CmdLineRaw, '\A"+|"+\z', '')
EndIf
$sDebugScript_File = StringTrimRight($sScript_File, 4) & '-Debug.au3'
$aRead_Script = StringSplit(StringStripCR(FileRead($sScript_File)), @LF)
$sDebugScript_Content = ""
For $i = 1 To $aRead_Script[0]
$sCurrent_Line = $aRead_Script[$i]
$sDebugScript_Content &= 'TraySetToolTip("Line: ' & $i & '")' & @CRLF & $sCurrent_Line & @CRLF
If $sCurrent_Line = ';NO DEBUG START' Then
For $j = $i+1 To $aRead_Script[0]
$i = $j
$sCurrent_Line = $aRead_Script[$j]
$sDebugScript_Content &= $sCurrent_Line & @CRLF
If $sCurrent_Line = ';NO DEBUG END' Then ExitLoop
Next
EndIf
Next
$hOp_DebugScrpt = FileOpen($sDebugScript_File, 2)
FileWrite($hOp_DebugScrpt, $sDebugScript_Content)
FileClose($hOp_DebugScrpt)
If $CmdLine[0] = 0 Then _
MsgBox(64, 'Done!', _
StringFormat('Debug parsing process completed seccesefully, new "-Debug" file created:\n\n[%s]', $sDebugScript_File))
Код: #include <Constants.au3>
Opt('TrayAutoPause', 0)
Opt('TrayOnEventMode', 1)
Opt('TrayIconDebug', 1)
TrayItemSetText($TRAY_ITEM_PAUSE, 'Pause')
TrayItemSetText($TRAY_ITEM_EXIT, 'Exit')
If $CmdLine[0] = 0 Then
$sIniDir = ""
While 1
$sScript_File = FileOpenDialog('Select file to write debug info', $sIniDir, 'AutoIt script (*.au3)', 1)
If @error Then
MsgBox(16, 'Attention', 'No file chosen... Program will now close.')
Exit
EndIf
If StringRight($sScript_File, 4) = ".au3" Then ExitLoop
MsgBox(48, 'Wrong file chosen...', 'Please select AutoIt v3 Script File.')
$sIniDir = @WorkingDir
WEnd
Else
$sScript_File = StringRegExpReplace($CmdLineRaw, '\A"+|"+\z', '')
EndIf
$sDebugScript_File = StringTrimRight($sScript_File, 4) & '-Debug.au3'
$aRead_Script = StringSplit(StringStripCR(FileRead($sScript_File)), @LF)
$sDebugScript_Content = ""
For $i = 1 To $aRead_Script[0]
$sCurrent_Line = $aRead_Script[$i]
$sDebugScript_Content &= 'TraySetToolTip("Line: ' & $i & '")' & @CRLF & $sCurrent_Line & @CRLF
If $sCurrent_Line = ';NO DEBUG START' Then
For $j = $i+1 To $aRead_Script[0]
$i = $j
$sCurrent_Line = $aRead_Script[$j]
$sDebugScript_Content &= $sCurrent_Line & @CRLF
If $sCurrent_Line = ';NO DEBUG END' Then ExitLoop
Next
EndIf
Next
$hOp_DebugScrpt = FileOpen($sDebugScript_File, 2)
FileWrite($hOp_DebugScrpt, $sDebugScript_Content)
FileClose($hOp_DebugScrpt)
If $CmdLine[0] = 0 Then _
MsgBox(64, 'Done!', _
StringFormat('Debug parsing process completed seccesefully, new "-Debug" file created:\n\n[%s]', $sDebugScript_File))
ViSiToR
Цитата:
У меня скрипт никогда не вылетал полностью. Появляеся сообщение об ошибке (типа как в твоем примере для AutoItErrorHandler), соотв. в трее значок висит и при наведении на него получаем номер строки, которая начала исполняться, на которой и произошел сбой.
Твой вариант, в принципе, то же самое вроде, только реализовано то, о чем говорил Maza_Faka? За исключением косметических и мелких функциональных изменений, так?
Цитата:
Но если произошла ошибка, скрипт ведь вылетает, и в трее уже ничего не будет, или о какой конкретно ошибке идёт речь?
У меня скрипт никогда не вылетал полностью. Появляеся сообщение об ошибке (типа как в твоем примере для AutoItErrorHandler), соотв. в трее значок висит и при наведении на него получаем номер строки, которая начала исполняться, на которой и произошел сбой.
Твой вариант, в принципе, то же самое вроде, только реализовано то, о чем говорил Maza_Faka? За исключением косметических и мелких функциональных изменений, так?
timsky 16:55 14-12-2008
Цитата:
Ну тогда да, я как то забыл про это, скрипт ведь ещё как бы работает (пока не закрыть это сообщение ).
Вот ещё одна, более продвинутая версия этого отладчика:
Код: #include <Constants.au3>
Opt('TrayAutoPause', 0)
Opt('TrayOnEventMode', 1)
Opt('TrayIconDebug', 1)
TrayItemSetText($TRAY_ITEM_PAUSE, 'Pause')
TrayItemSetText($TRAY_ITEM_EXIT, 'Exit')
If $CmdLine[0] = 0 Then
$sIniDir = ""
While 1
$sScript_File = FileOpenDialog('Select file to write debug info', $sIniDir, 'AutoIt script (*.au3)', 1)
If @error Then
MsgBox(16, 'Attention', 'No file chosen... Program will now close.')
Exit
EndIf
If StringRight($sScript_File, 4) = ".au3" Then ExitLoop
MsgBox(48, 'Wrong file chosen...', 'Please select AutoIt v3 Script File.')
$sIniDir = @WorkingDir
WEnd
Else
$sScript_File = StringRegExpReplace($CmdLineRaw, '\A"+|"+\z', '')
EndIf
$sDebugScript_File = _Add_Script_Debugger_Proc($sScript_File)
If $CmdLine[0] = 0 Then _
MsgBox(64, 'Done!', _
StringFormat('Debug parsing process completed seccesefully, new "-Debug" file created:\n\n[%s]', $sDebugScript_File))
Func _Add_Script_Debugger_Proc($sScript_File)
Local $sDebugScript_File = StringTrimRight($sScript_File, 4) & '-Debug.au3'
Local $aRead_Script = StringSplit(StringStripCR(FileRead($sScript_File)), @LF)
Local $sCurrent_Line
Local $sDebugScript_Content = _
'Global $iDebug_Timer = TimerInit()' & @CRLF & _
'Global $Debug_EditContent = ""' & @CRLF & _
'Global $hDebug_GUI = GUICreate("AutoIt v3 Script Debugger", @DesktopWidth-5, 100, 0, 0, -1, 128)' & @CRLF & _
'Global $Debug_EditCtrl = GUICtrlCreateEdit("", 0, 0, @DesktopWidth-5, 100, 3152064)' & @CRLF & _
'GUICtrlSetBkColor(-1, 0xFFFFFF)' & @CRLF & _
'DllCall("User32.dll", "int", "SendMessage", "hwnd", GUICtrlGetHandle(-1), _' & @CRLF & _
' "int", 197, "wparam", 1058000, "lparam", 0)' & @CRLF & _
'GUISetState()' & @CRLF & _
'WinSetOnTop($hDebug_GUI, "", 1)' & @CRLF & _
'Opt("SendKeyDelay", 1)' & @CRLF & @CRLF
For $i = 1 To $aRead_Script[0]
$sCurrent_Line = $aRead_Script[$i]
If StringStripWS($sCurrent_Line, 8) = '' Then
$sDebugScript_Content &= @CRLF
ContinueLoop
EndIf
If Not StringRegExp($sCurrent_Line, "(\A\s+|\A);") And _
($i = 1 Or ($i > 1 And Not StringRegExp($aRead_Script[$i-1], "(_\s+|_)\z"))) Then
$sDebugScript_Content &= _
'_SetDebugData_Proc(' & $i & ', ''' & _
StringRegExpReplace(StringReplace($sCurrent_Line, "'", "''"), '\A\t+', '') & ''' & @CRLF)' & @CRLF & _
$sCurrent_Line & @CRLF
Else
$sDebugScript_Content &= $sCurrent_Line & @CRLF
EndIf
If StringRegExp($sCurrent_Line, '(?i)(\A\s+|\A);NO DEBUG START(\s+$|$)') Then
For $j = $i+1 To $aRead_Script[0]
$i = $j
$sCurrent_Line = $aRead_Script[$j]
$sDebugScript_Content &= $sCurrent_Line & @CRLF
If StringRegExp($sCurrent_Line, '(?i)(\A\s+|\A);NO DEBUG END(\s+$|$)') Then ExitLoop
Next
EndIf
Next
$sDebugScript_Content &= @CRLF & @CRLF & _
'Func _SetDebugData_Proc($iLine, $sData)' & @CRLF & _
' TraySetToolTip("Line: " & $iLine)' & @CRLF & _
' $sData = "Line(#" & $iLine & ", Timer[" & Round(TimerDiff($iDebug_Timer), 2) & "]):" & @TAB & @TAB & $sData' & @CRLF & _
' ControlSend($hDebug_GUI, "", $Debug_EditCtrl, "^{END}")' & @CRLF & _
' GUICtrlSetData($Debug_EditCtrl, $sData, 1)' & @CRLF & _
' $Debug_EditContent &= $sData' & @CRLF & _
'EndFunc' & @CRLF & @CRLF & _
'Func OnAutoItExit()' & @CRLF & _
' $iAsk = MsgBox(262144+36, "Debugging system - Attention", _' & @CRLF & _
' "Would you like to save debugging log to the file?")' & @CRLF & @CRLF & _
' If $iAsk = 6 Then' & @CRLF & _
' $Debug_EditContent = _' & @CRLF & _
' @CRLF & @CRLF & "===== AutoIt v3 Debuggin Session Start at: " & _' & @CRLF & _
' @MDAY &"/"& @MON &"/"& @YEAR & ", " & @HOUR &":"& @MIN &":"& @SEC & " =====" & @CRLF & @CRLF & _' & @CRLF & _
' $Debug_EditContent' & @CRLF & @CRLF & _
' FileWrite(@ScriptFullPath & ".log", _' & @CRLF & _
' $Debug_EditContent)' & @CRLF & @CRLF & _
' MsgBox(262144+64, "Debugging system - Saved", _' & @CRLF & _
' "Log Saved as:" & @CRLF & _' & @CRLF & _
' "[" & @ScriptFullPath & ".log]")' & @CRLF & _
' EndIf' & @CRLF & _
'EndFunc' & @CRLF
Local $hOp_DebugScrpt = FileOpen($sDebugScript_File, 2)
FileWrite($hOp_DebugScrpt, $sDebugScript_Content)
FileClose($hOp_DebugScrpt)
Return $sDebugScript_File
EndFunc
Цитата:
Появляеся сообщение об ошибке
Ну тогда да, я как то забыл про это, скрипт ведь ещё как бы работает (пока не закрыть это сообщение ).
Вот ещё одна, более продвинутая версия этого отладчика:
Код: #include <Constants.au3>
Opt('TrayAutoPause', 0)
Opt('TrayOnEventMode', 1)
Opt('TrayIconDebug', 1)
TrayItemSetText($TRAY_ITEM_PAUSE, 'Pause')
TrayItemSetText($TRAY_ITEM_EXIT, 'Exit')
If $CmdLine[0] = 0 Then
$sIniDir = ""
While 1
$sScript_File = FileOpenDialog('Select file to write debug info', $sIniDir, 'AutoIt script (*.au3)', 1)
If @error Then
MsgBox(16, 'Attention', 'No file chosen... Program will now close.')
Exit
EndIf
If StringRight($sScript_File, 4) = ".au3" Then ExitLoop
MsgBox(48, 'Wrong file chosen...', 'Please select AutoIt v3 Script File.')
$sIniDir = @WorkingDir
WEnd
Else
$sScript_File = StringRegExpReplace($CmdLineRaw, '\A"+|"+\z', '')
EndIf
$sDebugScript_File = _Add_Script_Debugger_Proc($sScript_File)
If $CmdLine[0] = 0 Then _
MsgBox(64, 'Done!', _
StringFormat('Debug parsing process completed seccesefully, new "-Debug" file created:\n\n[%s]', $sDebugScript_File))
Func _Add_Script_Debugger_Proc($sScript_File)
Local $sDebugScript_File = StringTrimRight($sScript_File, 4) & '-Debug.au3'
Local $aRead_Script = StringSplit(StringStripCR(FileRead($sScript_File)), @LF)
Local $sCurrent_Line
Local $sDebugScript_Content = _
'Global $iDebug_Timer = TimerInit()' & @CRLF & _
'Global $Debug_EditContent = ""' & @CRLF & _
'Global $hDebug_GUI = GUICreate("AutoIt v3 Script Debugger", @DesktopWidth-5, 100, 0, 0, -1, 128)' & @CRLF & _
'Global $Debug_EditCtrl = GUICtrlCreateEdit("", 0, 0, @DesktopWidth-5, 100, 3152064)' & @CRLF & _
'GUICtrlSetBkColor(-1, 0xFFFFFF)' & @CRLF & _
'DllCall("User32.dll", "int", "SendMessage", "hwnd", GUICtrlGetHandle(-1), _' & @CRLF & _
' "int", 197, "wparam", 1058000, "lparam", 0)' & @CRLF & _
'GUISetState()' & @CRLF & _
'WinSetOnTop($hDebug_GUI, "", 1)' & @CRLF & _
'Opt("SendKeyDelay", 1)' & @CRLF & @CRLF
For $i = 1 To $aRead_Script[0]
$sCurrent_Line = $aRead_Script[$i]
If StringStripWS($sCurrent_Line, 8) = '' Then
$sDebugScript_Content &= @CRLF
ContinueLoop
EndIf
If Not StringRegExp($sCurrent_Line, "(\A\s+|\A);") And _
($i = 1 Or ($i > 1 And Not StringRegExp($aRead_Script[$i-1], "(_\s+|_)\z"))) Then
$sDebugScript_Content &= _
'_SetDebugData_Proc(' & $i & ', ''' & _
StringRegExpReplace(StringReplace($sCurrent_Line, "'", "''"), '\A\t+', '') & ''' & @CRLF)' & @CRLF & _
$sCurrent_Line & @CRLF
Else
$sDebugScript_Content &= $sCurrent_Line & @CRLF
EndIf
If StringRegExp($sCurrent_Line, '(?i)(\A\s+|\A);NO DEBUG START(\s+$|$)') Then
For $j = $i+1 To $aRead_Script[0]
$i = $j
$sCurrent_Line = $aRead_Script[$j]
$sDebugScript_Content &= $sCurrent_Line & @CRLF
If StringRegExp($sCurrent_Line, '(?i)(\A\s+|\A);NO DEBUG END(\s+$|$)') Then ExitLoop
Next
EndIf
Next
$sDebugScript_Content &= @CRLF & @CRLF & _
'Func _SetDebugData_Proc($iLine, $sData)' & @CRLF & _
' TraySetToolTip("Line: " & $iLine)' & @CRLF & _
' $sData = "Line(#" & $iLine & ", Timer[" & Round(TimerDiff($iDebug_Timer), 2) & "]):" & @TAB & @TAB & $sData' & @CRLF & _
' ControlSend($hDebug_GUI, "", $Debug_EditCtrl, "^{END}")' & @CRLF & _
' GUICtrlSetData($Debug_EditCtrl, $sData, 1)' & @CRLF & _
' $Debug_EditContent &= $sData' & @CRLF & _
'EndFunc' & @CRLF & @CRLF & _
'Func OnAutoItExit()' & @CRLF & _
' $iAsk = MsgBox(262144+36, "Debugging system - Attention", _' & @CRLF & _
' "Would you like to save debugging log to the file?")' & @CRLF & @CRLF & _
' If $iAsk = 6 Then' & @CRLF & _
' $Debug_EditContent = _' & @CRLF & _
' @CRLF & @CRLF & "===== AutoIt v3 Debuggin Session Start at: " & _' & @CRLF & _
' @MDAY &"/"& @MON &"/"& @YEAR & ", " & @HOUR &":"& @MIN &":"& @SEC & " =====" & @CRLF & @CRLF & _' & @CRLF & _
' $Debug_EditContent' & @CRLF & @CRLF & _
' FileWrite(@ScriptFullPath & ".log", _' & @CRLF & _
' $Debug_EditContent)' & @CRLF & @CRLF & _
' MsgBox(262144+64, "Debugging system - Saved", _' & @CRLF & _
' "Log Saved as:" & @CRLF & _' & @CRLF & _
' "[" & @ScriptFullPath & ".log]")' & @CRLF & _
' EndIf' & @CRLF & _
'EndFunc' & @CRLF
Local $hOp_DebugScrpt = FileOpen($sDebugScript_File, 2)
FileWrite($hOp_DebugScrpt, $sDebugScript_Content)
FileClose($hOp_DebugScrpt)
Return $sDebugScript_File
EndFunc
ViSiToR
Весчъ
Для углубленного анализа самое то!
Весчъ
Для углубленного анализа самое то!
Уточните пожалуйста, а то я чего-то не вник в тему с отладкой - этот код надо в скрипт дописать, или параллельно запускать? Просто у меня как раз одна программа периодически падает, и я никак не могу разобраться, почему.
Hackproof
Ты запусти этот "отладчик" и обработай им свой скрипт. Обработанный и запускай - дальше разберешься
Ты запусти этот "отладчик" и обработай им свой скрипт. Обработанный и запускай - дальше разберешься
скрипт, который работает (брал отсюда, запускающий окно "о программе" с исчезновением текста) прошел этим отладчиком и он теперь не работает
в смысле, отдебаженый...
позже принтскрин прикреплю
в смысле, отдебаженый...
позже принтскрин прикреплю
CrazyNNM
Вот для этого я и присобачил к скрипту ;NO DEBUG START и ;NO DEBUG END
Вот для этого я и присобачил к скрипту ;NO DEBUG START и ;NO DEBUG END
CrazyNNM 21:43 14-12-2008
Цитата:
Да, есть куски куда где межстрочно вставлять ничего нельзя, тут ничего не поделать, как указал timsky, используем “директивы” ;NO DEBUG START....;NO DEBUG END .
Добавлено:
timsky и Все
Этот отладчик не подходит для отладки больших скриптов, слишком много факторов. Самый главный, это воздействие на работу обрабатываемого скрипта, в некоторых случаях замедляется вызов функции (из за добавленных строчек), когда изначально это не задумывалось.
Немного переделал пример, добавил проверку на переходящие строки (через _), теперь строки комментариев не отлаживаются (зачем?), Edit-поле теперь «только для чтения», также немного увеличено ограничение на число вводимых символов (по умолчанию не так уж и много помещается ), ну и ещё пару улучшении.
Цитата:
прошел этим отладчиком и он теперь не работает
Да, есть куски куда где межстрочно вставлять ничего нельзя, тут ничего не поделать, как указал timsky, используем “директивы” ;NO DEBUG START....;NO DEBUG END .
Добавлено:
timsky и Все
Этот отладчик не подходит для отладки больших скриптов, слишком много факторов. Самый главный, это воздействие на работу обрабатываемого скрипта, в некоторых случаях замедляется вызов функции (из за добавленных строчек), когда изначально это не задумывалось.
Немного переделал пример, добавил проверку на переходящие строки (через _), теперь строки комментариев не отлаживаются (зачем?), Edit-поле теперь «только для чтения», также немного увеличено ограничение на число вводимых символов (по умолчанию не так уж и много помещается ), ну и ещё пару улучшении.
Цитата:
Если ввести в поиске «Opera +address», то получим топик с подобным вопросом (я кстати его и спрашивал ) и ответом.
А как получить в IE 8 текст адресной строки?
Kasper09 08:02 15-12-2008
Цитата:
См. функции _IE* в справке.
Цитата:
как получить в IE 8 текст адресной строки?
См. функции _IE* в справке.
Здравствуйте! Недавно скачал AutoIt3. Захотелось реализовать следующее:
1. Скрипт следит за буфером обмена.
2. При появлении текста в буфере выдает запрос - копировать в файл или нет.
3. Если нет - следит за буфером дальше, если да - копирует.
4. Если текст в буфере не менялся - скрипт ждет изменений (запрос не выдается).
В принципе работает, но периодически (и довольно часто) два раза появляется запрос на подтверждение отправки текста в файл.
Вопросы:
1. Можно ли исправить двойное появление запроса.
2. Может быть есть принципиально другая реализация.
Заранее спасибо.
Текст скрипта:
Dim $var, $flag1, $var1, $u
HotKeySet("1", "MyExit")
; Выход из скрипта при нажатии "1"
FileOpen("test.txt", 1)
$var = ClipGet()
$flag1 = 1
$var1 = $var
Do
While $var1 = $var
; Цикл отслеживает изменение буфера обмена
$var1 = ClipGet()
; возврат буфера обмена в переменную $var1
WEnd
$u = MsgBox(4, "Вставить", "Или нет")
WinWaitClose("Вставить")
$var = $var1
; переменной сравнения присваиваем новое значение
if $u = 6 Then
FileWriteLine("test.txt", $var1)
EndIf
Until $flag1 = 0
Func MyExit()
Exit
EndFunc
1. Скрипт следит за буфером обмена.
2. При появлении текста в буфере выдает запрос - копировать в файл или нет.
3. Если нет - следит за буфером дальше, если да - копирует.
4. Если текст в буфере не менялся - скрипт ждет изменений (запрос не выдается).
В принципе работает, но периодически (и довольно часто) два раза появляется запрос на подтверждение отправки текста в файл.
Вопросы:
1. Можно ли исправить двойное появление запроса.
2. Может быть есть принципиально другая реализация.
Заранее спасибо.
Текст скрипта:
Dim $var, $flag1, $var1, $u
HotKeySet("1", "MyExit")
; Выход из скрипта при нажатии "1"
FileOpen("test.txt", 1)
$var = ClipGet()
$flag1 = 1
$var1 = $var
Do
While $var1 = $var
; Цикл отслеживает изменение буфера обмена
$var1 = ClipGet()
; возврат буфера обмена в переменную $var1
WEnd
$u = MsgBox(4, "Вставить", "Или нет")
WinWaitClose("Вставить")
$var = $var1
; переменной сравнения присваиваем новое значение
if $u = 6 Then
FileWriteLine("test.txt", $var1)
EndIf
Until $flag1 = 0
Func MyExit()
Exit
EndFunc
Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
Предыдущая тема: Quintura Search
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.