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

» AutoIT

Автор: Kiev78
Дата сообщения: 25.07.2010 11:19

Цитата:
Возможно ли решить такую задачу:

Для этого не нужен АвтоИТ - есть специализированные программы, которые успешно делают подобные операции.
Если же нужно сделать это из АвтоИТа - то можно вызывать regedit с ключами командной строки.
Автор: assch11
Дата сообщения: 25.07.2010 22:49
Здравствуйте.Не подскажете
Можно ли средствами Autoit из формата - PNG - сделать формат - ICO
Я понимаю что для этого есть другие программы
Просто нужно именно на Autoit.
Если можно пример как это делается.
Автор: Zloy_Gelud
Дата сообщения: 26.07.2010 10:39
madmasles
Возможно я плохо объяснил тогда, но мне нужно немного другое..

Код: $sKeywords = 'function,if,and,or,then,while,repeat,end,until,else,elseif,local,in,do,for'
$aKeywords = StringSplit($sKeywords, ",")
$sText = 'for i, strPageName in pairs(tPages) do'
Автор: Kiev78
Дата сообщения: 26.07.2010 11:19

Цитата:
Если ты про команду reg, то она не имеет таких параметров, которые сравнят две копии ветки реестра. Или я плохо смотрел?

Она сделает тебе снимки - а сравнивать ты можешь уже средствами АвтоИТа (ты ведь в нём хочешь всё делать), или использовать другой софт (чисто для сравнения).
Автор: Kastermight
Дата сообщения: 26.07.2010 11:51
Zloy_Gelud
1. Заменить на что?
2. Я бы рекомендовал выделить в отдельные переменные ключевые слова, которые отделяются от других пробелами (do, while, for) и те, которые отделяются знаками "=", "(" и ")" (function). Думаю, что можно всю эту конструкция и в один регвыр засунуть, но логика выражения заметно усложниться, так же как и понимание. Лучше составить по регвыру для каждой группы ключевых слов и пройтись отдельными StringRegExpReplace'ами по каждому из них.

Добавлено:
К примеру вот так можно

Код: $sKeywords = 'function,if,and,or,then,while,repeat,end,until,else,elseif,local,in,do,for'
$sKeywords = StringReplace($sKeywords, ',', '|'); Ключевые слова разделять лучше "|", т.к. этот символ является оператором условия в регвырах
$sChange = "*magic_word*"; Слово на которое нужно заменить каждое из найденных ключевых слов
Dim $sText[3]
$sText[0] = 'for i, strPageName in pairs(tPages) for do while'
$sText[1] = 'strVar = var_for_table; but this for else while '
$sText[2] = 'function() XXX=function() but for do while _not_change_function function'

$sPattern1 = "^(" & $sKeywords & ")([\s\(])"; Шаблон поиска ключевых слов в начале строки
$sPattern2 = "([\s\=])(" & $sKeywords & ")([\s\(])"; Шаблон поиска ключевых слов в середине строки
$sPattern3 = "([\s\=])(" & $sKeywords & ")$"; Шаблон поиска ключевых слов в конце строки
For $i = 0 to 2
Do
$sText[$i] = StringRegExpReplace($sText[$i], $sPattern1, $sChange & "\2")
Until Not @extended
Do
$sText[$i] = StringRegExpReplace($sText[$i], $sPattern2, "\1" & $sChange & "\3")
Until Not @extended
Do
$sText[$i] = StringRegExpReplace($sText[$i], $sPattern3, "\1" & $sChange)
Until Not @extended
; Все циклы проводятся пока все ключевые слова не будут заменены
ConsoleWrite($sText[$i] & @CRLF)
Next
Автор: AZJIO
Дата сообщения: 26.07.2010 13:49
Zloy_Gelud
reg поддерживает сравнение из ком строки
Код: reg compare имя_раздела_1 имя_раздела_2 /v имя_записи | ve| oa|od|os|on |s
Автор: Zloy_Gelud
Дата сообщения: 26.07.2010 18:44

Код: $sSimv = '\.|\=|\/|\*|\-|\+|\<|\>|\~|\,|\[|\]|\{|\}'
$sKeywords = 'function|if|and|or|then|while|repeat|end|until|else|elseif|local|in|do|for'
$s = 'OnJump = function() do'

$s = StringRegExpReplace($s, '^('&$sKeywords&')[\s\(\)\;'&$sSimv&']', '##bC##$1##C## ')
$s = StringRegExpReplace($s, '[\s'&$sSimv&']('&$sKeywords&')[\s\(\)\;'&$sSimv&']', ' ##bC##$1##C## ')
$s = StringRegExpReplace($s, '[\s\(\)\;'& $sSimv &'](' & $sKeywords & ')$', ' ##bC##$1##C##')

MsgBox(0,"",$s)
Автор: AZJIO
Дата сообщения: 26.07.2010 20:52
Zloy_Gelud

Цитата:
Но не сравнит 2 REG или HIVE файла.
копируй раздел в другой раздел и сравнивай последующие изменения. Команда копирования у reg тоже есть.

Обновил калькулятор, добавил поддержку языковых файлов lng, возможность открывать файлы расширенной памяти, соответственно иметь их сколько угодно. Добавил защиту-индикатор, для действий "на 0 делить нельзя" и "корень отрицательного числа". Исправил ошибку на двух кнопках, когда переменные с числами воспринимаются как текстовые.
Автор: opt_step
Дата сообщения: 27.07.2010 10:00
Есть скрипт

Цитата:
RegDelete('HKEY_CURRENT_USER\Software\Microsoft\DrWatson')

как сделать, чтобы он повторялся в цикле каждые 10 мин и при нажатии клавиши выгружался из процессов?
Автор: Kastermight
Дата сообщения: 27.07.2010 10:37
opt_step

Код: HotKeySet("^{DEL}", "_Exit"); Ctrl+Del

While 1
    RegDelete('HKEY_CURRENT_USER\Software\Microsoft\DrWatson')
    Sleep(1000*60*10); 10 min
WEnd

Func _Exit()
Exit
EndFunc
Автор: opt_step
Дата сообщения: 27.07.2010 11:34

Цитата:
HKEY_CURRENT_USER\Software\Microsoft\DrWatson

а как выставить атрибуты (разрешения) у ветки ...\DrWatson?
Автор: Kastermight
Дата сообщения: 27.07.2010 11:56
opt_step
могу посоветовать использовать утилиту командной строки - SetACL.
Автор: degid
Дата сообщения: 27.07.2010 14:56
opt_step
тут пример проверки/изменения прав на VBS... Можно переделать в AutoIT
Автор: Kastermight
Дата сообщения: 27.07.2010 17:10
degid
Да, переделывается легко. Получается примерно следующее

Код: ;Этот скрипт проверяет наличие прав.
;Если делать не Check, а Set то будет менять


Const $KEY_QUERY_VALUE = 0x0001
Const $KEY_SET_VALUE = 0x0002
Const $KEY_CREATE_SUB_KEY = 0x0004
Const $DELETE = 0x00010000
Const $HKEY_LOCAL_MACHINE = 0x80000002
$strComputer = "."
$oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
$strComputer & "\root\default:StdRegProv")
$strKeyPath = "SYSTEM\CurrentControlSet"

Local $bHasAccessRight
$oReg
.CheckAccess($HKEY_LOCAL_MACHINE, $strKeyPath, $KEY_QUERY_VALUE, $bHasAccessRight)
If $bHasAccessRight = True Then
ConsoleWrite("Have Query Value Access Rights on Key" & @CRLF)
Else
ConsoleWrite("Do Not Have Query Value Access Rights on Key" & @CRLF)
EndIf

$oReg.CheckAccess($HKEY_LOCAL_MACHINE, $strKeyPath, $KEY_SET_VALUE, $bHasAccessRight)
If $bHasAccessRight = True Then
ConsoleWrite("Have Set Value Access Rights on Key" & @CRLF)
Else
ConsoleWrite("Do Not Have Set Value Access Rights on Key" & @CRLF)
EndIf

$oReg.CheckAccess($HKEY_LOCAL_MACHINE, $strKeyPath, $KEY_CREATE_SUB_KEY, $bHasAccessRight)
If $bHasAccessRight = True Then
ConsoleWrite("Have Create SubKey Access Rights on Key" & @CRLF)
Else
ConsoleWrite("Do Not Have Create SubKey Access Rights on Key" & @CRLF)
EndIf

$oReg.CheckAccess($HKEY_LOCAL_MACHINE, $strKeyPath, $DELETE, $bHasAccessRight)
If $bHasAccessRight = True Then
ConsoleWrite("Have Delete Access Rights on Key" & @CRLF)
Else
ConsoleWrite("Do Not Have Delete Access Rights on Key" & @CRLF)
EndIf
Автор: AZJIO
Дата сообщения: 28.07.2010 02:56
Обновил калькулятор, и при тесте столкнулся с проблемой больших чисел (вскользь на офсайте читал)

Код: MsgBox(0, 'Message',7450580596923828125*5)
Автор: madmasles
Дата сообщения: 28.07.2010 08:29
AZJIO,
BigNum UDF - Библиотека для работы с большими числами.
Автор: AZJIO
Дата сообщения: 28.07.2010 08:48
madmasles
Уже лучше но запинается на следующем порядке
MsgBox(0, 'Message',_BigNum_Mul(37252902984619140625, 5))

Использовал числа как строковые переменные, тогда правильно считает...
Автор: Xecutioner
Дата сообщения: 28.07.2010 08:57
Добрый день!
Есть такая программка CheckXML для проверки налоговой отчетности и отчетности в ПФР, у нее есть своя динамическая библиотека CPSNXML.dll к которой существует описание.
При выполнении функции "cpsnValidate" autoit просто вылетает не говоря ни слова (появляется только окно отправить ошибку в мелкософт). Может быть я что-то неправильно делаю?

Вот как в описании обозначаются переменные этой функции на Visual Basic:


Код: Declare Function cpsnValidate Lib "CPSNXML" (ByVal sXmlFileName As String, ByRef nError As Long, ByRef nWarning As Long) As Long
Автор: Loopback
Дата сообщения: 28.07.2010 10:50
Xecutioner
По-видимому, в качестве второго-третьего параметра требуется указатель на целое (в VB "ByRef"). Попробуй записать так:

Код:
DllCall($dll,"long","cpsnValidate","str",$sPath,"long*",$iErrors,"long*",$iPredup)
Автор: AZJIO
Дата сообщения: 28.07.2010 11:12
madmasles
теперь вопрос встал как получить результат с мантисой и экспонентой, а не полной строкой, которая не влазиет в инпут.

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


Код: If StringLen($rech)>20 And Not(StringInStr($rech, 'e+') Or StringInStr($rech, 'e-')) Then
If StringLen(Int($rech))>20 Then
$r1 = StringMid($rech, 1, 1)
$exp=StringLen(Int($rech))-1
If StringLen($exp)<3 Then $exp='0'&$exp
If StringLen($exp)<3 Then $exp='0'&$exp
$rech=$r1&'.'&StringTrimLeft(StringTrimRight(Int($rech),5),1)&'e+'$exp
Else
If StringMid($rech, 1, 1)<>0 Then
$Npt = StringInStr($rech, '.')
$rech= Round($rech, 20-$Npt)
Else
$aRech1=StringRegExp($rech, '(0\.)(0*)(\d+)',3)
$exp=StringLen($aRech1[1])+1
$r1 = StringMid($aRech1[2], 1, 1)
$rech=$r1&'.'&StringTrimLeft($aRech1[2],1)
$rech= Round($rech, 15)&'e-'&$exp
EndIf
EndIf
EndIf

Func _ConvNumP($num)
$exp='1'
$aRech1=StringSplit($num, '+')
For $i = 1 to Execute($aRech1[2])
$exp&='0'
Next
$num = _BigNum_Mul(StringTrimRight($aRech1[1],1), $exp)
Return $num
EndFunc

Func _ConvNumM($num)
$exp='1'
$aRech1=StringSplit($num, '-')
For $i = 1 to $aRech1[2]
$exp&='0'
Next
$num = _BigNum_Div(StringTrimRight($aRech1[1],1), $exp,'200')
Return $num
EndFunc
Автор: AZJIO
Дата сообщения: 28.07.2010 13:19
Строки деления требуют указать величину разрядности, например 200
MsgBox(0, 'Message',_BigNum_Div('0.0001', '41','200'))
MsgBox(0, 'Message',_BigNum_Div(0.0001, 41,200)
Автор: Xecutioner
Дата сообщения: 28.07.2010 14:19
Loopback
Спасибо! все замечательно работает.
Раз DllCall сам по себе является массивом с результатом выполненных функций, а не записывает их в переменные, то $iErrors и $iPredup в моем примере не нужны.

Цитата:
По-видимому, в качестве второго-третьего параметра требуется указатель на целое (в VB "ByRef"). Попробуй записать так:

Код:

DllCall($dll,"long","cpsnValidate","str",$sPath,"long*",$iErrors,"long*",$iPredup)



Кстати, Autoit не вернет число ошибок в $iErrors, это значение надо будет брать из массива, который возвращает DllCall.

Автор: Kar1son
Дата сообщения: 28.07.2010 15:21
иногда подвисает iexplorer.exe, те окна не видно, а процесс висит. как бы определить такой процесс и убить? можно сравнить количество процессов со списком окон, но как потом выбрать какой из процессов убить а какой живой?
Автор: AZJIO
Дата сообщения: 29.07.2010 02:43
Обновил секундомер, избавил индикатор от мерцания, добавлены горячие клавиши, авторестарт времени при выборе сигнала, возможность остановить сигнал.
Автор: Lovec
Дата сообщения: 01.08.2010 23:42
Народ!
Третий час сижу туплю, не могу понять почему DllCall не ищет простейший Блокнот....


Код: $a = DllCall("User32.dll", "hwnd", "FindWindowA", _
"str", "", _
"str", "Безымянный - Блокнот")

MsgBox (0, '', $a[0])
Автор: ViSiToR
Дата сообщения: 02.08.2010 00:12
Lovec 00:42 02-08-2010
Цитата:
почему DllCall не ищет простейший Блокнот

Потому что функции нужны оба параметра, как заголовок окна, так и его класс:


Код: $a = DllCall("User32.dll", "hwnd", "FindWindow", _
"str", "Notepad", _ ;Class
"str", "Безымянный - Блокнот")

MsgBox (0, '', $a[0])
Автор: Lovec
Дата сообщения: 02.08.2010 10:50
ViSiToR
Спасибо, уважаемый. Так действительно работает

Но вот вопрос. смотрим MSDN:

Код: HWND WINAPI FindWindow(
__in_opt LPCTSTR lpClassName,
__in_opt LPCTSTR lpWindowName
);
Автор: ViSiToR
Дата сообщения: 02.08.2010 11:18
Lovec 11:50 02-08-2010
Цитата:
Вот я, веря MSDN и пытался использовать только один параметр

Нет, пустая строка ("") совсем не означает Null , нужно указать там «"int", 0».
Автор: Lovec
Дата сообщения: 02.08.2010 15:18
ViSiToR
И снова ты прав Сенкс.

Может подскажешь еще... Вот есть API-функция GetDiskFreeSpace.
Вот откуда простой человек, не работающий в Microsoft, может знать что она возвращает массив данных и что именно в каком элементе массива хранится?? Ведь в MSDN об этом ни слова Все справочники по API что я видел - лишь жалкая копия MSDN и от них толку не более.
Откуда же люди берут эту инфу???
Автор: Kar1son
Дата сообщения: 02.08.2010 15:31
Можно ли как-то в локалке получить имена машин, зная ИП адреса? на всех машинах есть права админа

Страницы: 12345678910111213

Предыдущая тема: Проблемы с VMware Workstation (часть 4)


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