Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: ViSiToR
Дата сообщения: 28.12.2008 12:42
lll6 13:09 28-12-2008
Цитата:
Как распечатать кусок строки?

На принтер? Можно например поместить этот кусок во временный файл, и печатать его:


Код:
$sLine = "Привет, мир"
$sPrint_Line = StringMid($sLine, 5, 7)

$sTmp_File = @TempDir & "\~Au3_PrintProc.txt"

$hOpenTmpFile = FileOpen($sTmp_File, 2)
FileWrite($hOpenTmpFile, $sPrint_Line)
FileClose($hOpenTmpFile)

RunWait('Rundll32.exe "' & @SystemDir & '\mshtml.dll",PrintHTML "' & $sTmp_File & '"', @SystemDir)

FileDelete($sTmp_File)
Автор: Hackproof
Дата сообщения: 28.12.2008 18:27
Можно ли как-нибудь изобразить запуск приложения с указанием, на каком мониторе ему нужно сидеть?

=========================
Сам догадался. WinGetPos, WinMove, WinSetState.
Автор: Dr_Gusenica
Дата сообщения: 28.12.2008 22:32
Есть два вопроса:
1. Как приостановить скрипт, чтобы он ожидал нажатия определенной клавиши/кнопки мыши;
2. Как попроще организовать слежение за буфером обмена с заменой недопустимых в имени фала символов (*, /, ? и др.), например, на _(Computer*12*p1-25 на Computer_12_p1-25)
Автор: ViSiToR
Дата сообщения: 28.12.2008 23:07
Dr_Gusenica 23:32 28-12-2008
Цитата:
Как приостановить скрипт, чтобы он ожидал нажатия определенной клавиши/кнопки мыши


Смотря при каких условиях, пример:


Код: Global $iPaused = True

HotKeySet("^+p", "_PauseToggle")
HotKeySet("{ESC}", "_Quit")

_PauseToggle()

$iDemo_Count = 0

While 1
Sleep(1000)

$iDemo_Count += 1
ConsoleWrite(", " & $iDemo_Count)
WEnd

Func
_PauseToggle()
$iPaused = Not $iPaused

If $iPaused Then
ConsoleWrite(", Ждёмс... ")
Else
ConsoleWrite("Поехали... ")
EndIf

While
$iPaused
Sleep(10)
WEnd
EndFunc

Func
_Quit()
Exit
EndFunc
Автор: araneon
Дата сообщения: 28.12.2008 23:53
С наступающим ВСЕХ. Ребята есть проблемка с USDownloader. Есть много ссылок с депозита, проблема в том, что USD после примерно первых двух закачек, уходит в ожидание минимум минут на 30. У меня динамический IP, вот я и подумал можно ли как сделать скриптик который следил бы за временем ожидания в USD и при нахождении примерно более 2 минут делал ресет подключения к интернету и затем посылал в USD нажатие клавиши F5 ??? Как думаете это вообще реально или нет ??? За ранее ОГРОМНОЕ СПАСИБО
Автор: ViSiToR
Дата сообщения: 29.12.2008 00:06
araneon 00:53 29-12-2008
Цитата:
можно ли как сделать скриптик который следил бы за временем ожидания в USD и при нахождении примерно более 2 минут делал ресет подключения к интернету и затем посылал в USD нажатие клавиши F5 ?

А зачем? USD и сам умеет это делать, в настройках можно выставить время ожидания, так же как и команду при неудачной попытке скачать файлы. Например, можно указать путь к программе перезапуска подключения, это может быть батник с «rasdial /disconnect», или даже AutoIt скрипт с функцией перезапуска подключения (см. в шапке под Отдельные функции (UDF):).
Автор: CKA3O4H1K
Дата сообщения: 29.12.2008 00:11
К сожалению для меня задача оказалась непосильной, прошу помощи

Данное решение окажется полезным для всех кто хоть иногда фотографирует в RAWе. Задача следующая:

Фотоаппарат сохраняет два файла: RAW и JPG
После копирования всех фотографий и последующем просмотре, естественно, возникает желание часть фотографий удалить. В большинстве случаев просматриваются JPGи, они же и удаляются. После них остаются огромные RAWы, которые тоже нужно удалить. Вручную это делать очень не удобно, приходиться смотреть какие JPG остались, вспоминать...

Очень хотел бы иметь скрипт, который сканировал бы текущую папку на RAWы, и искал соответствующий ему по имени JPG. Если JPG не существует - удалять текущий RAW.

Сложна ли задача?

Автор: ViSiToR
Дата сообщения: 29.12.2008 00:40
CKA3O4H1K 01:11 29-12-2008
Цитата:
хотел бы иметь скрипт, который сканировал бы текущую папку на RAWы, и искал соответствующий ему по имени JPG. Если JPG не существует - удалять текущий RAW.

Если только в текущей папке (без рекурсии), тогда можно сделать так:


Код: Global $iDeleted = 0, $sDeleted_FilesList = ""
Global $hSearch = FileFindFirstFile(@ScriptDir & "\*.raw")

If $hSearch = -1 Then
MsgBox(48, "Ошибка", "Не найднеы *.raw файлы в текущем каталоге.")
Exit
EndIf

While
1
$sNextFile = FileFindNextFile($hSearch)
If @error Then ExitLoop

If
StringRight($sNextFile, 3) <> "raw" Then ContinueLoop

$sJpgFileName = StringRegExpReplace($sNextFile, "\.[^\.]*$", ".jpg")

If Not FileExists(@ScriptDir & "\" & $sJpgFileName) And FileDelete(@ScriptDir & "\" & $sNextFile) Then
$iDeleted += 1
$sDeleted_FilesList &= @ScriptDir & "\" & $sNextFile & @CRLF
EndIf
WEnd

If
$iDeleted > 0 Then
MsgBox(64, "Результат", StringFormat("Список файлов которые были удалены [%i]:\n\n%s", $iDeleted, $sDeleted_FilesList))
Else
MsgBox(64, "Результат", "Ни один файл небыл удалён.")
EndIf
Автор: Dr_Gusenica
Дата сообщения: 29.12.2008 00:58
ViSiToR, огромное спасибо за скрипты (отдельно - за оперативность).
Скрипт, меняющий символы в буфере - в самую точку.
На счет приостановки скрипта поясню задачу. Скрипт не нужно останавливать нажатием клавиши, он должен сам остановиться и ждать, пока ее нажмут.
Идеальный вариант - выполнение цикла, в котором "истина" - нажатие клавиши - завершала бы цикл (когда - то давно делал такое в Basic, точно помню, только как- забыл).
Работа скрипта невозможна пока пользователь не поместит курсор мыши в какое-то место на экране (каждый раз разное, не имеет привязки к Title, Class и др.) и не будут получены значения координат положения курсра мыши.
Просто поставить Sleep для того чтобы успели передвинуть курсор - плохой вариант - у каждого разная реакция, кто-то не успеет, кто-то будет зря ждать.
Поэтому задумка такая: выводится
MsgBox(0, "Внимание!","Установите курсор в левый верхний угол области обработки и нажмите 'ПРОБЕЛ'")
Начинает выполняться цикл, пльзователь перемещает курсор и прерывает цикл нажатием SPACE (может быть любая другая).
Затем при помоши MouseGetPos() значения фиксируются.
Еще лучше, если прерывать цикл бдет нажатие кнопки мыши.
P.S. Прошу прощения если запутал объясненими. Скорее всего задачу можно решить более современными инструментами.




Автор: CKA3O4H1K
Дата сообщения: 29.12.2008 01:22
ViSiToR
отлично! огромное спасибо CreatoR за твой труд!


Добавлено:
Прошу прощения, я забыл указать что RAWы бывают двух расширений: PEF и DNG
Скрипт отредактировал, заменив RAW на PEF, но добавить еще одно обрабатываемое расширение не смог (одновременно или PEF или DNG)

Как сформулировать правильно строку?
Global $hSearch = FileFindFirstFile(@ScriptDir & "\*.pef" & "\*.dng")
и
If StringRight($sNextFile, 3) <> "pef" or "dng" Then ContinueLoop

Спасибо!

Добавлено:
и сложно ли добавить рекурсивность на вложенные папки?
Автор: ViSiToR
Дата сообщения: 29.12.2008 02:37
Dr_Gusenica 01:58 29-12-2008
Цитата:
Начинает выполняться цикл, пльзователь перемещает курсор и прерывает цикл  нажатием SPACE

При MsgBox никакой цикл работать не будет. Нужно либо ToolTip, либо вообще ничего (или после сообщения, закрыв его). И не понятно, как тогда скрипт будет останавливаться, сам по себе? так не бывает - Нужно определить что скрипт остановлен. Так или иначе, вот пример паузы цикла и ожидание перемещения курсора мышки в нужные координаты:


Код: #include <Misc.au3>

Global $iLoopIsStopped = False
Global
$hUser32_DllOpen = DllOpen("User32.dll")

Global $iX_Coord = 105
Global $iY_Coord = 110

HotKeySet("{ESC}", "_Quit")

While 1
;Допустим через 2 секунды цикл прервался
Sleep(2000)

_StopLoop_Proc()
WEnd

Func
_StopLoop_Proc()
While True
Sleep(100)

If _IsPressed(01, $hUser32_DllOpen) Or _IsPressed(20, $hUser32_DllOpen) Then
$aMouse_Pos = MouseGetPos()

If $aMouse_Pos[0] = $iX_Coord And $aMouse_Pos[1] = $iY_Coord Then
MsgBox(64, "Найдены координаты", "Проверка (X: " & $aMouse_Pos[0] & ", Y: " & $aMouse_Pos[1] & ")")
ExitLoop
EndIf
EndIf
WEnd
EndFunc

Func
_Quit()
DllClose($hUser32_DllOpen)
Exit
EndFunc
Автор: Maza Faka
Дата сообщения: 29.12.2008 07:35
CKA3O4H1K

Цитата:
сложно ли добавить рекурсивность на вложенные папки?

COM-метод, +рекурсия +возможность указания нескольких расширений файла +скорость

Код: Global $objFSO = ObjCreate("Scripting.FileSystemObject")

_FileEnumEx("c:\PhotoFolder", "PEF|DNG")

Func _FileEnumEx($sPath, $sExt)
Local $objFolder, $colSubFolder, $objSubFolder, $colFiles, $objFile

$objFolder
= $objFSO.GetFolder($sPath)
$colFiles = $objFolder.Files
$colSubFolder = $objFolder.SubFolders

For $objFile In $colFiles
If StringRegExp($objFile.Name, '(?i)\.(' & $sExt & ')$') Then
If Not
FileExists(StringRegExpReplace($objFile.Path, "(?i)\A(.*\.).*", "\1") & "JPG") Then FileDelete($objFile.Path)
EndIf
Next

For
$objSubFolder In $colSubFolder
_FileEnumEx($objSubFolder.Path, $sExt)
Next
EndFunc
;==>_FileEnumEx
Автор: araneon
Дата сообщения: 29.12.2008 08:23
ViSiToR Огромное тебе спасибо, как до дома доеду обязательно проверю.

Добавлено:
ViSiToR Огромное тебе спасибо, как до дома доеду обязательно проверю. А этот скрипт VPN соединение тоже рестарит ?
Автор: Dr_Gusenica
Дата сообщения: 29.12.2008 12:18
ViSiToR, премного тебе благодарен!

Цитата:
При MsgBox никакой цикл работать не будет


это понятно, я забыл добавить, что выполнение цикла должо начаться имено после закрытия MsgBox.

И хоть я не совсем верно изложил задачу, тем не менее в твоем ответе нашел ответ на вопрос. Все что мне, оказывается, было нужно - это функция _IsPressed, даже приведенный в Help пример удовлетворяет почти всем моим треблваниям.
Спасибо за помощь, проблема решена!
Автор: ViSiToR
Дата сообщения: 29.12.2008 13:20
Maza Faka 08:35 29-12-2008
Цитата:
COM-метод, +рекурсия +возможность указания нескольких расширений файла +скорость

Кстати, на оф. форуме делали сравнение, какой метод самый быстрый для получения списка файлов... И как я понял, COM как раз очень медленный при работе с большим количеством файлов - Хотя при сравнении моего примера и твоего (на папке с многими вложенными файлами и папками), твой оказался быстрее (на 2 с лишним секунды ). Но это из за того что мой пример сначала читает в массив список файлов+папок, и только потом обрабатывает их. Вот что у меня получилось при попытке ускорить скрипт, плюс придать удобное использование. [more=Читать скрипт...]
Код: $sDeleted_FilesList = _RAWFilesDelete_Proc("C:\Photos", "PEF|DNG", "JPG", 1)
$iDeleted = @extended

If $iDeleted > 0 Then
MsgBox(64, "Результат", StringFormat("Список файлов которые были удалены [%i]:\n\n%s", $iDeleted, $sDeleted_FilesList))
Else
MsgBox(64, "Результат", "Ни один файл небыл удалён.")
EndIf

Func
_RAWFilesDelete_Proc($sPath, $sFilter="PEF|DNG", $sCompare_Ext="JPG", $iRecursive=1)
If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0)

Local $hSearch, $sFindNext, $sFilePath, $i = 0, $iDeleted = 0, $sDeleted_FilesList = ""
Local $iMax_Ret_Paths = 10000
Local $aPathesArr[$iMax_Ret_Paths+1] = [1, $sPath]

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

If StringInStr(FileGetAttrib($sFilePath & "\"), "D") Then
If
$aPathesArr[0] >= $iMax_Ret_Paths Then
$iMax_Ret_Paths *= 2
ReDim $aPathesArr[$iMax_Ret_Paths+1]
EndIf

$aPathesArr[0] += 1
$aPathesArr[$aPathesArr[0]] = $sFilePath
Else
If Not StringRegExp($sFilePath, "(?i)\.(" & $sFilter & ")$") Then ContinueLoop
If FileExists(StringRegExpReplace($sFilePath, "\.[^\.]*$", "." & $sCompare_Ext)) Then ContinueLoop

If FileDelete($sFilePath) Then
$iDeleted += 1
$sDeleted_FilesList &= $sFilePath & @CRLF
EndIf
EndIf
WEnd

FileClose($hSearch)
If Not $iRecursive Then ExitLoop
Wend

Return SetExtended($iDeleted, $sDeleted_FilesList)
EndFunc
Автор: Zwook
Дата сообщения: 29.12.2008 14:42
Привет, давненько я тут не был...

Мне нужно послать несколько клавиш одна за другой без задержки. Следовательно я использовал Opt( "SendKeyDelay", 0 ), я также пробовал Opt( "SendKeyDelay", 1 ). Проблема в том, что это работает не совсем так как мне надо...

В виндовсе, к примеру в блокноте, клавиши вводятся без задержки. В игре (в которой я пытаюсь это симулировать) оно работает, но задержка все равно есть, гдето 50-100 мс.
Я проверял работает ли сама функция ставя высокие задержки 500-1000 мс, все работает... Если в самой игре последовательно быстро нажать 2 клавиши, задержки не будет, а следовательно проблема не в игре а в скрипте....

Вот код



Код: Opt( "SendKeyDelay", 0 )
Opt( "SendKeyDownDelay", 0 )
Opt( "MouseClickDelay", 0 )
Opt( "MouseClickDownDelay", 0 )

#include <Misc.au3>

While 1
         ; If _IsPressed("28") Then
Send("{Space}")

MouseClick("Left")

Send("{LSHIFT}")

MouseClick("Left")

Send("{LSHIFT}")

    ;EndIf
WEnd
Автор: CKA3O4H1K
Дата сообщения: 29.12.2008 15:42
ViSiToR
Maza Faka

Приогромнейшее спасибо!
Со своей стороны постараюсь поделиться скриптом со всеми с кем смогу, копирайт обязательно укажу. Так просто взяли и облегчили будни фотографов.

AutoIT буду осваивать, тем более в Linux под Wine скомпиленые скрипты отлично работают, а простота и грациозность сабжа впечатляет, особенно в ваших руках

P.S.: Как следует поступить, что бы научить скрипт брать путь рабочей папки из параметров командной строки? Причём будет вариант когда передаётся путь с файлом и нужно будет отделить только путь к вмещающей папке и работать с ней.

Нужно анализировать переданную строку, или есть готовые решение, как распознать путь к родительской папке?
Автор: Zwook
Дата сообщения: 29.12.2008 18:29
Нашел игру специально для людей работающих в аутоит

http://www.kongregate.com/games/Coolio_Niato/light-bot

Вот скриншот игры (сам делал) - http://img155.imageshack.us/img155/7103/17279126aq6.jpg

Для тех у кого туго с английским: Цель игры запрограммировать робота, чтобы он прошел по всем синим клеткам и зажег их лампочкой. Очень очень похоже на написание программ в Аутоит, всем советую


###Закончил все уровни, урааа
Автор: CKA3O4H1K
Дата сообщения: 29.12.2008 19:07
Оказалось всё намного проще: заменил @ScriptDir на @WorkingDir
Замечательно понимает текущую папку, хотя передаю в параметрах путь к конкретному изображению.

Кроме того заменил FileDelete на FileRecycle, теперь можно не бояться ошибки.
Как отточу скрипт - выложу в этом посте под кат.
Спасибо большое ребята!

P.S.: Хотя всё же это решение с передаваемым путём не совсем гибкое. Сделав кнопку в ACDSee и TotalCommander все работает, но если передать файл через меню explorer "SendTo" или открывать файл с помощью скрипта, то путь к папке изображения не определяется и не обрабатывается, тоесть скрипт не срабатывает (проверяю на скомпилированом екзешнике)
Автор: Zwook
Дата сообщения: 29.12.2008 19:27

Цитата:
Оказалось всё намного проще: заменил @ScriptDir на @WorkingDir



Не совсем понял, что ты пытаешься сделать, но попробуй через $FileDir = InputBox()
Автор: CKA3O4H1K
Дата сообщения: 29.12.2008 19:47
Пытаюсь доработать скрипт с прошлой страницы, что бы тот обрабатывал папку, путь к которой передаётся в параметрах командной строки, причем если передаётся не папка, а файл, то нужно определить путь к папке в которой находиться этот файл и работать с ней.
Автор: Zwook
Дата сообщения: 29.12.2008 20:05
А все файлы с одним и тем же расширением?
Автор: ViSiToR
Дата сообщения: 29.12.2008 20:48
CKA3O4H1K 16:42 29-12-2008
Цитата:
научить скрипт брать путь рабочей папки из параметров командной строки? Причём будет вариант когда передаётся путь с файлом и нужно будет отделить только путь к вмещающей папке и работать с ней

Через регулярные выражения, но сначала нужно строго проверить, передана папка или файл:


Код:
$sPhotos_Path = _Get_Photos_Path()

;Тут поместить всё остальное (код проверки и удаления файлов)

Func _Get_Photos_Path()
Local $sPhotos_Path = @ScriptDir
If $CmdLine[0] > 0 Then $sPhotos_Path = $CmdLine[1]

Local $iPhotos_Path_Is_File = FileExists($sPhotos_Path) And Not StringInStr(FileGetAttrib($sPhotos_Path), "D")
If $iPhotos_Path_Is_File Then $sPhotos_Path = StringRegExpReplace($sPhotos_Path, "\\[^\\]*$", "")

Return $sPhotos_Path
EndFunc
Автор: Zwook
Дата сообщения: 29.12.2008 21:03

Цитата:
Интересно как оно связано с AutoIt'ом


Те же самые операции в игре, что и в аутоит - Симулируешь действия, составляешь функции, вобщем интересно поиграть


Цитата:
А зачем там проверять нажатие клавиши «Вниз»? Вообще то _IsPressed в цикле используют так:



Ну вобщем-то весь смысл, в том, чтобы кнопки нажимались когда нажато вниз или любая другая кнопка. В любом случае, Вы не ответили как убрать задержку? Я был бы очень благодарен....
Автор: ViSiToR
Дата сообщения: 29.12.2008 21:23
Zwook 22:03 29-12-2008
Цитата:
как убрать задержку?

На стороне скрипта вроде убирать нечего, это оптимальный вариант.
Автор: Zwook
Дата сообщения: 29.12.2008 22:15

Цитата:
На стороне скрипта вроде убирать нечего, это оптимальный вариант.



Может у Вас есть теория почему в игре задержка большая, а в виндовсе её нет?

Моя теория: Игра мониторит Directinput интерфейс и блокирует все горячие клавиши, из за чего кстати Hotkey в игре вообще не работает.

Как решить: Думаю пустить все кнопки через clipboard, как это реализовать, я не знаю...
Автор: ViSiToR
Дата сообщения: 29.12.2008 23:20
Zwook 23:15 29-12-2008
Цитата:
почему в игре задержка большая, а в виндовсе её нет?

Возможно потому что игра нагружает процессор, а имитация нажатии клаиш требует ресурсов


Цитата:
блокирует все горячие клавиши

Возможно, это свойственно играм.


Цитата:
Как решить: Думаю пустить все кнопки через clipboard, как это реализовать, я не знаю...

Я тоже, не представляю как это поможет с нажатием клавиш...
Автор: Zwook
Дата сообщения: 29.12.2008 23:53
Ну ладно, Вам лучше знать. Буду делать иными не аутоитовскими методами ....
Автор: Zwook
Дата сообщения: 30.12.2008 13:57
Новый день, новая проблема.


Возникли следующие вопросы ->

№1 Если знаешь адресс, opcode и значение некой ячейки операционной памяти, можно ли изменить значение этого адресса аутоитовскими коммандами.

№2 В продолжении к первому вопросу, есть ли в аутоит встроенный ассембли компилятор, чтобы в аутоите изменять opcode ячейки операционной памяти?

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


№3 Как поставить лимит на максимальное значение координат в MouseMove(), то есть - у меня в скрипте так:

MouseMove( x, $Var-100 )

Допустим мне надо сделать так, чтобы значение координаты "y" не понижалось ниже 140, а $Var равен 210 (к примеру, это может быть любое число), надо сделать так, чтобы $Var увеличился до 240 (240-100=140). Я пробовал вот так:

If $Var[1] <240 Then
    $Var[1] = 240
EndIf

Выдает ошибку -> ==> Subscript used with non-Array variable.:

Хотя $Var это двумерный Array, [0],[1] в чем проблема ?

№4 Так как у меня не получается №3 сразу задам вопрос про то, что должно происходить с этим самым MouseMove() и можно ли это реализовать.
Допустим №3 работает, и мы получили MouseMove( 100, 300 ). Далее должна идти проверка PixelSearch( 100, 140, 200, координата из MouseMove "y" ) Так как MouseMove не создает Array, то как скрипту указать на эту самую координату "y" из прошлого MouseMove ?


Заранее благодарен за люблю помощь!
Автор: ViSiToR
Дата сообщения: 30.12.2008 14:29
Zwook 14:57 30-12-2008
Цитата:
можно ли изменить значение этого адресса аутоитовскими коммандами

Можно попробовать с Memory UDF


Цитата:
есть ли в аутоит встроенный ассембли компилятор, чтобы в аутоите изменять opcode ячейки операционной памяти?

Не уверен, но может AutoIt Inline Assembly UDF поможет?


Цитата:
$Var это двумерный Array, [0],[1] в чем проблема ?

В том, что с двумерными массивами нужно обращаться соответственно


Код: #include <Misc.au3>

Dim $aVar[2][2] = [[100, 0], [200, 1]]

MouseClick("Main", $aVar[0][0], _Iif($aVar[1][0] < 240, 240, $aVar[1][0]), 1, 0)

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.