Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Помогите пжалста...
Какой командой в скрипте прописать выполнение другого скрипта *.vbs ?
Endr,
Какой командой в скрипте прописать выполнение другого скрипта *.vbs ?
Несколько методов:
$MyScript = '"C:\My Script.vbs"'
;1)
Run("wscript.exe " & $MyScript)
;2)
ShellExecute($MyScript)
Хотя наверняка проще переписать всё то, что делает vbs скрипт, на AutoIt.
Creat0R, будьте добры, подскажите пжалста как установить в Windows XP службу, с последующим запуском данной службы. В справке AutoIt я этого не нашел... (или может ссылочку туда, где это обсуждается) :help:
ЗЫ: Creat0R, описанные Вами способы не помогли запустить скрипт *.vbs :(
Endr,
как установить в Windows XP службу, с последующим запуском данной службы.
Я этого не знаю :( , никогда не сталкивался.
описанные Вами способы не помогли запустить скрипт *.vbs
Что происходит при попытке? а при обычном запуске (кликом по файлу) нормально запускается?
Если кликнуть по файлу *.vbs, то скрипт запускается, а если через описанные выше способы (через скрипт AutoIt) вообще ничего не происходит... (и почему-то с некоторых пор у меня при запуске скриптов AutoIt в трее ничего не появляется :( )
Извиняюсь, что не цитирую, что-то не получается тут это использовать на этом компьютере..
Endr,
ничего не происходит
А такой скрипт работает:
MsgBox(0, "", "Hello World!")
:)
с некоторых пор у меня при запуске скриптов AutoIt в трее ничего не появляется
Иконка спрятана? (в настройках панели задач).
Creat0R, да, окошко появляется :)
Да дело не в компьютере... мои-то скрипты работают.
Тут видимо не так надо запускать vbs-файлик...
Endr,
видимо не так надо запускать vbs-файлик
Я очень редко советую что-то, не проверив на себе, если не тестировал, то так и напишу - “Не тестировано”.
У меня оно работает нормально, вопрос возможно глупым покажется, но всё же; как определяется что скрипт (vbs) не запускается?
Creat0R, у меня есть скрипт на VBS, который подкидывает файлики, устанавливает и запускает службу в Винде и потом удаляет все, что для этого требуется и себя. Определить работает скрипт или нет очень просто - служба запускается (если она выключена) и потом файлы удаляются...
Все это нужно для установки Радмина (тот скрипт, который я нашел в интернете делает это видимо, а мой - скрытно).
В данный момент у меня половина написана на AutoIt (это распаковка файлов для установки, в т.ч. и скрипт на VBS), а остальное делает собственно скриптик VBS.
Могу прикрепить код.
Endr,
Можно попробовать указать рабочую папку:
ShellExecute($MyScript, "", "C:\")
[hr]
amel27
Такой вопрос - накалякал функцию (на основе других подобных) для проверки пути, не является ли он запущенным процессом, всё вроде работает (возвращает PID процесса), но вопрос в том, насколько надёжно использовать Psapi.dll? :shuffle: - в справке по этому поводу вот что сказанно:
psapi.dll - Process...() function helper DLL - used under Windows NT 4 only (Microsoft redistributable file)
Т.е получается на других системах работать не будет?
Вот функция:
$PathIsProcess = _PathIsProcess("C:\Program Files\qip\qip.exe")
MsgBox(0, '', $PathIsProcess & @LF & @extended)
Func _PathIsProcess($sPath)
If Not FileExists($sPath) Then Return SetError(1, 0, False)
Local $sPathName = StringRegExpReplace($sPath, "^.*\\", "")
Local $aProcList = ProcessList($sPathName)
If Not ProcessExists($sPathName) Then Return SetError(2, 0, False)
Local $iUbound = UBound($aProcList)-1
Local $aProc, $aPath
Local $vStruct = DllStructCreate('int[1024]')
For $i = 1 To $iUbound
$aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1])
If Not IsArray($aProc) Or Not $aProc[0] Then Return SetError(3, 0, False)
DllCall('Psapi.dll', 'int', 'EnumProcessModules', _
'hwnd', $aProc[0], _
'ptr', DllStructGetPtr($vStruct), _
'int', DllStructGetSize($vStruct), _
'int_ptr', 0)
$aPath = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', _
'hwnd', $aProc[0], _
'int', DllStructGetData($vStruct, 1), _
'str', '', _
'int', 2048)
If IsArray($aPath) And $aPath[3] = $sPath Then Return SetExtended($iUbound, $aProcList[$i][1])
Next
Return SetExtended($iUbound, False)
EndFunc
Может есть альтернативы?
Creat0R, указал рабочую папку и запустился VBS-скрипт. Спасибо! :up
Maza Faka
27-12-2007, 09:31
Creat0R
Привет! Не поможешь?
Никак не получается убить процесс средствами WinAPI
#include <Array.au3>
Process_Kill("totalcmd.exe")
Func Process_Kill($sProc)
Local $ProcHandle
Local $ProcessPid = ProcessExists($sProc)
If $ProcessPid = 0 Then
MsgBox(16, "Error", "Process " & $sProc & " not exist")
Return SetError(1)
EndIf
$ProcHandle = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", BitOR(0x0400, 0x0004), "int", 0, "dword", $ProcessPid)
If $ProcHandle[0] = 0 Then
MsgBox(16, "Error", "Process " & $sProc & " not exist")
Return SetError(1)
EndIf
$ProcHandle = $ProcHandle[0]
$ProcTerminate = DllCall("kernel32.dll", "int", "TerminateProcess", "hwnd", $ProcHandle, "uint", "?")
$CloseHandle = DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $ProcHandle)
ConsoleWrite("@@ (6) : " & $CloseHandle[0] & " ")
EndFunc
В выделенной строке в место параметра "?", надо вставить uExitCode
The exit code to be used by the process and threads terminated as a result of this call. Use the GetExitCodeProcess [ http://msdn2.microsoft.com/en-us/library/ms683189(VS.85,printer).aspx ] function to retrieve a process's exit value. Use the GetExitCodeThread [ http://msdn2.microsoft.com/en-us/library/ms683190(VS.85,printer).aspx ] function to retrieve a thread's exit value.
GetExitCodeProcess Function
Retrieves the termination status of the specified process.
BOOL WINAPI GetExitCodeProcess(
__in HANDLE hProcess,
__out LPDWORD lpExitCode
);
Parameters
hProcess
A handle to the process.
The handle must have the PROCESS_QUERY_INFORMATION access right. For more information, see Process Security and Access Rights [ http://msdn2.microsoft.com/en-us/library/ms684880(VS.85,printer).aspx ] .
lpExitCode
A pointer to a variable to receive the process termination status. If the specified process has not terminated and the function succeeds, the status is STILL_ACTIVE.
Как я понял нужно создать структуру Dll, а вот как её создать?
Maza Faka, В выделенной строке в место параметра "?", надо вставить
Там должен быть код (по сути ptr - указатель) выхода от GetExitCodeProcess ... если я не ошибаюсь... у меня тоже не получается заставить это работать, либо скрипт крушится, либо процесс не убивается. DLL-о-писание видимо будет доходить (до меня по крайней мере) долго, т.к мануалов по этой теме вроде нету, я имею в виду именно для использования в AutoIt, а так приходится включать интуицию/способности "тыкания" :).
На оф. форуме решения тоже нет, там ссылаются на C/C++, а на AutoIt перевести видимо ленятся :biggrin:
Maza Faka
27-12-2007, 10:55
Creat0R
Там должен быть код (по сути ptr - указатель) выхода от GetExitCodeProcess
Это понятно, что нужно указать pointer, а вот как его создать? (amel27 где ты гуру?) :)
а так приходится включать интуицию/способности "тыкания"
Вот-вот, всё утро на это убил... :(
P.S.
Если вдруг наткнёшься на решение, сообщи пожалуйста.
Maza Faka
27-12-2007, 13:11
Ура! :) Нашёл, вернее указали (http://www.autoitscript.com/forum/index.php?showtopic=60417&view=findpost&p=454378) на ошибку. А ошибочное значение из недобросовестного ресурса, уже не помню какого.
Функция возвращает пронумерованный список всех классов определённого окна:
Func _WinGetNumeratedClassList($sTitle)
Local $sClassList = WinGetClassList($sTitle)
Local $aClassList = StringSplit($sClassList, @LF)
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] & @LF
Else
$aClassList[$i] &= "~1"
$sHold_List &= $aClassList[$i] & "|"
$sRetClassList &= $aClassList[$i] & @LF
EndIf
Next
Return StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc
amel27,
Не удаётся в новой версии AutoIt 3.2.10.0 переделать самопальную функцию _FileSelectFolder() - хотел избавиться от CallBack UDF'ов, соответственно использовать встроенные функции, но при запуске скрипт намертво виснит, диалога невидно вовсе :(
Я заменил...
_DllCallBack($sCallbackProc,'hwnd;uint;long;ptr')
на
DllCallBackRegister($sCallbackProc, 'int', 'hwnd;uint;long;ptr')
А также _DllCallBack_Free на DllCallBackFree
И убрал все UDF'ы/переменные/константы от библиотеки CallBack, но видимо нужно что-то ещё править, подскажи плиз что именно, у меня многие скрипты используют эту функцию, я затрудняюсь теперь пересесть на новую версию :help: .
МИШАНЧИК
01-01-2008, 15:25
Никто не пробовал написать скрипт для Nero 8? А то втихую не получается, требует перезагрузку даже при включенном автоматическом обновлении. Может кто попробует, у кого время есть?
Заранее спасибо!
Хорошо пополняются посты в этом топике =)
Помогите реализовать корректно работающий скрипт с тикими требованиями:
Лечилка для одной RPG игры. Все происходит в разрешении 1024х786
1. В определенных координатах если изменился цвет, то нажимание клавиши Q происходит с интервалом 0.5 секунды пока невернется снова красный цвет (q клавиша это пить баночки жизьни). И в это же самое время нажимать клавишу E (e элексир силы)
2. Очень важно чтоб при этом была всегда зажата правая кнопка мышки (почемуто у меня никак неполучается реализовать в действии с другими командами)
3. Как реализовать чтоб работало внезависимости если 32 бит или 16 цвет?
Поискал по форуму здесь и на офф. сайте вот нашел скрипт но в нем часть задумки реализована. Кстати он неработает тоесть не нажимает на кнопки.
Opt("WinTitleMatchMode", 1)
HotKeySet("{F5}", "Start")
While 1
Sleep(10)
WEnd
Func Start()
MsgBox(0,"","Start() triggered")
$left = PixelChecksum(380, 420, 400, 400)
ConsoleWrite($left & @CRLF)
$down = PixelChecksum(450, 420, 470, 400)
ConsoleWrite($down & @CRLF)
$up = PixelChecksum(520, 420, 535, 410)
ConsoleWrite($up & @CRLF)
$right = PixelChecksum(590, 415, 585, 400)
ConsoleWrite($right & @CRLF)
While 1
If $left <> PixelChecksum(380, 420, 400, 400) Then Send("q")
If $down <> PixelChecksum(450, 420, 470, 400) Then Send("e")
If $up <> PixelChecksum(520, 420, 535, 410) Then Send("w")
If $right <> PixelChecksum(590, 415, 585, 400) Then Send("t")
WEnd
EndFunc
Maza Faka
02-01-2008, 08:44
kagorec
С Новым Годом!
1. В определенных координатах если изменился цвет, то нажимание клавиши Q происходит с интервалом 0.5 секунды пока невернется снова красный цвет (q клавиша это пить баночки жизьни). И в это же самое время нажимать клавишу E (e элексир силы)
В принципе написать такой скрипт несложно, в топике есть примеры.
2. Очень важно чтоб при этом была всегда зажата правая кнопка мышки (почемуто у меня никак неполучается реализовать в действии с другими командами)
Смотри в справке MouseDown()
3. Как реализовать чтоб работало внезависимости если 32 бит или 16 цвет?
Можно после запуска игры определять глубину цвета рабочего стола @DesktopDepth и в зависимости от результата передавать значение в функцию.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.