Войти

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

bogomolv
18-08-2006, 19:17
ALL
Ну и как вам v3.2.0.1?
Пока самое сильное впечатление - это растолстевший втрое exe-шник.
Большинство новых функций уже имелись в бетах. Значит, весь "привес" - это COM object support?
По поводу последней новации. Знающие и неленивые, выкладывайте, плз, свои наработки с использованием COM object support. Особенно интересны сравнения: "Вот так приходилось делать раньше, а вот так - теперь!"
Кстати, что за инфа об изменении синтаксиса? Об этом говорится в анонсе, приведенном DenchikK. При изучении справки и changelog ничего подобного не заметил.

Dirk Diggler
19-08-2006, 00:04
А что такое COM object support и COM вообще? Дайте пару ссылок

ANGRO
19-08-2006, 00:23
Как вариант 288 пост

Creat0R
19-08-2006, 12:17
Dirk Diggler
CreatOR, как и положено тупизню, не пытался разобраться в механизме действия скрипта, потому и не понял, почему скрипт не работает
А вот это зря. Зачем так оскорблять? во-первых, я всё пытался, и ставить там нужно не %%, а просто вместо второй @ символ & или как указал bogomolov, ставить в начало скрипта Opt("ExpandVarStrings",1)...
И вообще, оно не работает по другим причинам, именно по тем, что файл который предназначен для поиска в нём, сам по себе в кодировке UTF, а как известно, командная строка плохо работает с этой кодировкой (при поиске кириллицы)...


bogomolv
Не могут они не работать!
Могут (может), и не работает! Проверьте кто-нить если не трудно - Файл пусть будет в кодировке Utf-8, а поиск должен производится по русскому слову...

---------------
У меня есть другой трабл, буду благодарен если кто-то сможет помочь:

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

;Берём ссылку из буффера обмена

$Clip = ClipGet()

;Пытаемся закачать файл по ссылке из буффера обмена
$InetGet = InetGet($Clip, "c:\file.zip", 1, 1)

;Показываем процесс закачки
While @InetGetActive

TrayTip("Закачиваю", "Байты = " & @InetGetBytesRead, 10, 1)
Sleep(250)

Wend

;Пытаемся проверить, закачался ли файл, но безуспешно :)
If Not FileExists("c:\file.zip") Then MsgBox(0, "error", "The Download is fail")

;Пытаемся другим способом, но он действует только если в буффере обмена не была ссылка, т.е если в буффера было что-то такое http://ссылка.zip, то ничего не происходит, а если типа такого - ссылка, то выдаёт ошибку
If $InetGet = 0 Then MsgBox(0, "error", "The Download is fail")

Неужели нету корректной проверки на то, закачался ли файл, или ещё лучше, правильная ли ссылка, т.е существует ли файл по ссылке?

XXXler
19-08-2006, 12:58
;Пытаемся проверить, закачался ли файл, но безуспешно :) If Not FileExists("c:\file.zip") Then MsgBox(0, "error", "The Download is fail")
у меня, как ни странно но работает (если не забвать после удачной скачки удалить файл)

;Пытаемся другим способом, но он действует только если в буффере обмена не была ссылка, т.е если в буффера было что-то такое http://ссылка.zip, то ничего не происходит, а если типа такого - ссылка, то выдаёт ошибку If $InetGet = 0 Then MsgBox(0, "error", "The Download is fail")
есть предположение, что если отсылать закачку в фон, тогда результата у функции не будет...

можно например сначала попытатся получить размер:

If InetGetSize($Clip)=0 Then
MsgBox(0, "error", "The Download is fail")
Exit ; или Return для использования в функции
EndIf

Creat0R
19-08-2006, 17:01
XXXler
есть предположение, что если отсылать закачку в фон, тогда результата у функции не будет...
Я пробвал ставить в дефолтное значение (вeзде ""), но таже история...

можно например сначала попытатся получить размер:

Не знаю почему, но в любом случае (если ссылка к примеру такая http://ссылка.rar), возвращается какое-то значение, а если ссылка не содержит расширения (.rar, .zip и т.д), то возвращается значение ноль и @error ровняется 1 - Но таким образом, не проверяется ссылка, т.к мне нужно именно проверка файла (.zip и .rar)...

Я пробовал так (без участия буффера обмена, думал в нём дело):

$Clip = "http://ссылка.zip"

$InetGet = InetGet($Clip, "c:\file.zip", 1, 1)
MsgBox(0, "error", $GetS)

$GetS = InetGetSize($Clip)
MsgBox(0, "error", $GetS)

В первом MsgBox, значение вывелось 1, во втором - 826

Когда я поменял немного ссылку (убрав расширение .zip):

$Clip = "http://ссылка"

$InetGet = InetGet($Clip, "c:\file.zip", 1, 1)
MsgBox(0, "error", $GetS)

$GetS = InetGetSize($Clip)
MsgBox(0, "error", $GetS)

То в обоих MsgBox'ах, вывелось значение 0... но если даже ссылка верна, то в первом меседже, также будет значение 1... т.е нет нормального способа, проверить существования файла по ссылке (или уровень ошибочности закачки файла).

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

Может всё же есть какой-то, пусть даже хитрый, но работающий способ?

Dirk Diggler
20-08-2006, 16:00
Как вариант 288 пост
Это Вы мне? А что там написано про COM? я не понял. :(

ANGRO
20-08-2006, 21:46
Очередной семпл, в дополнение к 301.
Пишу сюда чтоб сразу не утонул т.к. проявился интересный нюанс.
Размер структуры нужно выравнивать по 4 байтам. Уж не знаю везде или нет в приведённом примере точно.

Const $RASEDFLAG_PositionDlg = 0x00000001
Const $RASEDFLAG_NewEntry = 0x00000002
Const $RASEDFLAG_CloneEntry = 0x00000004
Const $RASEDFLAG_NoRename = 0x00000008
Const $RASEDFLAG_NewPhoneEntry = 0x00000010
Const $RASEDFLAG_NewTunnelEntry = 0x00000020
Const $RASEDFLAG_NewDirectEntry = 0x00000040
Const $RASEDFLAG_NewBroadbandEntry = 0x00000080
Const $RASEDFLAG_InternetEntry = 0x00000100
Const $RASEDFLAG_NAT = 0x00000200
Const $Name = "TEST1"; или 0
$a = DllStructCreate("dword;int;dword;int;int;char[257];dword;uint;uint")
; наполнение структуры
DllStructSetData($a,1,292);dwSize
DllStructSetData($a,2,0);hwndOwner
DllStructSetData($a,3,$RASEDFLAG_NewEntry);dwFlags
DllStructSetData($a,4,0);xDlg
DllStructSetData($a,5,0);yDlg
DllStructSetData($a,6,0);szEntry
DllStructSetData($a,7,0);dwError
DllStructSetData($a,8,0);reserved
DllStructSetData($a,9,0);reserved2
; Вызов Dialog DLL
$Dll_X = DllCall("Rasdlg.dll", "int", "RasEntryDlg", "str", 0, "str", $Name, "ptr", DllStructGetPtr($a))
MsgBox(48,"Error 2","Error: "&@error&" | "&"Size: "&DllStructGetSize($a))

sattva
21-08-2006, 15:14
Какой будет правильный синтаксис в скрипте AutoIT для добавления программы в Firewall Windows XP
Мой вариант не правильный: RunWait ( 'netsh firewall add allowedprogram' '@ProgramFilesDir & '\' & 'InterVideo\DVD7\WinDVD.exe WinDVD ENABLE' )

SciTE выдает ошибку (C:\Install\WinDVD 7.0.27.191\autoit-windvd7.au3(67,69) : ERROR: syntax error
RunWait ( 'netsh firewall add allowedprogram' '@ProgramFilesDir & ')

XXXler
21-08-2006, 17:05
RunWait ( 'netsh firewall add allowedprogram' '@ProgramFilesDir & '\' & 'InterVideo\DVD7\WinDVD.exe WinDVD ENABLE' )
RunWait('netsh firewall add allowedprogram ""'&@ProgramFilesDir&'\InterVideo\DVD7\WinDVD.exe"" WinDVD ENABLE')

sattva
21-08-2006, 17:22
XXXler

Спасиба!

ANGRO
21-08-2006, 20:08
А вот кстати как это будет на COM.
Особо не разбирался в возможностях просто транслировал пример из MSDN.
Не уверен что будет работать до WinXP_SP2, но стоит проверить.

;Firewall Adding an Application
;Set constants
Const $NET_FW_PROFILE_DOMAIN = 0
Const $NET_FW_PROFILE_STANDARD = 1
;Scope
Const $NET_FW_SCOPE_ALL = 0
;IP Version – ANY is the only allowable setting for now
Const $NET_FW_IP_VERSION_ANY = 2

;Create the firewall manager object.
$ObjfwMgr = ObjCreate("HNetCfg.FwMgr")
;Get the current profile for the local firewall policy.
$Profile = $ObjfwMgr.LocalPolicy.CurrentProfile

$App = ObjCreate("HNetCfg.FwAuthorizedApplication")
$App.ProcessImageFileName = @ProgramFilesDir&"\PowerDVD\PowerDVD.exe" ;Путь
$App.Name = "PowerDVD" ;Имя как будет значиться в списке исключений
;Use either Scope or RemoteAddresses, but not both !!!!!! (Если не понятно лучше не трогать)
$App.Scope = $NET_FW_SCOPE_ALL
;$App.RemoteAddresses = "*"
$App.IpVersion = $NET_FW_IP_VERSION_ANY
$App.Enabled = TRUE ; TRUE - Галочка стоит, FALSE - Галочка снята
$Profile.AuthorizedApplications.Add($App)

sattva
22-08-2006, 00:21
Рабочий вариант:

Select
Case @OSVersion='WIN_XP' and @OSServicePack='Service Pack 2'
RunWait('netsh firewall add allowedprogram program="'&@ProgramFilesDir&'\InterVideo\DVD7\WinDVD.exe" name=WinDVD7 profile=ALL mode=ENABLE ','',@SW_HIDE )
Case @OSVersion='WIN_2003' and @OSServicePack='Service Pack 1'
RunWait('netsh firewall add allowedprogram program="'&@ProgramFilesDir&'\InterVideo\DVD7\WinDVD.exe" name=WinDVD7 profile=ALL mode=ENABLE ','',@SW_HIDE )
EndSelect

bodro
22-08-2006, 11:01
Нужен скрипт который бы сканировал текущий каталог и выводил в результате все подпапки, вот что у меня вышло
;--------------------------------------Start Dir----------------------------------------
$searchdir = (@ScriptDir & "\")
$search = FileFindFirstFile($searchdir & "*")
$dirtot = 0
$i1 = 0

While 1
If $search = -1 Then ExitLoop
$file = FileFindNextFile($search)
If @error Then ExitLoop


$fs1 = StringReplace($file, ".", "-")
if @extended = 0 Then
$i1 = $i1 + 1
Assign ( "dirA" & $i1 , $searchdir & $file , 2)
$dirtot = $dirtot + 1
Assign ( "dirtot" & $dirtot , $searchdir & $file , 2)
EndIf
WEnd
FileClose($search)
;---------------------------------------------------------------------------------------



$is = $i1
$i1 = 0
For $i = 1 TO $is


$var = Eval( "dirA" & $i)
$searchdir = ( $var & "\")


$search = FileFindFirstFile($searchdir & "*")

While 1
If $search = -1 Then ExitLoop
$file = FileFindNextFile($search)
If @error Then ExitLoop


$fs1 = StringReplace($file, ".", "-")
if @extended = 0 Then
$i1 = $i1 + 1
Assign ( "dirB" & $i1 , $searchdir & $file , 2)
$dirtot = $dirtot + 1
Assign ( "dirtot" & $dirtot , $searchdir & $file , 2)
EndIf
WEnd
FileClose($search)


Next

;---------------------------------------------------------------------------------------


$is = $i1
$i1 = 0
For $i = 1 TO $is


$var = Eval( "dirB" & $i)
$searchdir = ( $var & "\")


$search = FileFindFirstFile($searchdir & "*")

While 1
If $search = -1 Then ExitLoop
$file = FileFindNextFile($search)
If @error Then ExitLoop


$fs1 = StringReplace($file, ".", "-")
if @extended = 0 Then
$i1 = $i1 + 1
Assign ( "dirC" & $i1 , $searchdir & $file , 2)
$dirtot = $dirtot + 1
Assign ( "dirtot" & $dirtot , $searchdir & $file , 2)
EndIf
WEnd
FileClose($search)


Next

;---------------------------------------------------------------------------------------

$is = $i1
$i1 = 0
For $i = 1 TO $is


$var = Eval( "dirC" & $i)
$searchdir = ( $var & "\")


$search = FileFindFirstFile($searchdir & "*")

While 1
If $search = -1 Then ExitLoop
$file = FileFindNextFile($search)
If @error Then ExitLoop


$fs1 = StringReplace($file, ".", "-")
if @extended = 0 Then
$i1 = $i1 + 1
Assign ( "dirD" & $i1 , $searchdir & $file , 2)
$dirtot = $dirtot + 1
Assign ( "dirtot" & $dirtot , $searchdir & $file , 2)
EndIf
WEnd
FileClose($search)


Next






$swar = ("")
$i1 = 0
For $i = 1 TO $dirtot

$var = Eval( "dirtot" & $i)
$swar = ($swar & $var & "; ")
Next
FileWrite("test.txt", $swar)
Как его можно оптимизировать чтобы он сканировал все папки независимо от уровня вложений?

amel27
22-08-2006, 12:57
bodro
интересно чем не устраивает DIR?
DIR /AD /S /B >test.txtхотя можно и AutoIT-ом, что-нибудь типа:
$root="C:"
DirList ($root,"test.txt")

Func DirList ($root,$file)
$search = FileFindFirstFile($root & "\*.*")
While 1
$dir = FileFindNextFile($search)
If @error Then ExitLoop
$dir =$root & "\" & $dir
If FileExists($dir & "\") Then
FileWriteLine($file,$dir)
DirList ($dir,$file)
EndIf
WEnd
FileClose($search)
Return 0
EndFunc

Dirk Diggler
22-08-2006, 13:09
конечно, синтаксическая ошибка. внимательнее надо быть, у Вас апостроф вместо & .

XXXler
22-08-2006, 13:12
;~ Функция вывода структуры каталогов
Func ParceDir($Path)
Local $Pathes[2],$i,$Folders,$Str
$Pathes[0]=1
$Pathes[1]=$Path
While $i<$Pathes[0]
$i=$i+1
$Folders=FileFindFirstFile($Pathes[$i]&"\*")
If $Folders=-1 Then ContinueLoop
While 1
$Str=FileFindNextFile($Folders)
If @error Then ExitLoop
If $Str="." Or $Str=".." Then ContinueLoop
$Str=$Pathes[$i]&"\"&$Str
If StringInStr(FileGetAttrib($Str),"D")<>0 Then
$Pathes[0]=$Pathes[0]+1
ReDim $Pathes[$Pathes[0]+1]
$Pathes[$Pathes[0]]=$Str
EndIf
WEnd
FileClose($Folders)
Wend
Return $Pathes
EndFunc

Вызывается с полным путем к каталогу, возвращает одномерный массив, где [0] - количество каталогов, [x] - полный путь к каталогу
Есть минус - каталоги в массиве идут по вложенности (сначала верхний уровень, потом вложенные папки), да и быстродействие хромает...

bodro
22-08-2006, 19:15
спасибо DIR /AD /S /B >test.txt меня полностью удовлетворил :)

Creat0R
24-08-2006, 00:15
Такой вопрос - Как можно корректно, закрыть определённую программу (не убивать её процесс, а именно нормально закрыть). Эту программу не получается уловить через WinWaitActive, она находится в трее, а как из трея вызывать окно, я не знаю.

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

Ivan1986
24-08-2006, 00:32
А ProcessClose разве его не корректно завершеает?
Кстати не нашел там ProcessKill

По поводу винампа попробуй
AutoItSetOption("WinTitleMatchMode", 4)
WinClose("classname=Winamp v1.x", "")




© OSzone.net 2001-2012