Войти

Показать полную графическую версию : [Архив - Часть 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
15-08-2006, 13:35
Creat0R
И для обычного файла решение предоставляли заранее.
Это решение я взял из справки по Dos и прикрутил к AutoIt:
If RunWait('@ComSpec@ /C find "Pacific Rim" < trade.txt','',0)=0 Then
...
EndIf
Ксати, ini-файл ничем не отличается от обычного файла, и в нем можно искать текст таким же способом.

Sanja Alone, привет!
Ты быстрее набираешь тексты! А я - короче! :)

amel27
15-08-2006, 18:54
bogomolv

Строго говоря, оба варианта находят не слова, а заданные последовательности символов. Например, при поиске слова "кот" мы найдем и "котлету", и "антрекот" и много еще чего... В AutoIt явно не хватает поддержки регулярных выражений, в качестве альтернативы можно использовать FINDSTR. Например, следующий скрипт ищет все вхождения слова BASIC:
If RunWait('@ComSpec@ /C findstr /I "\<baSic\>" lang.txt','',0)=0 Then
...
EndIf
Ложка дегтя - судя по всему FINDSTR распознает только слова из английских букв, остальные для него лишь набор символов.

XXXler
15-08-2006, 19:33
Строго говоря, оба варианта находят не слова, а заданные последовательности символов. Например, при поиске слова "кот" мы найдем и "котлету", и "антрекот" и много еще чего...
что мешает искать в строке вхождение не "кот" а " кот ", т.е. с пробелами с обоих сторон?

Creat0R
15-08-2006, 22:04
Sanja Alone, amel27, XXXler:
Во-первых, большое спасибо за помощь.
Пример который привёл Sanja Alone, выводит ошибку (в MsgBox), также пример от bogomolv, выводит ошибку о том, что не возможно найти файл (хотя он наместе)...

Но не в этом суть, я в результате использовал пример от Sanja Alone, но немного модифицировал его, т.к этот пример не искал кириллицу (для этого добавил перекодировку строк)... но есть другая проблема - если я пытаюсь указать строчку для поиска, не прямым способом, а через переменную ($Text), то поиск не осуществляется, и постоянно возвращается $Var = @error :

;Файл в котором будет произведён поиск
$InputFile = @ScriptDir& "\MyFile.txt"

;Текст для поиска
$Text = IniRead(@ScriptDir& "\Test.ini", "Section", "Parametr", "")

;Использование функции для перекодировки строчек в UTF
$TxtToFindUTF = StringToUTF($Text)

$var = _FindTextInFile($InputFile,$TxtToFindUTF)

;Проверка на существование искомого текста, и если существует, то выводим сообщение об этом
If $var <> @error Then
MsgBox(64,"","Текст <" & $Text & "> Был найден в файле <" & $InputFile & ">, и находится в линии под номером <" & $var[0] & ">")

;Если не существует, то выводим сообщение об ошибке
Else

MsgBox(48,"","Текст <" & $Text & "> Не Был найден в файле <" & $InputFile & ">" & @CRLF & "Или файл <" & $InputFile & "> не найден")

EndIf
Exit

;Начало функции для поиска текста
Func _FindTextInFile($ifile,$text)
Local $i
Dim $ret[2]
$file = FileOpen($ifile,0)
$a = StringSplit( FileRead($file, FileGetSize($ifile)), @LF)
FileClose($file)

If StringIsASCII($text) Then
For $i = 1 To UBound($a,1)-1
If StringInStr($a[$i],$text) Then
$ret[0]=$i
$ret[1]=$a[$i]
Return $ret
EndIf
Next
Else
For $i = 1 To UBound($a,1)-1
If StringInStr(StringLower($a[$i]),StringLower($text)) Then
$ret[0]=$i
$ret[1]=$a[$i]
Return $ret
EndIf
Next
EndIf
EndFunc ;--> Конец функции для поиска текста (_FindTextInFile)

;Начало функции для перекодировки строк в UTF
Func StringToUTF($String)
Dim $sResult = ""
$VarUTFArr = StringSplit($String, "")

For $i = 1 To $VarUTFArr[0]
$code = Asc($VarUTFArr[$i])

Select
Case $code >= 192 And $code <= 239
$VarUTFArr[$i] = Chr(208) & Chr($code - 48)
Case $code >= 240 And $code <= 255
$VarUTFArr[$i] = Chr(209) & Chr($code - 112)
Case $code = 168
$VarUTFArr[$i] = Chr(208) & Chr(129)
Case $code = 184
$VarUTFArr[$i] = Chr(209) & Chr(145)
Case Else
$VarUTFArr[$i] = Chr($code)
EndSelect

$sResult = $sResult & $VarUTFArr[$i]
Next

Return $sResult
EndFunc ;==> Конец функции для перекодировки строк в UTF (StringToUTF)


Если в файле Test.ini, в секции [Section], у параметра Parametr, будет значение предназначенное для того самого поиска (т.е само искомое слово), то запустив этот скрипт, в любом случае $Var будет ровнятся @error, т.е текст указанный в ини файле, искаться не будет, а именно так мне нужно осуществить поиск.

И ещё раз спасибо, буду благодарен если сможете и в этом помочь.

bogomolv
15-08-2006, 22:17
Creat0R
выводит ошибку о том, что не возможно найти файл (хотя он наместе)...
На каком месте? Именно это и укажи.
Например:
If RunWait('@ComSpec@ /C find "Pacific Rim" < C:\DOS\trade.txt','',0)=0 Then
...
EndIf
И не забудь прописать в начале скрипта
Opt('ExpandVarStrings', 1); default = 0

Creat0R
16-08-2006, 00:16
bogomolv

Вот так выглядит у меня состав скрипта:

Opt("ExpandVarStrings", 1)
If RunWait('@ComSpec@ /C find "word" < C:\Test.txt','',0)=0 Then

MsgBox(64,"","Текст Был найден")

EndIf

На диске С:\, у меня лежит файл Test.txt, а в этом файле, среди прочего текста, есть строка содержащая слово Word - и после запуска этого скрипта, ничего не происходит, а если бы слово было найдено, то вывелось бы сообщение: "Текст Был найден".

Вот как можно заставить такой вариант сработать, но это тоже только для латиницы:

If RunWait(@ComSpec & " /C find /i /c ""Word"" ""C:\Test.txt"" | find /c "": 0"" > f.tmp","",0)<>0 Then
FileDelete("f.tmp")
MsgBox(64,"","Текст Был найден")

EndIf

Можно конечно и легче написать этот код, но не в этом суть.

ANGRO
16-08-2006, 00:30
Дополнил код по сетевым интерфейсам.
Не могу понять почему не получается обновить информацию по состоянию интерфейса после включения / выключения.
Мож кто подскажит.

#include <GUIConstants.au3>
#include <GuiCombo.au3>
#NoTrayIcon
Dim $i=1
Dim $NetArr[$i+1][6]
$objShare = ObjCreate("HNetCfg.HNetShare.1")
$shellApp = ObjCreate("Shell.Application")
; GUI ------------------------------------------------------
$Form1 = GUICreate("Сетевые подключения", 350, 198)
GuiSetIcon("netshell.dll", 100)
$Combo1 = GUICtrlCreateCombo("Подключения", 16, 16, 320, 21)
$Button1 = GUICtrlCreateButton("Вкл / Выкл", 100, 145, 150, 35)
$Label1 = GUICtrlCreateLabel("Выберите подключение", 16, 48, 320, 81, $BS_PUSHLIKE)
Data($NetArr, $objShare)
For $n = 1 To $NetArr[0][0]
GUICtrlSetData($Combo1,$NetArr[$n][1])
Next
GUISetState(@SW_SHOW)
While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $Combo1
$n = _GUICtrlComboGetCurSel($Combo1)
If $n > 0 Then
Output($n)
Else
GUICtrlSetData($Label1, "Выберите подключение")
EndIf
Case $msg = $Button1
$oNetConnections = $shellApp.Namespace(0x00000031)
For $folderitem in $oNetConnections.items
For $verb in $folderitem.verbs
if $folderitem.name = $NetArr[$n][1] Then
$verb.DoIt
Sleep(1000)
ExitLoop 2
EndIf
Next
Next
If $folderitem.name <> $NetArr[$n][1] Then msgbox(48, "Ошибка", "Имя соединения указанно не правильно")
GUICtrlSetData($Label1,"Ждите")
Output($n)
EndSelect
WEnd
Exit
; Func -------------------------------------------------------
Func Data(ByRef $NetArr, $objShare)
If $objShare = 0 Then
MsgBox(48, "Внимание", "Сетевых подключений не найдено", 5)
Exit
EndIf
$objEveryColl = $objShare.EnumEveryConnection
If $objEveryColl <> 0 Then
For $objNetConn In $objEveryColl
$objShareCfg = $objShare.INetSharingConfigurationForINetConnection($objNetConn)
If $objShareCfg <> 0 Then
$objNCProps = $objShare.NetConnectionProps($objNetConn)
If $objNCProps <> 0 Then
ReDim $NetArr[$i+1][6]
Select
Case $objNCProps.Status = 0
$Status = "The connection is disconnected."
Case $objNCProps.Status = 1
$Status = "The connection is in the process of connecting."
Case $objNCProps.Status = 2
$Status = "The connection is in a connected state."
Case $objNCProps.Status = 3
$Status = "The connection is in the process of disconnecting."
Case $objNCProps.Status = 4
$Status = "The hardware for the connection, for example network interface card (NIC), is not present."
Case $objNCProps.Status = 5
$Status = "The hardware for the connection is present, but is not enabled."
Case $objNCProps.Status = 6
$Status = "A malfunction has occurred in the hardware for the connection."
Case $objNCProps.Status = 7
$Status = "The media, for example the network cable, is disconnected."
Case $objNCProps.Status = 8
$Status = "The connection is waiting for authentication to occur."
Case $objNCProps.Status = 9
$Status = "Authentication has succeeded on this connection."
Case $objNCProps.Status = 10
$Status = "Authentication has failed on this connection."
Case $objNCProps.Status = 11
$Status = "The address is invalid."
Case $objNCProps.Status = 12
$Status = "Security credentials are required."
EndSelect
Select
Case $objNCProps.MediaType = 0
$MediaType = "No media is present."
Case $objNCProps.MediaType = 1
$MediaType = "Direct serial connection through a serial port."
Case $objNCProps.MediaType = 2
$MediaType = "Connection is through an integrated services digital network (ISDN) line."
Case $objNCProps.MediaType = 3
$MediaType = "Connection is to a local area network (LAN)."
Case $objNCProps.MediaType = 4
$MediaType = "Dial-up connection over a conventional phone line."
Case $objNCProps.MediaType = 5
$MediaType = "Virtual private network (VPN) connection."
Case $objNCProps.MediaType = 6
$MediaType = "Point-to-Point protocol (PPP) over Ethernet."
Case $objNCProps.MediaType = 7
$MediaType = "Bridged connection."
Case $objNCProps.MediaType = 8
$MediaType = "Shared connection to a LAN."
Case $objNCProps.MediaType = 9
$MediaType = "Shared connection to a remote or wide area network (WAN)."
EndSelect
$NetArr[$i][1] = $objNCProps.Name
$NetArr[$i][2] = $objNCProps.Guid
$NetArr[$i][3] = $objNCProps.DeviceName
$NetArr[$i][4] = $Status
$NetArr[$i][5] = $MediaType
$NetArr[0][0] = $i ; Общее кол-во
$i = $i + 1
EndIf
EndIf
Next
EndIf
Return $NetArr
EndFunc
Func Output($n)
GUICtrlSetData($Label1, _
"- Name: " & $NetArr[$n][1] & @CRLF & _
"- Device Name: " & $NetArr[$n][3] & @CRLF & _
"- Status: " & $NetArr[$n][4] & @CRLF & _
"- Media Type: " & $NetArr[$n][5] & @CRLF)
;"- Guid: " & $NetArr[$n][2]
EndFunc

bogomolv
16-08-2006, 01:05
Creat0R

У тебя потрясающее умение делать ошибки там, где их сделать невозможно!
В своих примерах ты в первом случае искал слово "word", а во втором - слово "Word". Естественно, что результаты были разными.

Проблема русского языка и DOS поднималась здесь не раз.
Один из вариантов:
If RunWait('@ComSpec@ /C chcp 1251 | find "Ворд" < C:\Test.txt','',0)=0 Then MsgBox(64,"","Текст Был найден")

Creat0R
16-08-2006, 01:44
bogomolv
У тебя потрясающее умение делать ошибки там, где их сделать невозможно!
Я знаю :)

В своих примерах ты в первом случае искал слово "word", а во втором - слово "Word". Естественно, что результаты были разными.
Если быть точным, то я искал совсем другое слово, а Word привёл в пример, и тот факт что первая буква большая, не играет роли, это тольку тут я написал так.

Один из вариантов:
И он не работает, слово есть, а он не выводит ничего, и поверь, я перебробовал множество вариантов (с большими буквами, с мелкими, писал даже слово в самое начало файла с пробелом после него, но ничего не сработало). Я даже без аутоита пробовал сделать (через батник), но командной строкой заставить делать поиск по рускому тексту, думаю не всегда возможно (кодировка файла, кодировка текста и т.д).

amel27
16-08-2006, 02:29
XXXler
что мешает искать в строке вхождение не "кот" а " кот ", т.е. с пробелами с обоих сторон?
Тогда придется еще учесть все знаки препинания, а также расположение слова в начале и конце строки

Creat0R
16-08-2006, 03:48
С поиском я разобрался, Всем спасибо, пример от Sanja Alone оказался верным, просто нужно учитывать, что поиск включая табы (когда нажимаем Tab), не даёт результатов, и слова для поиска, не должны содержать такие пробелы (Tab)...

Теперь у меня немного другой вопрос - как можно записать текст, в определённую строку файла, но не именно в указанную строку (номер строки), а в заданную строку плюс 4 строки? т.е к примеру, нужно в файл Test.txt, в 12-тую строку+4 (т.е получается как бы в 16-тую, но число строки мне заранее не известно, оно будет браться из возвращённого значения - $Var[0]), записать например такой текст - Hello world! -Возможно такое осуществить?

Кстати, хотел узнать, в чём разница между FileWrite и FileWriteLine? вроде они одинаково работают, я пологал, что FileWriteLine, как раз-то и поможет мне в прописовании текста в определённую строку файла, а оказалось, эта функция вовсе этого не умеет :( .

lakis
16-08-2006, 07:15
Есть у кого нибудь скрипт на MsOffice 2003 rus?

bogomolv
16-08-2006, 08:33
Creat0R
И он не работает
Не могут они не работать! Опять демонстрируешь свои потрясающие умения? :)

ANGRO
16-08-2006, 23:47
lakis
Есть у кого нибудь скрипт на MsOffice 2003 rus?
А здесь (http://oszone.net/2773) смотреть не пробовал.

Dirk Diggler
17-08-2006, 09:56
Не могут они не работать!
Вы по привычке там переменную окружения заключаете не в %%, а в @@. И уже не в первый раз. CreatOR, как и положено тупизню, не пытался разобраться в механизме действия скрипта, потому и не понял, почему скрипт не работает

Dark Engel
17-08-2006, 13:27
Господа. Никто не подскажет как запустить файл.hta
Я делал так

run ("mshta.exe /имя файла.hta")

mshta.exe в прцессах появляется но ничего не открывает. Плиз хелп.

DmitryOlenin
17-08-2006, 14:09
Dark Engel
Смоти соседнюю тему ;) Просто start /wait wpi.hta и все...

Sanja Alone
17-08-2006, 20:36
Dark Engel
Никто не подскажет как запустить файл.htaНужно указать ПОЛНЫЙ путь к файлу:
run ("mshta путь\имя файла.hta")Если файл находится рядом со скриптом, строка запуска будет выглядеть так:run ("mshta " & @ScriptDir & "\имя файла.hta")

DenchikK
18-08-2006, 03:51
AutoIt 3.2
Новая версия программы, предназначенной для автоматизации часто выполняемых действий в ОС Windows. Утилита позволяет повторять нажатия клавиш клавиатуры, перемещение и клики мышкой, манипуляции с окнами приложений, работу с буфером обмена и другие действия пользователя. Например, с помощью этой программы можно производить установку однотипных приложений. Для выполнения автоматических действий AutoIt создает текстовый сценарий, который использует функции и операторы VBScript и BASIC, а также некоторых других языков программирования. После создания программой специального управляющего скрипта, его можно скомпилировать в исполняемый файл, который будет работать в любой операционной системе семейства Windows. В новой версии изменен синтаксис написания скрипта, добавлены новые способы взаимодействия с ОС, улучшена совместимость с различными языковыми версиями Windows.
ОС: Windows 95/98/Me/NT/2000/XP/2003 | Англ. интерфейс | Бесплатно.
Скачать | download AutoIt 3.2 >> (2891 кб)
http://www.autoitscript.com/files/autoit3/autoit-v3-setup.exe

ANGRO
18-08-2006, 15:17
А вот очередной семпл cделанный на последней стабильной версии.

Const $RASPBDFLAG_PositionDlg = 0x00000001 ;+ xDlg и yDlg
Const $RASPBDFLAG_ForceCloseOnDial = 0x00000002
Const $RASPBDFLAG_NoUser = 0x00000010
Const $RASPBDFLAG_UpdateDefaults = 0x80000000
;RASPBDLG
$a = DllStructCreate("dword;int;dword;int;int;uint;ptr;dword;uint;uint")
; наполнение структуры
DllStructSetData($a,1,DllStructGetSize($a));dwSize
DllStructSetData($a,2,0);hwndOwner
DllStructSetData($a,3,$RASPBDFLAG_UpdateDefaults);dwFlags
DllStructSetData($a,4,100);xDlg
DllStructSetData($a,5,100);yDlg
DllStructSetData($a,6,0);dwCallbackId
DllStructSetData($a,7,0);pCallback
DllStructSetData($a,8,0);dwError
DllStructSetData($a,9,0);reserved
DllStructSetData($a,10,0);reserved2
; Вызов DLL
$Dll1 = DllCall("Rasdlg.dll", "int", "RasPhonebookDlg", "str", 0, "str", 0, "ptr", DllStructGetPtr($a))

MsgBox(48, "Error", "Error: " & @error & " | " & "Error RASPBDLG: " & DllStructGetData($a,8))




© OSzone.net 2001-2012