PDA

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

Котяра
21-02-2008, 18:09
Creat0R, спасибо за ответ. Деинсталлятор мой действительно простой, а то, что предложили Вы - это де инсталлятор как программа, а я говрю о Uninstall для какой-то конкретной программы.

Котяра
21-02-2008, 18:30
Вот так делаются Setup'ы:

$installpath = InputBox("Установка", "Введите путь установки.", @ProgramFilesDir & "\Example", "")
if $installpath = '' then Exit
if @error = 1 then Exit
DirCreate($installpath)
FileCopy(@ScriptDir & "\example.txt", $installpath & "\example.txt")
FileCopy(@ScriptDir & "\Uninst.exe", $installpath & "\Uninst.exe")
MsgBox(4160, "Установка", "Установка успешно завершена!")
; Write a single REG_SZ value
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "DisplayName", "REG_SZ", "Example v1.00")
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "UninstallString", "REG_SZ", $installpath & "\Uninst.exe")

А так Uninstall'ы:

$installpath = InputBox("Установка", "Введите путь установки.", @ProgramFilesDir & "\Example", "")
if $installpath = '' then Exit
if @error = 1 then Exit
DirCreate($installpath)
FileCopy(@ScriptDir & "\example.txt", $installpath & "\example.txt")
FileCopy(@ScriptDir & "\Uninst.exe", $installpath & "\Uninst.exe")
MsgBox(4160, "Установка", "Установка успешно завершена!")
; Write a single REG_SZ value
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "DisplayName", "REG_SZ", "Example v1.00")
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "UninstallString", "REG_SZ", $installpath & "\Uninst.exe")

Устанавливается и удаляется один файл. Минус один - не создаются ярлыки и после деинсталляции Uninst.exe остается лежать. Uninst.exe - это скомплированный деинсталлятор.

Давно искал инструмент типа AutoIt'а. Bat-файлы обладают малой функциональстью, малым средства для создания пользовательского интерфейса, VBS-скрипты сложны в освоений. AutoIt - классная вещь! :) :) :) :) :)

Котяра
21-02-2008, 18:51
При желании можно в Uninstall добавить проверку на установленность программы:

$installed = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "UninstallString")
if $installed = '' Then Exit

это в самое начало

Котяра
21-02-2008, 19:40
Creat0R, да, классный деинсталлятор. Замена всяким платным Best Uninstaller'ам и прочим.
Только одного смущает - нет кнопки для запуска изменения программы.

И самое главное, чем меня НЕ устроили батники: плохая поддержка русского языка

Maza Faka
22-02-2008, 10:02
КотяраЗамена всяким платным Best Uninstaller'ам »
Попробуй InnoSetup, очень удобный и простой в освоении, бесплатен.

DNK_Inc
22-02-2008, 11:40
Подскажите:help:, пожалуйста :cry: , какими командами в AutoIt можно запустить окно свойств необходимого логического диска и эмулировать нажатие необходимых кнопок на активной вкладке? А также, как запустить из скрипта консольную команду control userpasswords2 ?

Всю справку облазил - по свойствам диска и по консольным командам вообще ничего не нашёл, а по поводу кнопки - в команде ControlClick в качестве параметров указываю текст заголовка окна, текст на кнопке, classnameNN (эти данные взял с помощью утилиты AutoIt Window Info), а команда либо не исполняется вообще, либо эмулирует нажатие кнопки из совершенно другой вкладки данного окна свойств :( . Из ситуации выхожу эмулированием нажатий клавиш и их комбинаций. Но, во-первых, скрипт из-за этого получается довольно-таки громоздким и тяжёлым для разбора, а во-вторых, не всегда работает (не всегда срабатывает команда Send при передвижении по объектам проводника).

amel27
22-02-2008, 11:50
Creat0R
Установленные секунды округляются до чётного числа »нет, баг не в этом - для FAT четное число будет всегда, просто AutoIT округляет неправильно... вот цитата из MSDN (http://msdn2.microsoft.com/en-us/library/ms724284(VS.85).aspx): Not all file systems can record creation and last access time and not all file systems record them in the same manner. For example, on NT FAT, create time has a resolution of 10 milliseconds, write time has a resolution of 2 seconds, and access time has a resolution of 1 day (really, the access date). On NTFS, access time has a resolution of 1 hour. Therefore, the GetFileTime function may not return the same file time information set using the SetFileTime function. Furthermore, FAT records times on disk in local time. However, NTFS records times on disk in UTC.вот вариант UDF, который показывает заодно и причину округления:$File = "s:\Test.txt"

$hOpenFile = FileOpen($File, 2)
FileWrite($hOpenFile, "Test")
FileClose($hOpenFile)

$SetTime = '20060322083528' ; - 2

_FileSetTime($File, $SetTime)
;FileSetTime($File, $SetTime)

$GetTime = FileGetTime($File, 0, 1)
MsgBox(0, "", StringFormat("Set Time: %s \nGet Time: %s", $SetTime, $GetTime))
FileDelete($File)

Func _FileSetTime($strFile, $strTime, $intType = 0)
Local $iY=Number(StringLeft($strTime,4))
Local $iM=Number(StringMid($strTime,5,2))
Local $iD=Number(StringMid($strTime,7,2))
Local $iH=Number(StringMid($strTime,9,2))
Local $iN=Number(StringMid($strTime,11,2))
Local $iS=Number(StringMid($strTime,13))
; DOS-формат для времени
Local $iFatDate = BitShift($iY-1980,-9) + BitShift($iM,-5) + $iD
Local $iFatTime = BitShift($iH,-11) + BitShift($iN,-5) + $iS/2 ; вот тут косячок в хранении секунд
; базовые структуры
Local $FILETIME = DllStructCreate("dword;dword")
Local $SYSTEMTIME = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
; туда-сюда-обратно
Local $ret = DllCall("kernel32.dll", "int", "DosDateTimeToFileTime", "ushort", $iFatDate, "ushort", $iFatTime, "ptr", DllStructGetPtr($FILETIME))
If $ret[0] =0 Then Return SetError(1, 1, False)
$ret = DllCall("kernel32.dll", "int", "FileTimeToSystemTime", "ptr", DllStructGetPtr($FILETIME), "ptr", DllStructGetPtr($SYSTEMTIME))
If $ret[0] =0 Then Return SetError(1, 2, False)
DllStructSetData($SYSTEMTIME,7,$iS) ; пытаемся откорректировать
$ret = DllCall("kernel32.dll", "int", "SystemTimeToFileTime", "ptr", DllStructGetPtr($SYSTEMTIME), "ptr", DllStructGetPtr($FILETIME))
If $ret[0] =0 Then Return SetError(1, 3, False)
; открываем файл
$ret = DllCall("kernel32.dll", "int", "CreateFile", _
"str", $strFile, "dword", 0x100, "dword", 0, "ptr", 0, "dword", 3, "dword", 0, "ptr", 0 )
If $ret[0] =0 Then Return SetError(2, 1, False)
; правим время и закрываем файл
Local $hFile=$ret[0], $aSysTime[3] = [0,0,0]
$aSysTime[$intType]=DllStructGetPtr($FILETIME)
$ret = DllCall("kernel32.dll", "int", "SetFileTime", "int", $hFile, "ptr", $aSysTime[1], "ptr", $aSysTime[2], "ptr", $aSysTime[0])
DllCall("kernel32.dll", "int", "CloseHandle", "int", $hFile)
If $ret[0] =0 Then Return SetError(2, 2, False)
Return True
EndFunc

А на счёт печяти никто так и не знает решения? amel27, не подскажешь? »может невнимательно читал, но ты про что? :unsure:

Dump
22-02-2008, 13:23
Помогите пожалуйста.
Как в AutoIT можно написать скрипт, чтобы он выполнял такое действие: Если в папке C:\123 появились файлы, то нужно отправить сообщение пользователю через netsend. А в идеале было бы, чтобы по почте отправлялись сообщения. Почтовый сервер на exchange2003

Creat0R
22-02-2008, 16:25
amel27, для FAT четное число будет всегда
Действительно, даже NirCmd не справляется.
Тогда у меня проблема намного серъёзнее чем я думал...

Дело в том, что мне нужно получать дату последнего изменения у файла в сети, и сравнивать её с датой изменения у файла на диске, если есть разница, то пытаться скачать файл (точнее юзер будет качать через диалог). После удачной закачки, я устанавливаю дату изменения файла на диске, чтобы при последующей проверки даты совпали. И получается что если дата файла в сети имеет не чётные секунды, то у меня всегда будет разница в данных :(

вот вариант UDF, который показывает заодно и причину округления:
Спасибо, для NTFS пригодится :)


ты про что?
Нужно напечатать файл-изображение, но при печати должен быть выведен диалог Мастера печати... (http://forum.oszone.net/thread-98914-13.html#post739183)

Но кажется я нашёл решение:

Run('Rundll32.exe "' & @SystemDir & '\mshtml.dll",PrintHTML "c:\image.png"', @SystemDir)

Правда пока негде потестить, дома у меня принтер не работает. Диалог то выводится, но печатает ли, вот это и нужно проверить.

DNK_Inc, как запустить из скрипта консольную команду control userpasswords2 ?
Run(@ComSpec & ' /c control userpasswords2', '', @SW_HIDE)

Dump, Если в папке C:\123 появились файлы, то нужно отправить сообщение пользователю через netsend

If FileExists("C:\123\*.*") Then Run(@ComSpec & ' /c net send {имя | * | /DOMAIN[:имя] | /USERS} сообщение', '', @SW_HIDE)

А в идеале было бы, чтобы по почте отправлялись сообщения.
Есть неплохой UDF: _INetSmtpMailCom (http://www.autoitscript.com/forum/index.php?showtopic=23860&hl=_INetSmtpMailCom).

amel27
23-02-2008, 11:09
Creat0R
если дата файла в сети имеет не чётные секунды, то у меня всегда будет разница в данных »не понял в чем проблема?.. просто округляй секунды перед сравнением до четного числа
Нужно напечатать файл-изображение, но при печати должен быть выведен диалог Мастера печати...можно и через Shell.Application:_FileOpenPrint("D:\BUF\P1010376.JPG")

While 1
Sleep (100)
WEnd

Func _FileOpenPrint ($sFilePath)
Local $oShellApp = ObjCreate('shell.application')
Local $sPath = StringRegExpReplace($sFilePath, "\\[^\\]+$", "")
If @extended =0 Then $sPath = @WorkingDir
Local $oPath = $oShellApp.Namespace ($sPath), $oItem
For $oItem In $oPath.items
If $oItem.Path = $sFilePath Then
ConsoleWrite($oItem.Path &@CRLF)
$oItem.InvokeVerb('&Печать')
EndIf
Next
EndFunc ; => _FileOpenPrint

; Эта UDF может быть полезна для просмотра поддерживаемых Verbs
Func _FileListVerbs($sFilePath)
Local $oShellApp = ObjCreate('shell.application')
Local $sPath = StringRegExpReplace($sFilePath, "\\[^\\]+$", "")
If @extended =0 Then $sPath = @WorkingDir
Local $oPath = $oShellApp.Namespace ($sPath), $oItem
For $oItem In $oPath.items
If $oItem.path = $sFilePath Then
Local $oVerbs = $oItem.Verbs
For $oVerb In $oVerbs
ConsoleWrite($oVerb.Name &@CRLF)
Next
EndIf
Next
EndFunc ; => _FileListVerbs

Creat0R
23-02-2008, 11:44
amel27, просто округляй секунды перед сравнением до четного числа
Я так и делаю, но округлять нужно в две стороны, либо больше, либо меньше (проверяя поочерёдно). А также это даёт неточный результат, если в сети на одну секунду позже будет обновлён файл, то для юзера не будет обновлении :) - Хотя я ещё подстраховался размером файла ;) .

В общем ладно, не так уж и страшно. Кстати, странно что на той же Fat(32), время создания файла может быть не чётным :dont-know

можно и через Shell.Application:
Вот именно этот диалог мне нужен!
Но тут проблема, «&Печать» может быть чем то другим на другой системе. А также возвращается проблема с “висячим” скриптом.

Через API нельзя этот же вызов делать? мне казалось что это будет намного проще, я удивляюсь почему вообще внедрили UDF _FilePrint(), который почти не работает. Хотя я так понял оно только для текстовых файлов?


P.S
Я всё пытаюсь (http://www.autoitscript.com/forum/index.php?s=&showtopic=25143&view=findpost&p=483243) научиться пользоваться MSDN, но так и не понял, как переписывать функции/описания приведённые там, в синтаксис AutoIt? Мне бы только алгоритм узнать, я уже интуитивно как нибудь разберусь думаю. Я так понимаю что многие берут за основу (как вспомогательные средства) библиотеки от C/C++ и т.п., я как то ставил себе, но тогда ещё про API даже и речи небыло. Но как это всё использовать, к примеру там пишут (http://msdn2.microsoft.com/en-us/library/aa385120(VS.85).aspx):

lpfnInternetCallback

A pointer to the callback function to call when progress is made, or NULL to remove the existing callback function.

Как узнать, что это за указатель, я пытался от DllCallBackRegister указать, но видимо не то :(.

amel27
23-02-2008, 17:58
Creat0R
округлять нужно в две стороны, либо больше, либо меньше »если не брать в расчет AutoIT'овский баг, то однозначно в сторону уменьшения
на той же Fat(32), время создания файла может быть не чётным »из той же цитаты MSDN "on NT FAT, create time has a resolution of 10 milliseconds"
«&Печать» может быть чем то другим на другой системе »это несложно определить через реестр, к примеру для HTML-файлов это ключ "HKEY_CLASSES_ROOT\htmlfile\shell\Print\command", хотя для PNG я бы пожалуй смотрел в сторону ветки "HKEY_CLASSES_ROOT\pngfile"... кстати, там же можно подсмотреть и команды печати ;)
Через API нельзя этот же вызов делать? »ну, имена DLL и функции у тебя есть, почему бы не попробовать? :)
Как узнать, что это за указатель, я пытался от DllCallBackRegister указать, но видимо не то »думаю то, тут вроде подробней расписано: http://www.podgoretsky.com/ftp/Docs/Internet/doc/WinInet.doc

DNK_Inc
какими командами в AutoIt можно запустить окно свойств необходимого логического диска »;Opt("TrayIconHide",1)
;Opt("ExpandEnvStrings",1)

$sDir = "C:"
$sName = _OpenFolderProperties($sDir)

WinWait("Свойства: "& $sName, "", 5)
;WinWaitClose("Свойства: "& $name)

While 1
Sleep(100)
WEnd

Func _OpenFolderProperties($sDir)
Local $oShellApp = ObjCreate('shell.application')
Local $oDir = $oShellApp.Namespace ($sDir)
Local $oItem = $oDir.Self
$oItem.InvokeVerb('Сво&йства')
Return $oItem.Name
EndFunc

Creat0R
24-02-2008, 17:15
amel27, там же можно подсмотреть и команды печати
Там есть это:

rundll32.exe C:\WINDOWS\system32\shimgvw.dll,ImageView_PrintTo /pt "%1" "%2" "%3" "%4"

Судя по описанию (http://www.dx21.com/SCRIPTING/RUNDLL32/VIEWITEM.ASP?OID=200&CMD=P-A), последние два параметра не используются, первый это путь к файлу, а второй имя принтера, которое тоже нужно узнать. Но даже указав верное имя принтера, выводится диалог сохранения в файл *.xps :dont-know - Хотя при вызове этой команды из контекстного меню изображения, сразу выводится диалог мастера печати. Интересно, что там передаётся в качестве второго параметра (или может быть всё же в качестве третьего/четвёртого?).

имена DLL и функции у тебя есть, почему бы не попробовать?
Я попробовал с "comdlg32.dll" (PrintDlg). Но просидев пару часов с MSDN (http://msdn2.microsoft.com/en-us/library/ms646964(VS.85).aspx), ничего не вышло, я видимо не так первожу значения структуры (http://msdn2.microsoft.com/en-us/library/ms646843(VS.85).aspx), а где подставлять имя файла я вовсе не нашёл, или там только hDC поддерживается?

#Include <ScreenCapture.au3>

$hwnd = WinGetHandle("")
$hDC = __ScreenCapture_Capture()
$File = "C:\Temp\fog.png"

;Строем структуру (WORD это вроде char?)
$stFilePath = DllStructCreate('dword;hwnd;int;int;hwnd;dword;char;char;char;char;char;hwnd;lparam;ptr;ptr;int;int' )

;Заполняем структуру
DllStructSetData($stFilePath, 1, DllStructGetSize($stFilePath))
DllStructSetData($stFilePath, 2, $hwnd)
DllStructSetData($stFilePath, 5, $hDC)

;Пытаемся показать диалог печати, безуспешно :(
$aRet = DllCall("comdlg32.dll", "int", "PrintDlg", "ptr", DllStructGetPtr($stFilePath))
ConsoleWrite($aRet[0])

;Функция возвращает Device context захваченного изображения
Func __ScreenCapture_Capture($sFileName = "", $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1)
Local $iH, $iW, $hWnd, $hDDC, $hCDC, $hBMP

If $iRight = -1 Then $iRight = _WinAPI_GetSystemMetrics($SM_CXSCREEN)
If $iBottom = -1 Then $iBottom = _WinAPI_GetSystemMetrics($SM_CYSCREEN)
If $iRight < $iLeft Then Return SetError(-1, 0, 0)
If $iBottom < $iTop Then Return SetError(-2, 0, 0)

$iW = $iRight - $iLeft
$iH = $iBottom - $iTop
$hWnd = _WinAPI_GetDesktopWindow()
$hDDC = _WinAPI_GetDC($hWnd)
$hCDC = _WinAPI_CreateCompatibleDC($hDDC)
$hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iW, $iH)
_WinAPI_SelectObject($hCDC, $hBMP)
_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $SRCCOPY)

_WinAPI_ReleaseDC($hWnd, $hDDC)
_WinAPI_DeleteDC($hCDC)

Return $hCDC
EndFunc


тут вроде подробней расписано
Спасибо, будем смотреть.

Dump
25-02-2008, 14:24
Dump,
Цитата:
Если в папке C:\123 появились файлы, то нужно отправить сообщение пользователю через netsend
Код:
If FileExists("C:\123\*.*") Then Run(@ComSpec & ' /c net send {имя | * | /DOMAIN[:имя] | /USERS} сообщение', '', @SW_HIDE) »
Так не получилось, даже при пустой папке всё равно отрабатывает, пошел другим путём сделал так:
Код: If DirGetSize("C:\temp")>0 Then Run(@ComSpec & ' /c net send 192.168.105.84 Внимание ДИСПЕТЧЕР', '', @SW_HIDE)

HORRIBLE
25-02-2008, 16:40
Если я использую ToolTip, можно как нибудь задать шрифт (сделать его жирным или курсивом )?

Моя програмка использует команду MouseClick (почему взял именно эту команду, потому что мне известны только координаты кнопок), тем самым пока прога работает комп занят. А возможно ли такое, чтоб и прога работала и пользоваться компьтером было бы можно? (Сразу оговорюсь эта прога работает в окне интернет экспловера, да есть команды которые специально предназначены для IE, но честно с помощью них у меня ничего не получилось. )

amel27
26-02-2008, 06:16
Creat0R
Интересно, что там передаётся в качестве второго параметра (или может быть всё же в качестве третьего/четвёртого?).ТУТ (http://support.microsoft.com/kb/224961) они расшифрованы, последние два применяются только в 9x/NT4
даже указав верное имя принтера, выводится диалог сохранения в файл »Не знаю - у меня оба варианта нормально работают, причем "rundll32.exe C:\WINDOWS\system32\mshtml.dll,PrintHTML" вызывает приглашение на выбор принтера, а "rundll32.exe C:\WINDOWS\system32\shimgvw.dll,ImageView_PrintTo /pt" сразу отправляет на указанный в параметре принтер. Сомневаюсь, что получится вызвать эти функции напрямую без использования rundll32, по крайней мере никакой информации по их другому использованию я не нашел... если помнишь, аналогичная ситуация была у меня с запуском INF-файлов - функция вроде документирована в MSDN, но на прямой вызов не реагирует, и судя по Гуглю не у меня одного... :dont-know
Я попробовал с "comdlg32.dll" (PrintDlg). »ИМХО оно не стоит того - эти диалоги только помогают визуально инициализировать требуемые структуры, но использовать их для последующей печати AFAIK средствами AutoIT не получится.

И еще по поводу Verbs - в MSDN сказано, что для стандартных Verbs всегда существует универсальный идентификатор, не зависящий от языка... и видимо без знака "&", во всяком случае для "Print" у меня сработало.canonical verb names remain constant regardless of platform or language, which makes it possible for developers to invoke known canonical verbs without knowing the details about a Shell namespace item

HORRIBLE
28-02-2008, 00:40
Как правильно объявить свою функцию, чтобы после выполнения этой функции прога не отключалась, а ждала пока функция закончит свои действия и продолжила работу далее?


MouseClickDrag("left", 186, 561, 100,226)
MouseClickDrag("left", 1261, 181, 1261,472)
MouseClickDrag("left", 100,226, 100,344)
mouseClick("left", 90, 224, 1)


_health() ; до сюда все выполняется, а далее прога отключается, что я не так делаю ????


sleep(600)
MouseClick("left",1170, 225)
sleep(600)
MouseClick("left",1202,225)


Func _health()
..........
EndFunc

Maza Faka
28-02-2008, 07:11
Как правильно объявить свою функцию, чтобы после выполнения этой функции прога не отключалась, а ждала пока функция закончит свои действия и продолжила работу далее? »
Да вроде бы так и работает, для проверки вставил ConsoleWrite()
MouseClickDrag("left", 186, 561, 100,226)
MouseClickDrag("left", 1261, 181, 1261,472)
MouseClickDrag("left", 100,226, 100,344)
mouseClick("left", 90, 224, 1)

_health() ; Вызывается функция, а затем выполняется всё, что идёт ниже :)

sleep(600)
ConsoleWrite("sleep 600" & @LF)
MouseClick("left",1170, 225)
sleep(600)
ConsoleWrite("sleep 600_2" & @LF)
MouseClick("left",1202,225)

Func _health()
ConsoleWrite("_health" & @LF)
EndFunc

Котяра
02-03-2008, 21:32
Распространенная задача, с которой возникают трудности - создание загрузчика. Загрузчик запускает файл как программу. Это надо для создания меню своего CD. Так вот в AutoIt делается загрузчик простейшим образом. Все решается одной строчкой

ShellExecute("file.html")

Можно доделать, например. скрыть икону (хотя она все равно висит лишь пару секунд)

Opt("TrayIconHide", 1)
ShellExecute("file.html")


Этот скрипт потом надо скомпилировать, естественно.

AnGI_Burn
02-03-2008, 23:01
А вот интересно, на AutoIt реально написать простенький файловый менеджер?




© OSzone.net 2001-2012