Войти

Показать полную графическую версию : [Архив - Часть 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

Maza Faka
04-01-2009, 07:40
Помогите сделать небольшой скрипт »
Довольно-таки сумбурное изложение проблемы :) Как я понял тебе нужно реализовать

окно с полосой проверки измененных файлов в папке "sys"

?

Frag-o-Matik
04-01-2009, 08:57
окно с полосой проверки измененных файлов в папке "sys" »
нет)
Довольно-таки сумбурное изложение проблемы »
ну не знаю как объяснить по другому, ща попытаюсь
вот структура папок:

-Path
-*.ini
-Ustanovka.exe
-Sys
-*.ini
-Ustanovka.exe
-Zapusk.exe

Запуск производится только файлом Zapusk.exe, который сначала проверяет ini файлы на изменения через сервер в интернете. После проверки в окне Zapusk.exe становится активной кнопка Установить, при нажатии которой запускается файл с папки Sys - Ustanovka.exe. Но прежде чем нажать эту кнопку, я запускаю бат файл (после проверки инишников), который подменяет папку систем со своими ини файлами и файлом Ustanovka.exe. Хотелось бы автоматизировать процесс, чтобы постоянно вручную не переименовывать папки, потому что иногда забываешь :)

katok888
04-01-2009, 09:31
Creat0R, 2009-01-04 09:29:03>> ============ Debug Log For [Folder.exe] Started...
2009-01-04 09:29:03>> ============ Operating System: WIN_XP
2009-01-04 09:29:03>> ============ Service Pack: Service Pack 3
2009-01-04 09:29:03>> ============ File System: NTFS ============

...

2009-01-04 09:29:37>> ============ Debug Log Finished (EXIT CODE: 0) ============

Maza Faka
04-01-2009, 10:37
Хотелось бы автоматизировать процесс, чтобы постоянно вручную не переименовывать папки »
Но ты ведь вроде ответил на свой вопрос?

If FileExists("path") Then
RunWait("Zapusk.exe", "")
ProcessWaitClose ( "Zapusk.exe" )

???; ВОТ ЗДЕСЬ Я НЕ ПОНИМАЮ ЧТО НАПИСАТЬ)

DirMove("sys", "sys1")
DirMove("path", "sys")
EndIf

ProcessWaitClose ( "Ustanovka.exe" )
DirMove("system", "path")
DirMove("system1", "system")
exit

Может так?

If FileExists("path") Then
DirMove("sys", "sys1")
DirMove("path", "sys")

RunWait("Zapusk.exe", "")
ProcessWaitClose("Zapusk.exe")
EndIf

ProcessWaitClose("Ustanovka.exe")
DirMove("system", "path")
DirMove("system1", "system")

Creat0R
04-01-2009, 12:50
katok888, Я не вижу что вообще была попытка создать папку, ведь для этого нужно нажать «Ctrl + Shift + N» :)

ganselo
04-01-2009, 12:58
лог в студию: »

2009-01-04 12:54:55>> ============ Debug Log For [AutoIt v3 Script.au3] Started...
2009-01-04 12:54:55>> ============ Operating System: WIN_XP
2009-01-04 12:54:55>> ============ Service Pack: Service Pack 2
2009-01-04 12:54:55>> ============ File System: NTFS ============

...

2009-01-04 12:55:04>> _CreateFolder_Proc Call: Found active window with following Class Name: [CLASS:Progman]
2009-01-04 12:55:04>> _CreateFolder_Proc Call: And with following Title: Program Manager
2009-01-04 12:55:04>> _CreateFolder_Proc Call: Detected path for creating folder in: C:\Documents and Settings\gansello\Рабочий стол
2009-01-04 12:55:04>> _CreateFolder_Proc Call: Creating folder with the following name: New_1...
2009-01-04 12:55:04>> _CreateFolder_Proc Call: Folder created(?): True

2009-01-04 12:55:13>> _CreateFolder_Proc Call: Found active window with following Class Name: [CLASS:CabinetWClass]
2009-01-04 12:55:13>> _CreateFolder_Proc Call: And with following Title: Multimedia (D:)
2009-01-04 12:55:13>> _CreateFolder_Proc Call: Path for creating folder was not found:
2009-01-04 12:55:17>> _CreateFolder_Proc Call: Found active window with following Class Name: [CLASS:CabinetWClass]
2009-01-04 12:55:17>> _CreateFolder_Proc Call: And with following Title: Multimedia (D:)
2009-01-04 12:55:17>> _CreateFolder_Proc Call: Path for creating folder was not found:


А что во вкладке Hidden Text? »
Пусто.

katok888
04-01-2009, 13:15
Creat0R, Ну так я и нажимал

Creat0R
04-01-2009, 13:28
ganselo, katok888,
Проблему нашёл вроде, у вас адресная строка выключенна в проводнике? :) - Щас попробую найти решение...

ganselo
04-01-2009, 13:29
у вас адресная строка выключенна в проводнике »
У меня да.

katok888
04-01-2009, 13:39
Проблему нашёл вроде, у вас адресная строка выключенна в проводнике? »
У меня вообще QTadressbar

ganselo
04-01-2009, 14:00
Включил адресную строку и всё заработало.

Creat0R
04-01-2009, 15:50
Вообщем вот ещё одна версия, если путь не найден, путь определяется методом создания временного файла с использованием буфера обмена. Есть также метод где происходит откат адресной строки, для этого нужно установить 1 у переменной $iGet_Path_Method. Так или иначе, оба метода не самые надёжные :beta: :jester:

* Также добавил поддержку очерёдности запуска функции - По идее, если нажимать заветные горячие клавиши несколько раз подряд, то папки будут создаваться по очерёдно, в логе будет это записано (попытка двойного вызова, и запись с очереди).

#NoTrayIcon
#include <File.au3>
#include <Misc.au3>

_Singleton("_CreateFolder_Proc")

Opt("WinWaitDelay", 1)

Global $i_CreateFolder_Proc_IsRuning = False

Global $iQueue_Calls = 0

Global $iDebug = True
Global $sDebug_LogFile = @ScriptDir & "\DebugLog.log"

Global $iGet_Path_Method = -1
Global $sFileNameFormat = "New_%i"

HotKeySet("^+n", "_CreateFolder_Proc") ;Ctrl + Shift + n
HotKeySet("^+т", "_CreateFolder_Proc") ;Ctrl + Shift + n
HotKeySet("^+w", "_Quit") ;Ctrl + Shift + w
HotKeySet("^+ц", "_Quit") ;Ctrl + Shift + w

OnAutoItStart_Init()

While 1
Sleep(1000)

If $iQueue_Calls > 0 Then
For $i = 1 To $iQueue_Calls
_CreateFolder_Proc($i)
Next
EndIf
WEnd

Func _CreateFolder_Proc($iQueue_Call=0)
If $i_CreateFolder_Proc_IsRuning Then
$iQueue_Calls += 1
Return _DebugToLog_Proc("_CreateFolder_Proc Call: ### Double Call Try... Added to the Queue (#" & $iQueue_Calls & ").")
EndIf

$i_CreateFolder_Proc_IsRuning = True

Local $s_CreateFolder_Proc_DebugData = "_CreateFolder_Proc Call: Called by HotKey(" & @HotKeyPressed & ")"

If IsDeclared("iQueue_Call") And $iQueue_Call > 0 Then
$s_CreateFolder_Proc_DebugData &= " ==> Queue Call #" & $iQueue_Call
$iQueue_Calls -= 1
EndIf

_DebugToLog_Proc($s_CreateFolder_Proc_DebugData & ".")

Local $sExplorer_Title = "[CLASS:CabinetWClass]"
Local $sPath, $iFolder_Created = 0

If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:ExploreWClass]"
If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:Progman]"

If Not WinActive($sExplorer_Title) Then
$i_CreateFolder_Proc_IsRuning = False

Return _DebugToLog_Proc("_CreateFolder_Proc Call: Dir creation is not possible in currently active window: " & _
WinGetTitle("[ACTIVE]") & @CRLF)
EndIf

Switch $sExplorer_Title
Case "[CLASS:CabinetWClass]", "[CLASS:ExploreWClass]"
Local $sWin_Title = WinGetTitle($sExplorer_Title)
Local $sWin_Text = WinGetText($sExplorer_Title)

$sPath = StringRegExpReplace($sWin_Text, "(?s).*(\r\n|)(\w+:\\.*" & $sWin_Title & ")(\r\n|.*)", "\2")
Case "[CLASS:Progman]"
$sPath = @DesktopDir
Case Else
$i_CreateFolder_Proc_IsRuning = False

Return _DebugToLog_Proc( _
"_CreateFolder_Proc Call: " & _
"Unexpected error (can not get window class name, perhaps a memory unavailable)." & @CRLF)
EndSwitch

_DebugToLog_Proc("_CreateFolder_Proc Call: Found active window with following Class Name: " & $sExplorer_Title)
_DebugToLog_Proc("_CreateFolder_Proc Call: And with the following Title: " & WinGetTitle($sExplorer_Title))

If Not StringInStr(FileGetAttrib($sPath), "D") Then $sPath = ControlGetText($sExplorer_Title, "", "Edit1")

If Not StringInStr(FileGetAttrib($sPath), "D") Then
_DebugToLog_Proc("_CreateFolder_Proc Call: Path for creating folder was not found... ")
_DebugToLog_Proc("_CreateFolder_Proc Call: Trying to get path in a hard way :)... (MODE: " & $iGet_Path_Method & ")")

Switch $iGet_Path_Method
Case 1
ControlSend($sExplorer_Title, "", "ToolbarWindow322", "!в{Right}{Down}{Enter}")

Sleep(200)

$sPath = ControlGetText($sExplorer_Title, "", "Edit1")

ControlSend($sExplorer_Title, "", "ToolbarWindow322", "!в{Right}{Down}{Enter}")
Case Else
Local $sTmp_File = _TempFile(@TempDir, "~__Au3_DirCreate_Tmp_Module__")
Local $sTmp_FileName = StringRegExpReplace($sTmp_File, "^.*\\|\.[^\.]*$", "")

Local $hOpenFile = FileClose(FileOpen($sTmp_File, 2))

_ClipPutFile($sTmp_File)
If @error Then _DebugToLog_Proc("_CreateFolder_Proc Call: _ClipPutFile Failed.")

ControlSend($sExplorer_Title, "", "SysListView321", "+{Insert}")

Sleep(500)

$iItem = ControlListView($sExplorer_Title, "", "SysListView321", "FindItem", $sTmp_FileName)

ControlListView($sExplorer_Title, "", "SysListView321", "SelectClear")
ControlListView($sExplorer_Title, "", "SysListView321", "Select", $iItem, $iItem)

Sleep(200)

ControlSend($sExplorer_Title, "", "SysListView321", "^{Insert}")

Sleep(500)

$sPath = ClipGet()
If @error Then _DebugToLog_Proc("_CreateFolder_Proc Call: ClipGet() Failed (ERROR: " & @error & ").")

If StringInStr($sPath, @CRLF) Then _
$sPath = StringLeft($sPath, StringInStr($sPath, @CRLF)-1)

$sPath = StringLeft($sPath, StringInStr($sPath, "\", 0, -1)-1)

FileDelete($sPath & "\" & $sTmp_FileName & ".tmp")
FileDelete($sTmp_File)
EndSwitch

If Not StringInStr(FileGetAttrib($sPath), "D") Then
$i_CreateFolder_Proc_IsRuning = False

Return _DebugToLog_Proc("_CreateFolder_Proc Call: Path for creating folder was not found: " & $sPath)
EndIf
EndIf

_DebugToLog_Proc("_CreateFolder_Proc Call: Detected path for creating folder in: " & $sPath)

Local $iFolder_Num = 1
Local $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)

While StringInStr(FileGetAttrib($sPath & "\" & $sNewFolderName), "D")
$iFolder_Num += 1
$sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)
WEnd

_DebugToLog_Proc("_CreateFolder_Proc Call: Creating folder with the following name: " & $sNewFolderName & "...")

$iFolder_Created = DirCreate($sPath & "\" & $sNewFolderName)
_DebugToLog_Proc("_CreateFolder_Proc Call: Folder created(?): " & ($iFolder_Created = 1) & @CRLF)

$i_CreateFolder_Proc_IsRuning = False
EndFunc ;==>_CreateFolder_Proc

Func _DebugToLog_Proc($sDebug_Info)
If Not $iDebug Then Return

_FileWriteLogEx($sDebug_LogFile, $sDebug_Info & @CRLF)
EndFunc ;==>_DebugToLog_Proc

Func _FileWriteLogEx($sLogPath, $sLogMsg, $iFlag = -1)
Local $sDateNow, $sTimeNow, $sMsg, $iWriteFile, $hOpenFile, $iOpenMode = 1

$sDateNow = @YEAR & "-" & @MON & "-" & @MDAY
$sTimeNow = @HOUR & ":" & @MIN & ":" & @SEC

$sMsg = $sDateNow & " " & $sTimeNow & ">> " & $sLogMsg

If $iFlag <> -1 Then
$sMsg &= FileRead($sLogPath)
$iOpenMode = 2
EndIf

$hOpenFile = FileOpen($sLogPath, $iOpenMode)
If $hOpenFile = -1 Then Return SetError(1, 0, 0)

$iWriteFile = FileWriteLine($hOpenFile, $sMsg)
If $iWriteFile = -1 Then Return SetError(2, 0, 0)

Return FileClose($hOpenFile)
EndFunc ;==>_FileWriteLogEx

Func _Quit()
Exit
EndFunc ;==>_Quit

Func OnAutoItStart_Init()
If $iDebug Then
If FileRead($sDebug_LogFile) <> "" Then
_FileWriteLogEx($sDebug_LogFile, _
StringFormat("============ Debug Log For [%s] Started ============\r\n\r\n...\r\n\r\n", @ScriptName))
Else
_FileWriteLogEx($sDebug_LogFile, StringFormat("============ Debug Log For [%s] Started...", @ScriptName))
_FileWriteLogEx($sDebug_LogFile, StringFormat("============ Operating System: %s\r\n", @OSVersion))
_FileWriteLogEx($sDebug_LogFile, StringFormat("============ Service Pack: %s\r\n", @OSServicePack))
_FileWriteLogEx($sDebug_LogFile, _
StringFormat("============ File System: %s ============\r\n\r\n...\r\n\r\n", DriveGetFileSystem(@HomeDrive)))
EndIf
EndIf
EndFunc ;==>OnAutoItStart_Init

Func OnAutoItExit()
If $iDebug Then
_FileWriteLogEx($sDebug_LogFile, _
StringFormat("============ Debug Log Finished (EXIT CODE: %i) ============\r\n\r\n\r\n", @ScriptName, @exitCode))

$iOpen_LogFile = MsgBox(36, @ScriptName & " - Attention", "Open Debug Log File?" & @CRLF & @CRLF & $sDebug_LogFile)
If $iOpen_LogFile = 6 Then ShellExecute($sDebug_LogFile, "", "", "Open", @SW_SHOWNORMAL)
EndIf
EndFunc ;==>OnAutoItExit

Frag-o-Matik
04-01-2009, 18:42
Может так?
Код:
If FileExists("path") Then
DirMove("sys", "sys1")
DirMove("path", "sys")
RunWait("Zapusk.exe", "")
ProcessWaitClose("Zapusk.exe")
EndIf
ProcessWaitClose("Ustanovka.exe")
DirMove("system", "path")
DirMove("system1", "system") »

если будет так, то сразу после запуска файла zapusk.exe он мне обновит все пропатченные файлы, уже в переименованной папке :)

SAOPP
05-01-2009, 01:44
Ребят, прошу помощи по следующему вопросу, я уже как-то постил подобное, но вот сегодня решил всё же решить, если это решаемо.

Есть окно с вот таким заголовком:
http://img154.imageshack.us/img154/4624/12279482hd8.th.png (http://img154.imageshack.us/img154/4624/12279482hd8.png)
Нужно его свернуть, но только что бы скрипт например отработал после своего запуска через определённое количество секунд, например 5.

Можно попросить кого-нить, если не затруднит написать скриптик подобный, если достаточно того, что я предоставил, т.е. заголовок содержит SoulSeek? Заранее благодарен.

Creat0R
05-01-2009, 01:50
Нужно его свернуть, но только что бы скрипт например отработал после своего запуска через определённое количество секунд, например 5. »


$iTimer = TimerInit()

While 1
If $iTimer <> 0 And TimerDiff($iTimer) >= 5000 Then
$iTimer = 0

WinSetState("SoulSeek", "", @SW_MINIMIZE)
EndIf

Sleep(10)
WEnd

;Или сразу паузу ставить...

Sleep(5000)
WinSetState("SoulSeek", "", @SW_MINIMIZE)

shyra1976
05-01-2009, 11:22
_Test()
If @error Then MsgBox(0, "", "::: ERROR :::")

Func _Test()
$AnswTest = MsgBox(4, "TEST", "Test Passed?")
If $AnswTest = 7 Then ; NO (Test Failed)
$Answ = MsgBox(21, "Error", "Communication ERROR")
Select
Case $Answ = 4 ;Retry
_Test()
Case $Answ = 2 ;Cancel
;~ ConsoleWrite($Answ & @LF)
Return SetError(1)
EndSelect
EndIf
ConsoleWrite(@error & @LF)
ConsoleWrite("Test Passed" & @LF)
Return
EndFunc ;==>_Test



мужики,помогите
Есть рекурсия , она вызывает сому себя .А когда выходит закрывает себя столко раз сколко открыла себя
Вопрос : как сделат так ,что бы Return SetError(1) деиствително возврощал "1" после закритии рекурсии
Да же если она откривалась несколко раз

Creat0R
05-01-2009, 12:27
как сделат так ,что бы Return SetError(1) деиствително возврощал "1" после закритии рекурсии »
Нужно ещё проверять @error после отработки рекурсии:

_Test()
If @error Then MsgBox(0, "", "::: ERROR :::")

Func _Test()
$AnswTest = MsgBox(4, "TEST", "Test Passed?")
If $AnswTest = 7 Then ; NO (Test Failed)
$Answ = MsgBox(21, "Error", "Communication ERROR")
Select
Case $Answ = 4 ;Retry
_Test()
Return SetError(@error)
Case $Answ = 2 ;Cancel
;~ ConsoleWrite($Answ & @LF)
Return SetError(1)
EndSelect
EndIf
ConsoleWrite(@error & @LF)
ConsoleWrite("Test Passed" & @LF)
Return
EndFunc ;==>_Test

А вообще подобное циклами делается, на рекурсию есть ограничение:

_Test()
If @error Then MsgBox(0, "", "::: ERROR :::")

Func _Test()
While 1
$AnswTest = MsgBox(4, "TEST", "Test Passed?")

If $AnswTest = 7 Then ; NO (Test Failed)
$Answ = MsgBox(21, "Error", "Communication ERROR")

Switch $Answ
Case 4 ;Retry
ContinueLoop
Case 2 ;Cancel
Return SetError(1)
EndSwitch
EndIf

ExitLoop
WEnd

ConsoleWrite(@error & @LF)
ConsoleWrite("Test Passed" & @LF)
EndFunc ;==>_Test

Забавно что Jos дал (http://www.autoitscript.com/forum/index.php?s=&showtopic=87149&view=findpost&p=625250) почти такой же ответ, но у него способ без рекурсии попроще/покороче :).

SAOPP
05-01-2009, 13:35
Creat0R, а можно что бы после завершения своих действий, скрипт закрывался?

И ещё, можно ли сделать так, что бы скрипт кликал мышкой на кнопочку свернуть, поскольку текущие параметры не сворачивают SS в трей, он по прежнему ложится на панель задач, т.е. собственно, что я и пытаюсь решить :) Спасибо и ещё раз заранее благодарен.

shyra1976
05-01-2009, 13:38
Creat0R,
спасибо тебе ,и здоровья бычьего ,что бы мог дальше отвечат на наши вопроси

Creat0R
05-01-2009, 14:25
можно что бы после завершения своих действий, скрипт закрывался? »
Он закрывается, просто там ведь пауза стоит в 5 секунд ;)

можно ли сделать так, что бы скрипт кликал мышкой на кнопочку свернуть, поскольку текущие параметры не сворачивают SS в трей, он по прежнему ложится на панель задач »
Кликнуть можно по координатам кнопки сворачивания (в «AutoIt Info Tool» можно их посмотреть наведя курсор мышки на кнопку) с помощью MouseClick. Но это не надёжно :(.




© OSzone.net 2001-2012