Войти

Показать полную графическую версию : [Архив - Часть 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
11-04-2006, 11:48
VelDmi
И это правильно! Что-то подобное и я тогда искал, но не доискал...

Sanja Alone
12-04-2006, 01:48
VelDmi
bogomolv
Вы, конечно, будете смеяться, но когда я вчера пробовал подобный вариант в кач-ве возможного способа решения обозначенной проблемы, то рез-т был неутешительным:
RunWait (@comspec & ' /c chcp 1251 && ping.exe 127.0.0.1 > ping.log','', @SW_HIDE)Файл ping.log получается в OEM-кодировке.

При этом, в конструкции:
RunWait (@COMSPEC & ' /c chcp 1251 && netsh.exe interface ip dump > netsh.cfg', @SystemDir, @SW_HIDE)команда chcp реально изменяет кодировку.

Это я к тому, что способ неуниверсальный :(

amel27
13-04-2006, 15:11
bogomolv
Когда-то решал подобную проблему такИМХО AutoIT не лучший выбор для подобных задач - не поддерживает работу со стандартными потоками и тормозит на циклах. Для командных утилит хочется "нечто", обрабатывающее транзитный текстовый поток, в тырнете не нашел ничего подходящего, только для файлов... Сначала подумал про VBS - там есть поддержка StdIn и StdOut, но проще всего оказалось на Си. Вот что у меня получилось, пример:
type file1.txt | dos2win >file2.txt
ping 127.0.0.1 | dos2win >ping.logSanja Alone
Это я к тому, что способ неуниверсальный Можно для надежности воткнуть chcp 866 вначале но и это не гарантия, есть утилиты выводящие только в Win-кодировке.

bogomolv
14-04-2006, 07:31
amel27
ИМХО AutoIT не лучший выбор для подобных задач
Так и задача была AutoIt'овская... В скрипте AutoIt нужно было обработать сообщение. Потом выяснилось, что и обрабатывать там особо нечего, и я просто вставил проверку на наличие искомого выражения в неправильной кодировке...

bogomolv
17-04-2006, 09:15
amel27
Спасибо за упоминание StdOut.
Обратив внимание на где-то виденное сочетание буковок, освоил новую для себя функцию AutiIt3 - StdoutRead().
Раньше для считывания результатов командной строки использовал перенаправление в >C:\1.txt или CLIPCOPY.EXE.
Теперь все читаю напрямую.
Пример, где отыскиваются и затем запускаются все скрипты, нужные на конкретной стадии автоустановки:
$dr = Run('%Comspec% /c dir "c:\drivers\*_2.au3" /s /b', '', 0, 6)
$f = ''
While not @error
$f = $f & StdoutRead($dr)
Wend
$dr=StringSplit(StringReplace($f,@LF,''),@CR)
For $i=1 To $dr[0]-1
RunWait('AutoIt3.exe "'&$dr[$i]&'"')
Next

amel27
17-04-2006, 12:23
bogomolv
Блин, надо же! Сам давно искал подобное, но пропустил - бум знать. :)

saguna
20-04-2006, 12:16
всем привет!
вопрос: я заметил что скомпиленные в ехе скрипты во время своей работы занимают до 50-80 а иногда и 100% загрузки процессора! замечали ли вы подобное и как с этим бороться.. для примера:


AdlibEnable("buff", 500)
While 1
WEnd
Exit

Func buff()
$bak = ClipGet()
MsgBox(0,"","буфер содержит: " & $bak)
Exit
EndFunc


данный скрипт грузит мой пень4 - 3ггц до 50% уровня... возможно ли написать более корректно сам алгоритм постоянной работы функции?
выход из зацикливания, необходим только в примере, на деле мне надо чтобы скрипт выполнялся постоянно в фоновом режиме..

NikLok
20-04-2006, 15:08
bogomolv
Как задействовать в автоите функцию StdoutRead. Ибо версия 3 выдает - незнаю таковой!

bogomolv
20-04-2006, 16:02
NikLok
Скачать более позднюю... Судя по ChangeLog, эта функция появилась в первых же бетах после выпуска официальной версии 3.1.1.
Я сейчас пользуюсь версией 3.1.1.102.

NikLok
20-04-2006, 16:34
bogomolv
Спасибо! Ща скачаю!

Artya
25-04-2006, 19:20
а подскажите как в комбо загрузить текст из файла.
в файле каждая отдельная строка это какое то слово. например
слово1
слово2
слово3
и т.д.

З.Ы.
всем спасибо :) уже разобрался :))

Ptyuch
26-04-2006, 16:15
Никак не пойму: функция Global действует в теле только одного скрипта? Пытаюсь задать переменную в первом скрипте, и, пока он работает, использовать ее значение во втором:

1 файл - 1.exe
global $a=20
run("2.exe")
/тело скрипта/

2 файл - 2.exe
/тело скрипта/
msgbox(0,"","a is " &$a, 2)

Если это не работает, как бы мне еще ввести "переключатели" (в первом файле часть скрипта отработала - во втором происходит переключение на следующий этап)?
Все это для того, чтобы progressbar располагался отдельно от других скриптов, но был с ними связан... Это же возможно? :)

bogomolv
26-04-2006, 19:13
Ptyuch
1 файл - 1.exe
global $a=20
run("2.exe "&$a)
/тело скрипта/

2 файл - 2.exe
/тело скрипта/
$a=$CmdLine[1]
msgbox(0,"","a is " &$a, 2)

Ptyuch
29-04-2006, 09:05
Было бы красиво! ;) Только первый файл не выполняется: ошибок в скрипте нет, только вот:
Unable to execute an external program
Не удается найти указанный файл:
run("2.exe"&$a)
Без аргумента $a скрипт запускается. Any idea?

bogomolv
29-04-2006, 11:49
Ptyuch
Идей нет. Есть замечания.
Разве у меня написано run("2.exe"&$a)?

Ptyuch
29-04-2006, 15:32
Огромное спасибо!
%#! Даже в голову не пришло поставить пробел перед ". Может, где можно почитать про такой синтаксис? Потому что я иду дальше по схеме:
1 файл - 1.exe
global $a=20
run("2.exe "&$a)
/тело скрипта.../
global $a=40
и т.д.

2 файл - 2.exe
$a=$CmdLine[1]
msgbox(0,"","a is " &$a, 2)
/тело скрипта.../
msgbox(0,"","a is now " &$a, 2)
В этом случае прописанные условия во втором файле опирались бы на состояние изменяющейся переменной из первого файла. Пока срабатывает только первый триггер, прописанный в global $a -> $cmdlines[1]. Может, как-нибудь через Adlib? Не знаю, правда, как ;)

Dirk Diggler
29-04-2006, 16:18
У меня есть скрипт, регистрирующию nnBackup. Его регистрация проходит в консольном окне, поэтому я посылаю туда кириллицу с помощью команды Send("{ASC 123}"). Однако это работает только в NT-системах, в 9х там лезет какая-то кразяберность. Как послать кириллицу в консольное окно 9х?

Dirk Diggler
29-04-2006, 16:41
По старенькому пройдемся:
Доделал скрипт для Radmin 2.2 (добавил регистрацию стандартным методом + все действия теперь определяются переменными в секции Global).
Народ, а зачем его вообще так ставить? Я простое копирование файлов/импортирование ветки реестра делаю, работает на ура.

Можно ли с помощью AutoIt выставить права на ветку реестра
С пом. средств АвтоИт никак, а какой MS-утилкой это сделать я не знаю (мне известен только ручной способ - regedit -> "Разрешения"), увы
SubInAcl. НАсчет установки разрешений умеет все.

bogomolv
29-04-2006, 18:49
Ptyuch
Ты, по моему, вообще задачу решаешь немного не с того конца. :)
Если это всего лишь бегунок, то лучше всего использовать Adlib.
Пример бегунка, приблизительно отсчитывающего время установки:
...
ProgressOn ('Установка Nero 7','','',-1,-1,18)
$pr=0
AdlibEnable ('progress',300)
...
ProgressOff ()
AdlibDisable ()
...
Func progress()
$pr=$pr+1
ProgressSet($pr)
EndFunc

Lexi
01-05-2006, 17:53
Я пытаюсь перевести конвертер ASCI ->UTF-8 с C на autoit :). Но видимо что-то не правильно понимаю. На вход функции подаю C3, а на выходе получаю C3 83, что явно неправильно. Или правильно и ошибка в другом?
Код на C

int conv_x2utf(unsigned char* bufin, int len, unsigned char* bufout)
{ int i, j = 0;

for (i = 0; i < len; i++)
{
if (bufin[i] >= 0x80)
{ bufout[j++] = (((bufin[i] >> 6) & 0x3f) | 0xc0);
bufout[j++] = (bufin[i] & 0x3f) | 0x80;
}
else
bufout[j++] = bufin[i];
}

return j;
}
Autoit:

Func StringToUTF($String)
Dim $String
$VarUTFArr = StringSplit ( $String, "" )

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

If $code < 128 Then
$VarUTFArr[$i] = Chr ($code)
Else
$VarSt1 = BitOR (BitAND ((BitShift ($code, 6)), 0x3f), 0xc0)
$VarSt2 = BitOR (BitAND ($code, 0x3f), 0x80)
$VarUTFArr[$i] = Chr ($VarSt1) & Chr ($VarSt2)
EndIf
Next

Dim $sResult
For $iCntr = 1 To $VarUTFArr[0]
$sResult = $sResult & $VarUTFArr[$iCntr]
If ($iCntr < $VarUTFArr[0]) Then
$sResult = $sResult
EndIf
Next

Return $sResult
EndFunc


Нашёл исходник конвертера на FoxPro. И он работает!:)

Func StringToUTF($String)
Dim $String
$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

Next

Dim $sResult
For $iCntr = 1 To $VarUTFArr[0]
$sResult = $sResult & $VarUTFArr[$iCntr]
If ($iCntr < $VarUTFArr[0]) Then
$sResult = $sResult
EndIf
Next

Return $sResult
EndFunc




© OSzone.net 2001-2012