Показать полную графическую версию : [Архив - Часть 1.2] AutoIt скрипты
Creat0R
и если этот файл будет в кодировке UTF-8, то в MsgBox выведутся каракули, как можно это исправить?вариант реализации функции преобразования кодировок и пример использования:
$file = "test.txt"
$foo = FileOpen($file, 4) ; 4 - RAW-режим!
$text = _Utf8ToAnsi(FileRead($foo,FileGetSize($file)))
MsgBox(0,"Test",$text)
FileClose ($foo)
; Пример преобразования UTF-8 в ANSI
; другие варианты кодировок:
; 0 - ANSI
; 1 - OEM
; 2 - MAC
; 42 - Symbol
; 65000 - UTF-7
; 65001 - UTF-8
Func _Utf8ToAnsi($utf8String)
Return _Uni2Any(_Any2Uni($utf8String, 65001),0)
EndFunc
; Преобразование символьной строки заданной кодировки в юникод
Func _Any2Uni($anyString, $codePage)
Local $bufSize = StringLen($anyString) * 2
Local $buf = DllStructCreate("byte[" & $bufSize & "]")
Local $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
"int", $codePage, _
"int", 0, _
"str", $anyString, _
"int", StringLen($anyString), _
"ptr", DllStructGetPtr($buf), _
"int", $bufSize)
Local $uniString = StringLeft(DllStructGetData($buf, 1), $ret[0] * 2)
$buf = 0
Return $uniString
EndFunc
; Преобразование юникода в символьную строку заданной кодировки
Func _Uni2Any($uniString, $codePage)
Local $uniStringLen = StringLen($uniString)
Local $bufLen = $uniStringLen * 2
Local $in = DllStructCreate("byte[" & $bufLen & "]")
Local $out= DllStructCreate("char[" & $bufLen & "]")
DllStructSetData($in, 1, $uniString)
Local $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", $codePage, _
"int", 0, _
"ptr", DllStructGetPtr($in), _
"int", $uniStringLen / 2, _
"ptr", DllStructGetPtr($out), _
"int", $bufLen, _
"int", 0, _
"int", 0)
Local $anyString = DllStructGetData($out, 1)
$out= 0
$in = 0
Return $anyString
EndFunc
Dirk Diggler
11-09-2006, 14:34
Кстати, а что с поддержкой юникода(UTF-8) в autoit? Оч. хотелось бы сделать gui-оболочку для редактирования файлов с иероглифами. Возможно?
amel27
вариант реализации функции преобразования кодировок и пример использования
Примного благодарен! спас меня от многих мучении и разного рода батниковых выкрутасов! :)
prokazzza
12-09-2006, 09:34
Sanja Alone
Ты меня совсем не понял. Извини если я тя чем то задел. Мне не нужен Office (мне его и на работе хватает) я хотел показать тебе экран перезагрузки, я пользуюсь пользуюсь прогой Symantec Ghost AI Snapshot мне так более удобно сделал все настройки сохранил как с Atnotes и все Winamp, Nero устанавливаются за 2-3 секунды, со всеми ярлыками какие нужны, с настройками. Тока один недостаток просит перезагрузку понимаешь как это неудобно в режиме GuiRunOnce после каждой проги появляется экран перезагрузки - Nero перезагрузка, Promt перезагрузка ну и т.д. Постоянно приходится нажимать нет, нет.....
Практически у любого приложения есть ключи/параметры файла ответов и т.п
Облазил практически весь нет нигде даже в родной справке нет даже заиканий о ключиках для этой проги.
Насчет AutoIt, мне он не нужен в дальнейшем, вот как ты думаешь скока часов уйдет на то чтобы я овладел какимитами понятиями о действиях этой проги, для того чтобы поставить одну!!! единственную команду на отмену перезагрузки.
Sanja Alone
13-09-2006, 08:20
prokazzza
я хотел показать тебе экран перезагрузкиЗдесь нужны свойства этого экрана, а не он сам. Вот я тебе и твержу уже третий раз об AutoIt Window Info. Нужно при появлении экрана, тьфу ты... ОКНА перезагрузки запустить AutoIt Window Info, ткнуть мышью на окно, подвести указатель мыши к кнопочке "No" (но не нажимать на нее!), нажать CTRL + ALT + F (для фиксации сведений в AutoIt Window Info), снять скриншоты полного содержимого окна AutoIt Window Info, затем выложить снимки 2-3 таких окошек (от разных приложений), например, на imageshack (http://imageshack.us), и только после этого можно будет предложить конкретные способы автоматического закрытия данных окон. Надеюсь, что теперь я все понятно описал...
пользуюсь прогой Symantec Ghost AI SnapshotЯ не знаю особенностей работы данного приложения. Насколько я понял, все отслеженные настройки и измененные файлы оно пихает в файл INSTALL.exe, запуск к-рого все это дело и восстанавливает. Возможно, в настройках самого Symantec Ghost AI Snapshot есть какой-то пункт отмены вывода окна перезагрузки, т.к. это окно не имеет ни малейшего отношения ни к Office 2003, ни к Atnotes.
единственную команду на отмену перезагрузкиЕсть такая команда (shutdown -a), но в данном контексте она бесполезна :)
Здравствуйте.
Кто-нибудь знает, как в AutoIt реализована функция ProcessList?
Используется ли там DLLCall("psapi.dll"...) или DLLCall("kernel32.dll"...)
Заранее благодарен.
AxelM
однако PSAPI.DLL, хотя конечно не DLLCall :)
Есть два тревожующих вопроса:
1) Нужно запустить мелодию (точнее звук в 5 секунд), и чтобы она постоянно запускалась в цикле. Т.е пока скрипт запущен, чтобы один и тот-же файл играл по кругу (если закончилась мелодия, то чтобы началась по новой играть). Если нужно было бы только это, то можно обойтись так:
While 1
SoundPlay("File.wav", 1)
Wend
Но мне нужно запустить мелодию (в круговом режиме), и чтобы в это время скрипт делал что-то другое - Т.е чтобы была (или уже есть?) какая-то функция, которую можно было бы использовать примерно так:
Function("File.wav", 1) ; Ноль если нужно просто один раз проиграть, а единица (1) для повторного проигрывания.
.........
;тут будет что-то делаться во время того как играет мелодия
Возможно такое осуществить?
2) Мне нужно отнять от формата времени, определённое количество минут (до 60-ти), и нужно чтобы не просто отнимались числа от минут, а чтобы именно происходил подсчёт оставшегося времени (уитывая часы).
Допустим, есть данное время 22:07:01 - И отняв от этого времени, допустим 8 минут, нужно чтобы получился такой результат - 21:59:01...
Если речь идёт только о минутах (т.е без подсчёта часов), то я могу сделать это так:
$Time = "22:07:01"
$CleanSec = StringTrimRight($Time, 3)
$CleanHour = StringTrimLeft($CleanSec, 3)
If StringLeft($CleanHour, 1) = "0" Then
$Minutes = StringLeft($CleanHour, 1)
Else
$Minutes = $CleanHour
EndIf
$Result = $Minutes - 8
If $Result < 0 Then
$Minutes = (60 - 8) + $Minutes
ElseIf StringLeft($CleanHour, 1) = "0" Then
$Minutes = "0" & $Minutes
EndIf
$TimeResult = StringLeft($Time, 3) & $Minutes & StringRight($Time, 3)
В результате, переменной $TimeResult присваивается значение равное времени, у которого отняли 8 минут (22:59:01), но в данном примере не учитывается изминения часов... я конечно же мог продолжить, и выявить всевозможные варианты и условия при которых достичь смену часов в соответствии смены минут, но это заняло бы слишком много времени, и наверное немало строк (при том как я бы их изложил), и тем более, что у меня возня с матиматикой, вызывает серъёзное головокружение :wacko: - Может кто-то плиз помочь разобраться с этим? - Задача вроде и не сложная, но я никак не приложу к этому ума.
1, Можно через вызов внешнего (скомпилированного) скрипта:
Func Function ($file, $play)
Local $pid=0
If $play Then $pid = Run ("Au3Sound.Exe", @ScriptDir, @SW_HIDE)
...
If $pid Then ProcessClose ($pid)
EndFunc
где Au3Sound.Exe:
While 1
SoundPlay("File.wav", 1)
Wend2. Например так:
$Time = "22:07:01"
$Mins = 8
Dim $TMS0 = StringSplit ($Time,":")
Dim $TMS1 = $TMS0
$Mins = Mod (24*60 + $TMS0[1]*60 + $TMS0[2] - $Mins, 24*60)
$TMS1[2] = Mod ($Mins, 60)
$TMS1[1] = ($Mins - $TMS1[2])/60
$TimeResult = $TMS1[1] & ":" & $TMS1[2] & ":" & $TMS1[3]
amel27
Можно через вызов внешнего (скомпилированного) скрипта:
Дело в том, что мне нужно именно в том же скрипте...
Пример который ты привёл, а точнее фраза которую я процетировал, навела меня на идею, которая решает эту проблему.
Вместо того, чтобы запускать ещё один скрипт, можно запустить этот-же скрипт, но с параметром ком. строки, а запуск мелодии в цикле, поставить под условие - т.е если скрипт запущен с ключём, то запустить цыкл с проигрыванием мелодии:
#NoTrayIcon
Dim $SoundText, $Flag = 64
Select
Case $CmdLine[0] = 0
$Ask = MsgBox(36, "question", "Play the sound?")
If $Ask = 6 Then
Run(@AutoItExe & " """ & @ScriptFullPath & """ /ps")
$SoundText = ", exit the script and stop the sound?"
$Flag = 36
EndIf
$Else = MsgBox($Flag, "else", "I am somthing else" & $SoundText)
If $Else = 6 Then
Send("^!s")
Exit
ElseIf $SoundText <> "" Then
MsgBox(64, "close msg", "for stop the sound, hold down thees hotkeys:" & @CR & "CTRL+ALT+S")
EndIf
Case $CmdLine[1] = "/ps"
HotKeySet("^!s", "ExitScript")
While 1
SoundPlay (@WindowsDir & "\media\tada.wav", 1)
Wend
EndSelect
Func ExitScript()
Exit 0
EndFunc
Там где выделенный текст, это позволяет запустить не закомпелированный скрипт с ком. строкой, для того чтобы вызвать этот-же закомпелированный скрипт с ком. срокой, нужно поменять выделенный код на это - Run(@ScriptFullPath & " /ps")
Например так:
Большое спасибо! -Правда в некоторых случаях, у минут и у часов будет нехватать нуля (0) :blush2: . Например, если время будет такое: - 01:10:43, то отняв от него 8, результат мы получмим такой - 1:2:43. Поэтому я немного модифицыровал скрипт, и добавил определение для часов и минут на отсутствие нулей (см. выделенный текс в коде):
$Time = 01:10:43
$Mins = 8
Dim $TMS0 = StringSplit ($Time,":")
Dim $TMS1 = $TMS0
$Mins = Mod (24*60 + $TMS0[1]*60 + $TMS0[2] - $Mins, 24*60)
$TMS1[2] = Mod ($Mins, 60)
$TMS1[1] = ($Mins - $TMS1[2])/60
Switch $TMS1[1]
Case 0 to 9
$TMS1[1] = "0" & $TMS1[1]
EndSwitch
Switch $TMS1[2]
Case 0 to 9
$TMS1[2] = "0" & $TMS1[2]
EndSwitch
$TimeResult = $TMS1[1] & ":" & $TMS1[2] & ":" & $TMS1[3]
EndIf
-----------------------------------
Есть один глупый вопрос, но я его всё же задам (любопытство преодаливает :tongue: ) - Чем отличаются между собой: @CR, @LF, и @CRLF ?
Creat0R
Вместо того, чтобы запускать ещё один скрипт, можно запустить этот-же скрипт, но с параметром ком. строки
угу, этот способ часто используется в командных файлах
в некоторых случаях, у минут и у часов будет нехватать нуля
действительно не заметил, но тогда проще штатными средствами:
$Time = "01:10:43"
$Mins = 8
Dim $TMS0 = StringSplit ($Time,":")
Dim $TMS1 = $TMS0
$Mins = Mod (24*60 + $TMS0[1]*60 + $TMS0[2] - $Mins, 24*60)
$TMS1[2] = Mod ($Mins, 60)
$TMS1[1] = ($Mins - $TMS1[2])/60
$TimeResult = StringFormat("%.2d:%.2d:%.2d",$TMS1[1],$TMS1[2],$TMS1[3])
Чем отличаются между собой: @CR, @LF, и @CRLF ?
в справке же написано: @CR=Chr(13); @LF=Chr(10); @CRLF=@CR & @LF. Соответствуют управляющим (терминальным) кодам "возврата каретки" на начало строки (CR) и переходу на следующую строку (LF), в текстовых файлах по традиции используется @CRLF хотя тут явная избыточность и достаточно чего-нибудь одного.
Sanja Alone
20-09-2006, 06:22
Creat0R
Чем отличаются между собой: @CR, @LF, и @CRLF
CR - "carriage return" ("возврат каретки")
LF - "line feed" ("перевод строки")
CRLF - соотв-но, оба действия вместе.
Вся эта кужня с переводами строк основывается на проведении параллели с печатной машинкой :)
Только последний (сдвоенный) символ является полноценным идентификатором перевода строки и воспринимается всеми ОС DOS (собс-но, он в DOS-е и появился) и Windows (в *NIX, afaik, переводы строк совсем другие), но, в msgbox-ах можно без проблем исп-ть и "половинчатые" (@LF, @CR) переводы строк.
amel27
Sanja Alone
Спасибо вам, за столь исчерпывающие описания этих макросов :)
amel27
тогда проще штатными средствами:
И ещё раз спасибо - Ты оправдываешь поговорку: “Всё гениальное - просто!” :idea:
Интересно, возможно ли осуществить проверку на подключённость к сети? Т.е проверять подключён ли компьютер к сети, или нет.
P.S:
Кстати, я как-то пару страниц назад, спрашивал на счёт проверки на битую ссылку... так вот, оказалось что можно элементарно проверить является ли заданная ссылка битой - нужно просто попытаться узнать размер файла по ссылке:
$Link = InetGetSize("http://test/test.zip")
If $Link = 0 Then MsgBox(48, "Ошибка", "Ссылка по которой вы пытаетесь закачать файл, битая! (не рабочая)")
Но дело в том, что таким образом я немогу проверить подключён ли компьютер к инету, т.к в одном скрипте, мне нужно проверять на битость ссылки, и до проверки ссылки нужно надёжно проверить подключение к инету, и если подключение есть, то скрипт должен продолжить проверять ссылку, а если нет, то выдать сообщение об ошибке и завершить свою работу.
Sanja Alone
22-09-2006, 06:56
Creat0R
возможно ли осуществить проверку на подключённость к сети?С налету видится такой способ:
If Ping("www.google.com",3000) Then
Msgbox(0,"Онлайн",'Есть контакт!')
Else
#cs
---------------------------------
Коды ошибок:
1 = Host is offline
2 = Host is unreachable
3 = Bad destination
4 = Other errors
---------------------------------
#ce
Msgbox(0,"Ошибка","Код ошибки: " & @error)
EndIf
Sanja Alone
если человек сидит за проксёй это ничего не даст
если человек сидит за проксёй это ничего не даст
Creat0R
вот несколько модифицированный пример из справки:
;Установка функции перехвата COM-ошибок
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
If IsNotConnect() Then
MsgBox (0,"Проверка связи","Интернет-соединение отсутствует!")
Else
MsgBox (0,"Проверка связи","Интернет-соединение установлено!")
EndIf
;Функция проверки на отсутствие соединения
Func IsNotConnect()
Local $oHTTP=ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET","http://www.google.com")
$oHTTP.Send()
Return @error
EndFunc
;Обработчик COM-ошибок
Func MyErrFunc()
Select
Case $oMyError.source = "WinHttp.WinHttpRequest"
SetError($oMyError.number)
Case Else
Msgbox(0,"AutoIt COM Error !", _
"err.source is: " & @TAB & $oMyError.source & @CRLF & _
"err.description is: " & @TAB & $oMyError.description & @CRLF & _
"err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _
"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF )
SetError($oMyError.number)
EndSelect
Endfunc
amel27
вот несколько модифицированный пример из справки:
Супер! Спасибо!
Есть только один маленьки вопрос про...
;Установка функции перехвата COM-ошибок
Как этим пользоваться? т.е как я понял, это возвращает значение ошибки в случае неподключенности? но если так, то когда я подставил в MsgBox переменную $oMyError, то отобразился странный квадрат, как будто кириллица в Utf-8. Т.е вот как я подставил:
MsgBox (0,"Проверка связи","Интернет-соединение отсутствует: " & $oMyError)
И вот что получилось:
http://img212.imageshack.us/img212/9521/msgboxdw6.png
Creat0R
если код ошибки то $oMyError.number, другие параметры описаны в секции "Case Else" - на случай возникновения произвольных ошибок (кроме явно описанной для объекта WinHttp.WinHttpRequest)
amel27
Мне нужно было именно описание ошибки ($oMyError.description), спасибо.
----------------------------------
Есть такой вопрос:
Как можно переименовать все файлы с одним расширением, в те же имена, но до самого расширения добавить символы _1 - а если уже существуют такие имена, то вместо _1 нужно подставить _2 и т.д.
Пробую так:
FileCopy("*.dat", "*_1.dat")
Но начинают появляться немеренное количество дублированных файлов, с именами которые содержат огромное количество символов _1
А добавление к коду определение на совпадение имён файлов (для замены _1 на последующие цыфры), я даже и не рискую делаь (если вообще смогу), т.к немогу решить первую проблему в задаче.
Возможно ли это решить?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.