Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [Архив - Часть 1.2] AutoIt скрипты (http://forum.oszone.net/showthread.php?t=98821)

Dirk Diggler 10-02-2006 10:47 405099

[Архив - Часть 1.2] AutoIt скрипты
 
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.
Можно ли с помощью AutoIt выбрать каталог? Хочу нацарапать оболочку, которая мне будет конфиги для nnBackup писать, дык выбрать каталог для бэкапа пока только вручную получается... Нельзя ли как-нть вывалить стандартный диалог по выбору файлов-папок, и получить из него результат действий пользователей?

Dirk Diggler 10-02-2006 12:16 405143

А также вопрос про - как перебрать все элементы контрола типа List, для проверки, совпадает ли новый его элемент с уже существующими?

Sanja Alone 11-02-2006 02:22 405358

Dirk Diggler
Цитата:

вывалить стандартный диалог по выбору файлов-папок
FileOpenDialog ( "title", "init dir", "filter" [, options [, "default name"]] )
Цитата:

как перебрать все элементы контрола типа List
См. в сторону ControlCommand ( "title", "text", controlID, "command", "option" ), ControlListView ( "title", "text", controlID, "command" [, option1 [, option2]] )

amel27 12-02-2006 12:04 405710

Это не вопрос, но грабли... Вот два способа вызова одного скрипта - откомпилированного в EXE и нет:
Код:

script.au3 "%ALLUSERSPROFILE%\Desktop"
Код:

script.exe "%ALLUSERSPROFILE%\Desktop"
Первый восстанавливает переменную окружения ALLUSERSPROFILE нормально, а вот второй нет...

Вывод: используем откомпилированные скрипты (принимающие параметры) только из CMD-файлов!

forumuser 13-02-2006 13:27 406073

Переключение раскладки клавиатуры.
 
Может кому-то понадобиться, потому что я не сразу додумался как это сделать :)
Понадобилось мне как-то переключить раскладку во время установки программы. Первое что пришло в голову - Send("+^"). И обломался я сильно, и полез в инет за ответом!:search: Найти у далось только два поста в архиве, которые мне не помогли. :sorry: Но стоило тщательнее порыться в Хелпе, как ответ тут же нашелся - Send("{LSHIFT}+{LCTRL}"). Удачи:)

Dirk Diggler 13-02-2006 19:27 406172

Как определить наличие хоста? Встроенный пинг не работает. Проверил тремя разными способами, вот последний:
Код:

MsgBox(0,"",ping("192.168.0.1"))
  ping("192.168.0.1")
  MsgBox(0,"",@error)

говорит, что хост доступен(23 мс, @error=0) , несмотря на то, что моя подсетка 192.168.100.0/24, а вот что виндовый пинг говорит
Код:

Ответ от 217.106.xxx.xxx: Заданная сеть недоступна.
 
  Статистика Ping для 192.168.0.1:
      Пакетов: отправлено = 1, получено = 1, потеряно = 0 (0% потерь),
  Приблизительное время приема-передачи в мс:
      Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек

Может, его смущает выделенное? Но такой случай в докуменатции описан, @error д.б. равен 2, так что за отмазку не канает

Аутоитовский пинг даже на ping("192.168.0.0") говорит 23, т.е. ответ через 23 мс.

Dirk Diggler 13-02-2006 19:30 406173

да и в приведенном в документации примере стоит заменить DNS-имя на IP, как сразу оно перестает работать как надо
Код:

$var = Ping("10.0.0.1",2500)
If $var Then ; also possible:  If @error = 0 Then ...
    Msgbox(0,"Status","Online, roundtrip was:" & $var)
Else
    Msgbox(0,"Status","An error occured with number: " & @error)
EndIf


Sanja Alone 14-02-2006 03:05 406250

forumuser
  • Для обсуждения общих вопросов по AutoIt специально создана эта тема, новых создавать не нужно (Правила Форума).
  • Вот здесь описаны еще 2 способа переключения раскладки:
    AutoIt скрипты - введение и FAQ (с возм-тью переключения на конкретный язык, а не по кругу).

amel27 14-02-2006 11:50 406345

Dirk Diggler

Пробовал вроде активные хосты определяет, по крайней мере по IP...

192.168.0.0 (моя подсеть) дает ошибку 3
на любые другие сети или несуществующие IP дает ошибку 1

Dirk Diggler 14-02-2006 13:20 406374

проблема однозначно существует, в случае ответа от роутера по ICMP Autoit думает, что получил ответ от искомого хоста. Нашел аналогичную тему на родном для AutoIt форуме, насколько мой английский позволяет, понял, что баг был исправлен в одной из текущих бет, я скачал январскую(или уже февральскую) beta 106, пока не пробовал. Вы не бету пользуете случаем?

amel27 15-02-2006 15:32 406878

Нет, не бета, у меня наоборот DNS не отзывается. Фича новая, значит без глюков не обойтись. Если бы не ваш пост не сунулся бы в справку и не обнаружил что версия уже устарела... :)

Dirk Diggler 17-02-2006 11:02 407549

А как отследить, что было активизировано окно "Запуск программы"(это которое Пуск -> Выполнить)? Оно собственного заголовка не имеет.

amel27 17-02-2006 15:53 407663

А разве "Запуск программы" не заголовок? Вроде работает:
Код:

WinWait("Запуск программы")
MsgBox(0,"Внимание!","Окно активировано!")


Dirk Diggler 17-02-2006 21:44 407816

Да, но теперь другая проблема... Я пишу задачу для nnCron, которая при активизации этого окна будет переключать в нем раскладку. Использовал пример из FAQ.
Суть проста - при логоне в цикле пускается нижеследующий скрипт, который сперва ждет активизации окна, переключает раскладку, а потом ждет деактивизации, и завершает работу. Тут же запускается по новой, ждёт и т.п. Как можно убедиться, переключение раскладки - не работает! Я жму Win-R, вижу окно и... печатаю в нем по-русски. А как указано в секции параметры, должен бы по-английски... а в трее балун кажет, что уже WinWaitNotActive выполняется, значит _SetKeyboardLayout уже отработал... Тестировал скрипт на одиночном его запуске, добавил строку, которой проверяю правильность полученного хэндла... все вроде правильно....

Код:

Const $DEU = "00000407" ;Немецкий (стандартный)
  Const $ENU = "00000409" ;Английский (США)
  Const $FRA = "0000040C" ;Французский (стандартный)
  Const $FIN = "0000040D" ;Финский
  Const $ITA = "00000410" ;Итальянский
  Const $PLK = "00000415" ;Польский
  Const $RUS = "00000419" ;Русский
  Const $UKR = "00000422" ;Украинский
  Const $BLR = "00000423" ;Белорусский
  Const $EST = "00000425" ;Эстонский
  Const $LTH = "00000426" ;Латвийский
  Const $LVI = "00000427" ;Литовский
  Const $CHS = "00000804" ; Chinese (People's Republic of China)
  Const $CHT = "00000404" ; Chinese (Taiwan)
 
 
  ;--------=========================ПАРАМЕТРЫ========================-------------
 
  ;
  $WinTitle = "Запуск программы"
  $layout =  $ENU
 
 
 
  ;--------=========================КОД========================-------------
 
 
 
  Opt("TrayIconDebug", 1)
  Opt("WinTitleMatchMode", 2)
  WinWaitActive($WinTitle)
  Opt("WinTitleMatchMode",4)
  $hWnd = WinGetHandle("last")
 
  ; раскомментируйте следущую строку, чтобы убедиться, что handle получается правильный!
  ; WinClose($hWnd)
 
  ;переключение раскладки в окне, определяемом указателем $hWnd
 
  ; вот эта функция не работает
  _SetKeyboardLayout($layout, $hWnd)
 
  Opt("WinTitleMatchMode", 2)
  WinWaitNotActive($WinTitle)
 
  Exit
  ; --------=========================ПОДВАЛ========================-------------
 
 
  Func _SetKeyboardLayout($sLayoutID, $hWnd)
  Local $WM_INPUTLANGCHANGEREQUEST = 0x50
  Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
  DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $ret[0])
  EndFunc


Может, это не работает потому, что у меня помимо русской и английской стоит также и китайская раскладка?

Dirk Diggler 19-02-2006 00:38 408154

спасибо за внимание, конечно, в общем, поборол проблему. теперь я, переключаясь в окно cmd.exe или нажимая Win+R, могу не беспокоиться за раскладку, она у меня всегда английская.... если кому-то надо, выложу скрипты...

Sanja Alone 19-02-2006 02:55 408212

Dirk Diggler
Цитата:

если кому-то надо, выложу скрипты...
Это действительно FAQ - сам видишь... Можешь и свой вариант добавить - многим это может пригодиться.

Dirk Diggler 19-02-2006 13:41 408304

в случае с окном "Запуск программы..." из FAQ не подошло.

Dirk Diggler 19-02-2006 19:36 408381

Как сделать так, чтобы элементы TreeView можно было перетаскивать из одной ветки в другую?

Sanja Alone 20-02-2006 03:05 408467

Dirk Diggler
Цитата:

в случае с окном "Запуск программы..." из FAQ не подошло.
Как ты сам понимаешь, все ситуации нельзя предвидеть. Я у себя на компе вообще не использую ни одного из приведенных в FAQ методов - у меня ф-ции Send и ControlSetText нормально отрабатывают при посылке как англ. так и рус. символов без всякого переключения раскладки. Уж не знаю с чем связана такая беспроблемность, но это факт... Теперь по сути - если есть желание помочь народу, то приведи свой листинг в этой теме; если метод окажется работоспособным, то он также будет включен в FAQ.

Цитата:

Как сделать так, чтобы элементы TreeView
AutoIt не умеет работать с такими эл-тами.

Dirk Diggler 20-02-2006 10:28 408531

Цитата:

Send и ControlSetText нормально отрабатывают при посылке
Я писал эти скриптики не для Send и ControlSetText, а для исключения сиуации, когда я хочу запустить regedit, а он запускаю купувше

Цитата:

AutoIt не умеет работать с такими эл-тами.
Ну у него есть же контрол TreeView, вполне стандартный виндовый. Он порождает вполне виндовые события... Может, можно как-то написать обработчик?
В целом задача стоит так: есть древовидная структура - корень, от него ветки, достаточно одного уровня, т.е. ветка в ветке уже не обязательно, в этих ветках - некие элементы. Надо лишь одну вещь сделать - чтобы эти элементы можно было легко перекидывать из одной ветки в другую. может, использовать что-то отличное от TreeView?

Sanja Alone 21-02-2006 02:26 408872

Dirk Diggler
Цитата:

хочу запустить regedit, а он запускаю купувше
А как у тебя такое вообще получается?
Я пробовал так:
Код:

Run('regedit.exe')
И так:
Код:

Send('#r')
WinWaitActive('Запуск программы')
Send('regedit.exe')
;или (как вариант)
ControlSetText('last','','Edit1','regedit.exe')
Send('{ENTER}')

...и всегда запускается именно regedit, а не купувше. Причем, это не зависит от текущего состояния раскладки. Что нужно сделать, чтобы получить упомянутую тобой ошибку?

Цитата:

Ну у него есть же контрол TreeView
Если ты создаешь свой gui с пом. AutoIt, то им можно управлять. А "чужими" TreeView - шиш. Если знаешь WinAPI - попробуй через DllCall (тут я тебе не советчик).

Dirk Diggler 21-02-2006 10:23 408960

Цитата:

Что нужно сделать, чтобы получить упомянутую тобой ошибку?
Вводить имя файла вручную 8-)))) слово "он" во фразе “хочу запустить regedit, а он запускаю купувше“ - просто опечатка.

Dirk Diggler 21-02-2006 10:44 408966

Цитата:

Если ты создаешь свой gui с пом. AutoIt, то им можно управлять
А в чем отличие? Мне как-то казалосьь, что они общие для всех... я не в курсе подробностей реализации этого дела... Но все равно, как минимум, там предусмотрен стиль $TVS_DISABLEDRAGDROP...

У меня вопрос - как получить раскладку текущего окна???

Sanja Alone 22-02-2006 06:00 409368

Dirk Diggler
Цитата:

А в чем отличие?
Этот вопрос нужно адресовать разработчикам АвтоИт, а не мне.

Цитата:

я не в курсе подробностей реализации этого дела...
Вот-вот, и я тоже :)

Цитата:

там предусмотрен стиль $TVS_DISABLEDRAGDROP...
А использовать этот стиль можно только в GUICtrlCreateTreeView, т.е. при создании эл-та TreeView в созданном ранее с пом. АвтоИт-а gui.

Цитата:

как получить раскладку текущего окна???
WinAPI - GetKeyboardLayout.
А вот и еще один вариант ответа на вопрос "Как программно переключить раскладку клавиатуры?". Нужный кусочек с этой страницы:
Код:

Упрощенный пример смены текущего языка на русский:
ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), 8).c_str(), 0), 0);

на английский:
ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), 8).c_str(), 0), 0);

Для переключения между имеющимися языками:
ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID(HKL_NEXT,SUBLANG_DEFAULT), 8).c_str(), 0), 0); — следующая раскладка

ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID(HKL_PREV,SUBLANG_DEFAULT), 8).c_str(), 0), 0); — предыдущая.

Ес-но, придется преобразовать эти простые строчки в АвтоИт-ные DllCall-ы, при этом нигде не перепутав типы переменных и т.п. Если есть желание - дерзай.

Dirk Diggler 23-02-2006 12:43 409945

Как работают функции типа TCPRecv? Они ждут получения данных или просто проверяют сокет и завершают работу? Их надо зацикливать или нет?

VelDmi 26-02-2006 09:58 411014

Как закрыть окно експлорера? Например после инсталляции antivir открывается папка C:\Documents and Settings\All Users\Главное меню\Программы\AntiVir - Personal Edition. Конструкция
If WinWait ("Главное меню\Программы\AntiVir - Personal Edition","", 10) Then WinClose ("Главное меню\Программы\AntiVir - Personal Edition")
не помогает. Где я туплю???

amel27 26-02-2006 10:32 411026

VelDmi

WinWait()
WinClose()

"If" зачем?

Sanja Alone 26-02-2006 17:18 411229

VelDmi
Цитата:

Как закрыть окно експлорера?
FAQ читай (раздел "Отлов "случайных" окон" -> пункт 4. Окно браузера).

VelDmi 27-02-2006 16:13 411592

Всем спасибо. Нашел ошибку. Почитал справку.

NikLok 28-02-2006 15:34 411972

Использую для установки скрипты автоита. Уже набралось пордка 15 и грозит добавиться еще! Каждый весит по 120 кило. Что можно предпринять для экономии места:
- паковать чем нибудь экзешники скриптов
- не создавать экзешники а ставить первым делом сам автоит и выполнять непосредственно тексты скриптов.

Скажите как культурно или как лучше?

amel27 28-02-2006 15:59 411985

NikLok
Цитата:

Скажите как культурно или как лучше?
AutoIT не нуждается в "установке" - достаточно одного autoit3.exe. Компиляция необходима в редких специальных случаях... Да и править AU3-файлы ИМХО удобней.

rhtu 01-03-2006 12:42 412356

вопрос по закрытию, предупреждения в Explore
 
Пожалуйста, представьте себе такой этап работы.
На локальной машине с OC Windows'98 установлен сервер, например, Apach.
Пользователь запустил броузер IE (4-я версия), выполнил некоторые дей-
ствия и переходит к работе в VB-форме, которая станет активной, а
окно IE перестанет быть нужным и его можно будет закрыть! Перед выводом
VB-формы на экран осуществляется по методу ieView.Navigate запуск файла
"_close.htm" (технол. VBScript), расположенного или где-то на диске C:,
или в директории /cgi-bin/ сервера Apach (выбор места размещения файла
"demo.htm" сейчас четко не определяю, об этом я попрошу позже, сформу-
лировав задачу до конца!). Предназначенный только, чтобы закрыть окно
броузера (т.е. сам IE), файл "_close.htm" имеет вид:
Код:

<html><head></head><body>
<form name="Form1">
</form>
<script for="Form1" language="VBScript">
Window.Close
</script>
</body></html>

Проблема стала заключаться в том, что на экране появилось меню с двумя
клавишами -- "Да" и "Нет" и необходимостью выбора "Да" без каких-либо
действий со стороны пользователя.
Мои мытарства по решению этой проблемы привели к знакомству с пакетом
AutoIt 3.1, программы которого я установил на компьютере. Далее я запи-
сал код (см. ниже) для "_close.au3" и откомпилировал его, воспользовав-
шись pop_up меню от правой клавиши мышки. Полученный "_close.exe" я
разместил в /cgi-bin/ сервера и запустил этот файл.
Код:

WinWaitActive("Microsoft Internet Explorer", "Просматриваемая веб-страница пытается закрыть это окно. Закрыть окно?")
Send("{ENTER}")

В функции ожидания приведены тексты, которые я списал с появляющегося
меню. Как можно догадаться, результат моих попыток обескураживающий!
Все галочки в свойствах броузера, разрешающих использование ActiveX
не помогли. Я упростил для себя задачу, записав в броузере страницу,
с которой следует начать обзор, файл "_close.htm". Так что, загрузив
страницу, броузер должен был сам себя закрыть без сервера... и тут я
окончательно запутался. Обращение к Форуму на OSzone_net.htm показало,
что на нем рассматриваются преимущественно "мягкие" способы установки
программных пакетов с винчестера. Моя же задача несколько иная и форму-
лируется традиционно по-русски: что делать? Прошу подсказки по разме-
щению "_close.exe" и закрытию этого ненужного мне меню!! Спасибо.

NikLok 02-03-2006 10:39 412771

Вот наверное дурацкий вопрос. Как средствами автоита работать с треем. То есть выбрать нужную программу в нем? При различных разрешениях экрана!

VelDmi 03-03-2006 08:01 413175

rhtu
Раз пока никто не ответил напишу я.

>> Полученный "_close.exe" я разместил в /cgi-bin/ сервера и запустил этот файл.
Надеюсь вы запустили его до того, как запустили скрипт на закрытие окна?

>> В функции ожидания приведены тексты, которые я списал с появляющегося меню.
Часто списывая тексты с окон допускаются ошибки. Лучше всего копировать текст из встроенной программы Au3Info.

>> Предназначенный только, чтобы закрыть окно броузера (т.е. сам IE), файл "_close.htm"
Предлагаю вам закрывать окно AutoIt-ом, а не скриптом, например: WinClose ("Microsoft Internet Explorer - моя страница"). Тогда меню появляться не будет.

nsergeip 03-03-2006 14:19 413352

Возникла следующая проблема. Я делаю дистрибутив винды с автоустановкрй необходимых приложений при первом запуске оси. Есть такая софтина - FinePrint (или pdf printer), которая печатает документ в pdf файл. Написал сценарий instPDF_Printer.au3 для autoit. При попытке запуска следующим методом из командной строки C:\install\AutoIt3.exe C:\install\FinePrint\instPDF_Printer.au3 вываливается сообщение 'Для установки и настройки компонентов системы воспользуйтесь панелью управления'.
И в трее появляется значек autoit. После повторного выполнения команды все работает. Как можно избавиться от этой проблемы?

nsergeip 03-03-2006 14:41 413359

Все разобрался AutoIt3.exe нужно кидать в одну папку вместе с исполняемым скриптом, в моем случае команда получилась такая: C:\install\FinePrint\AutoIt3.exe instPDF_Printer.au3/ Сам спросил - сам ответил. Мож кому и пригодиться!!!

samsobi 03-03-2006 17:15 413434

nsergeip
А почему нельзя скомпилить .au3 в ехе? И пользуй C:\install\instPDF_Printer.exe!

VelDmi 04-03-2006 08:20 413628

nsergeip

>> При попытке запуска следующим методом из командной строки C:\install\AutoIt3.exe C:\install\FinePrint\instPDF_Printer.au3
Должно работать, вероятно внутри скрипта что-то не так. Используй @ScriptDir для запуска приложений.

nsergeip 06-03-2006 12:10 414368

Столкнулся еще с одной проблемой: устанавливаю pdfFactory Pro 2.5! Инсталлятор кривучий такой или руки у меня такие, незнаю. В конце инсталляции вываливается информационное окно с кнопкой 'OK'. Его ничем не могу отловить, не WinWait, не WinActive, не WinWaitActive не помогает!!! Если кто с такой прогой сталкивался или мож знает как всетаки 'нажать' эту кнопку подскажите плиз...

nsergeip 06-03-2006 12:13 414369

VelDmi дело не в том что неработает то что в нутри скрипта, autoit не запускается таким образом, обычно он в трее висит при запуске, а так его там вообще нет...

amel27 06-03-2006 12:34 414378

Цитата:

Столкнулся еще с одной проблемой: устанавливаю pdfFactory Pro 2.5! Инсталлятор кривучий такой или руки у меня такие, незнаю. В конце инсталляции вываливается информационное окно с кнопкой 'OK'. Его ничем не могу отловить, не WinWait, не WinActive, не WinWaitActive не помогает!!! Если кто с такой прогой сталкивался или мож знает как всетаки 'нажать' эту кнопку подскажите плиз...
Код:

Send("{SPACE}")

nsergeip 06-03-2006 13:46 414428

amel27 я делал Send("{ENTER}")! не работает, как будто операция раньше появления окна проходит, или вообще не выполняется, что-то не пойму!?

Shaul 06-03-2006 22:59 414642

Написал скрипт для запуска подряд других скриптов (на данный момент для автоматизации установки программ). Но автоиту не нравится выделенная строка:
Код:

#include <GUIConstants.au3>
 
$mainwindow = GUICreate("Installer", 400, 300)
$label1 = GUICtrlCreateLabel("Select programs to install", 10, 10, 200)
$list1 = GUICtrlCreateTreeView(10, 30, 380, 240, BitOr($TVS_CHECKBOXES, $TVS_DISABLEDRAGDROP))
$cmdinstall = GUICtrlCreateButton("Install", 10, 270, 110)
$cmdcancel = GUICtrlCreateButton("Cancel", 120, 270, 110)
 
GUISetState(@SW_SHOW, $mainwindow)
 
$installlist = IniReadSection("installer.ini", "Programs")
If @error Then
    MsgBox(4096, "", "Error with INI")
Else
    Dim $items[$installlist[0][0]]
    For $c = 1 To $installlist[0][0]
        $item = GUICtrlCreateTreeViewItem($installlist[$c][0], $list1)
        $items[$c] = $item
    Next
EndIf
 
Do
    $msg = GUIGetMsg()
    Select
        Case $msg = $cmdinstall
            For $i = 1 To $installlist[0][0]
                If GUICtrlRead($items[$i]) = $GUI_CHECKED Then
                    RunWait($installlist[$i][1])
                EndIf
            Next
        Case $msg = $cmdcancel
            GUIDelete()
            Exit
    EndSelect
Until $msg = $GUI_EVENT_CLOSE or $msg = $cmdcancel

Что я делаю не так и как это должно быть на самом деле?

Sanja Alone 07-03-2006 03:35 414705

nsergeip
Цитата:

Если кто с такой прогой сталкивался или мож знает как всетаки 'нажать' эту кнопку подскажите плиз...
Не сталкивался, но, если ты здесь приведешь инфу о той кнопке, полученную с пом. AutoIt Window Info ("%ProgramFiles%\AutoIt3\AU3Info.exe"), то, скорее всего, решение найдется (для фиксации показаний в окне AutoIt Window Info нужно нажать Ctrl+Alt+F). А для начала можешь попробовать способ из FAQ (раздел "Вввод данных / работа с элементами управления", пункты 5, 6, 7).

amel27 07-03-2006 05:30 414717

Shaul
Счет элементов массива начинается с 0, нужно так:
Код:

For $c = 0 To $installlist[0][0]-1
...
Next


amel27 07-03-2006 10:24 414761

nsergeip
Цитата:

как будто операция раньше появления окна проходит
Код:

Sleep (1000)
Send("{SPACE}")

Извиняюсь, забыл паузу вставить. Время ожидания подбирается опытным путем. Если срабатывает с клавы, значит будет работать и из AutoIT. В самых тяжелых случаех приходилось даже прибегать к MouseClick().

Shaul 07-03-2006 11:55 414797

amel27
Цитата:

[Shaul
Счет элементов массива начинается с 0, нужно так:

Код:
For $c = 0 To $installlist[0][0]-1
...
Next
В элементе [0][0] содержится количество элементов массива, поэтому я начинаю с $c = 1. Проблема в другом. Автоиту не нравится то, как я назначил количество элементов в массиве $items, который я использую, чтобы впоследствии обратиться к конкретному элементу списка $list1. Еще одна проблема в том, что нужно как-то перехватывать событие выбора чекбокса в графике и где-то отмечать, что этот элемент $items[$c] выбран ($GUI_CHECKED)

Paki 07-03-2006 12:09 414804

Извините за тупость вопроса но очень нужно сделать такое. Имеется назначение клавиши например:

Код:

HotKeySet("{F1}", "go")
Можно ли сделать например какой нибудь ini файл или что нибудь такое, откуда будет тянуться значение клавиши в данном случае F1. Что бы просто можно было быстро поменять значение.

dark_n 07-03-2006 12:28 414810

запуск программы
 
Приветствую.
Выполняю такой коротенький скрипт
Код:

Run( \\\\mycomp\\auditscaner\\ina32.exe)
Send("{Enter}")

почему-то запускается несколько экземпляров ina32.exe
Окно не имеет заголовка.
в чем может быть дело?
Заранее спасибо.

amel27 07-03-2006 13:33 414838

Shaul
Цитата:

Автоиту не нравится то, как я назначил количество элементов в массиве $items, который я использую, чтобы впоследствии обратиться к конкретному элементу списка
Вот-вот, если кол-во элементов массива N, то корректные индексы массива будут от 0 до (N-1), а при обращении к эл-ту $items(N) вывалится ошибка, кстати очень правильная! :)
Цитата:

The number of elements to create for the array dimension, indexed 0 to n-1.

Snejok 07-03-2006 19:41 414977

isDirectory?
 
Как с помощью AutoIt узнать что директория, а что файл? Я сделал так, но может можно проще
Код:

If FileChangeDir("C:\Windows") Then
 MsgBox (0, "Info", "This is Directory!", "")
Else
MsgBox (0, "Info", "This is File!", "")
EndIF


Sanja Alone 08-03-2006 03:43 415137

Paki
Цитата:

Можно ли сделать например какой нибудь ini файл или что нибудь такое, откуда будет тянуться значение клавиши
Ес-но, можно - FAQ (раздел "Работа с ini-файлами"). Код буде выглядеть примерно так:
Код:

$ini=@ScriptDir & '\my.ini'
$HotKey=IniRead($ini,"Section","HotKey","{F1}") ;последний параметр - значение по ум. (если параметр HotKey отсутствует в файле или ini-файла вообще нет)
HotKeySet("'"&$HotKey&"'", "go")


amel27 08-03-2006 03:50 415138

Snejok

Так же, как из командной строки - используя обратный слэш в конце имени, пример:
Код:

; Прием параметра из командной строки
If $CmdLine[0]=0 Then
  Exit
Else
  $file=$CmdLine[1]
EndIf

Код:

; Убираем оконечные слэши
While StringRight($file,1)="\"
  $file=StringLeft($file,StringLen($file)-1)
Wend

; Определяем тип
If FileExists ($file & "\") Then
  MsgBox(0,"","This is Directory!")
Else
  If FileExists ($file) Then
  MsgBox(0,"","This is File!")
  Else
  MsgBox(0,"","File or Directory Not Exist!")
  EndIf
EndIf


rhtu 08-03-2006 23:47 415388

Уточнение получения объекта AutoIt3X при технологии VBScript.

Запись из AutoIt_ru.chm для AutoIt3X, которая приведена ниже, машина
в моем случае применения метода CreateObject() воспринимает как 429-ю
ошибку -- не может создать объект! Поэтому надо ли указывать путь к
autoit3.exe? Или запись, которая ниже, позволяет найти autoit3.exe где
угодно, даже на съемном диске (USB-диске)? Или моя первая строка для
"fso" обладает недостатком, который приводит к невозможности создания
объекта "oAutoIt" при записи из AutoIt_ru.chm? Также есть ли какая-л.
литература на рус. языке с примерами применения AutoIt3Х? Пожалуйста,
подскажите решение для CreateObject(" ???? ").
Код:

Dim fso, oAutoIt
Set fso = GetObject("c:\windows\wscript.exe", "WScript.Application")
Set oAutoIt = fso.CreateObject("AutoItX3.Control")
oAutoIt.WinClose "Microsoft Internet Explorer", ""


amel27 09-03-2006 01:29 415409

rhtu
Цитата:

Set oAutoIt = WScript.CreateObject("AutoItX3.Control")
oAutoIt.WinClose "Untitled - Notepad", ""
Пример взят из справки

nsergeip 09-03-2006 07:36 415455

Цитата:

Не сталкивался, но, если ты здесь приведешь инфу о той кнопке, полученную с пом. AutoIt Window Info ("%ProgramFiles%\AutoIt3\AU3Info.exe"), то, скорее всего, решение найдется (для фиксации показаний в окне AutoIt Window Info нужно нажать Ctrl+Alt+F). А для начала можешь попробовать способ из FAQ (раздел "Вввод данных / работа с элементами управления", пункты 5, 6, 7).
Код:

Вот информация полученная autoit

>>>>>>>>>>>> Window Details <<<<<<<<<<<<<
Title:        pdfFactory Pro
Class:        #32770
Size:        X: 420    Y: 206    W: 524    H: 133

>>>>>>>>>>> Mouse Details <<<<<<<<<<<
Screen:        X: 675        Y: 311
Cursor ID:        2

>>>>>>>>>>> Pixel Color Under Mouse <<<<<<<<<<<
RGB:        Hex: 0xECE9D8        Dec: 15526360

>>>>>>>>>>> Control Under Mouse <<<<<<<<<<<
Size:                X: 221    Y: 67    W: 75    H: 23
Control ID:        2
ClassNameNN:        Button1
Text:                ОК

>>>>>>>>>>> Status Bar Text <<<<<<<<<<<


>>>>>>>>>>> Visible Window Text <<<<<<<<<<<
ОК
pdfFactory Pro was successfully installed!

To use pdfFactory Pro, just print to the pdfFactory Pro printer from any Windows application.

>>>>>>>>>>> Hidden Window Text <<<<<<<<<<<

скрипт вот такой писал, не работает почему-то
Код:

WinWaitActive("pdfFactory Pro","OK")
Send("{TAB}")
Send("{ENTER}")


dark_n 09-03-2006 07:50 415459

Активное окно
 
Имеется такой скрипт.
Цитата:

run("\\neiwton\auditscaner\ina32.exe")
sleep(200)
WinActivate("")
sleep(200)
send("{Enter}")
sleep(200)
WinWaitActive("Inventory Analyzer")
sleep(200)
send("{Enter}")
Когда я запускаю его ,все работает ,как надо.
1) Когда я закидываю его в автозапуск : ina32.exe при входе в систему появляется ,но на окне нет фокуса, соответственно я не могу послать в окно нажатие клавиши.Даже не представляю почему WinActivate("") не срабатывает(у окна нет заголовка т.е. title). !!??
2)как можно послать {Enter} определенной кнопке на окне?

Заранее спасибо.

nsergeip 09-03-2006 08:50 415474

Вот скрипт
Код:

Run("Setup.exe")
WinWaitActive("pdfFactory Pro","Да")
Send("{ENTER}")
WinWaitActive("pdfFactory Pro License Agreement","accept the terms")
Send("{TAB}")
Send("{ENTER}")
WinWait("pdfFactory Pro")
if WinWaitActive("pdfFactory Pro","Да",2) Then
Send("{TAB}")
Send("{ENTER}")
WinWaitActive("pdfFactory Pro","ОК")
Send("{TAB}")
Send("{ENTER}")
Else
WinWaitActive("pdfFactory Pro","ОК")
Send("{TAB}")
Send("{ENTER}")
EndIf

Этим скриптом я устанавливаю pdfFactory/ Проблема в том что если на компе установлена уже эта программа то окно

Код:

Press CTRL-ALT-F to pause the display.

>>>>>>>>>>>> Window Details <<<<<<<<<<<<<
Title:        pdfFactory Pro
Class:        #32770
Size:        X: 429    Y: 341    W: 620    H: 126

>>>>>>>>>>> Mouse Details <<<<<<<<<<<
Screen:        X: 536        Y: 431
Cursor ID:        2

>>>>>>>>>>> Pixel Color Under Mouse <<<<<<<<<<<
RGB:        Hex: 0xECE9D8        Dec: 15526360

>>>>>>>>>>> Control Under Mouse <<<<<<<<<<<
Size:
Control ID:
ClassNameNN:
Text:

>>>>>>>>>>> Status Bar Text <<<<<<<<<<<


>>>>>>>>>>> Visible Window Text <<<<<<<<<<<
&Да
&Нет
Setup found settings from a previous installation of pdfFactory Pro.  Would you like to import those settings now?

>>>>>>>>>>> Hidden Window Text <<<<<<<<<<<

появляется, но если уже программа была у становлена то оно не появляется.
ВОПРОС: как написать этот скрипт правильно, так чтобы было предусмотрено то что программа уже имеется, и то что ее еще нет.

Sanja Alone 09-03-2006 09:15 415478

All
На этом форуме принято приводить листинги внутри тэга code !
По теме - Прочтите FAQ !!!



nsergeip
Цитата:

не работает почемуто
Да потому, что у тебя (скорее всего) в каждом окне текст "ОК" есть :) Попробуй так (это очень перестраховочный способ):
Код:

WinWait("pdfFactory Pro","successfully installed")
WinActivate("pdfFactory Pro","successfully installed")
WinWaitActive("pdfFactory Pro","successfully installed")
Send("{TAB}")
Send("{ENTER}")

А на эту кнопку можно и сразу нажать: ControlClick("pdfFactory Pro","successfully installed","Button1")

Цитата:

Вот скрипт
фрагмент:
Код:

if WinWaitActive("pdfFactory Pro","Да",2) Then
Send("{TAB}")
Send("{ENTER}")
WinWaitActive("pdfFactory Pro","ОК")
Send("{TAB}")
Send("{ENTER}")
Else
WinWaitActive("pdfFactory Pro","ОК")
Send("{TAB}")
Send("{ENTER}")
EndIf

заменить на:
Код:

if WinWait("pdfFactory Pro","Да",2) Then
WinActivate("pdfFactory Pro","Да")
WinWaitActive("pdfFactory Pro","Да")
Send("{TAB}")
Send("{ENTER}")
EndIf
WinWaitActive("pdfFactory Pro","ОК")
Send("{TAB}")
Send("{ENTER}")

Этот способ (наряду с другими) описан в FAQ, а вопрос неоднократно разбирался в старой теме - начни с этого поста и прочитай ответы на него.


dark_n
Цитата:

WinActivate("")
  1. Пустые кавычки в кач-ве аргумента означают последнее активное окно, а при старте из автозапуска вполне возможно, что нужное тебе окно не является таковым. Нужно вписать хотя-бы что-то из этого окна (если нет заголовка, то можно написать WinActivate("","Текст")).
  2. ControlClick, ControlSend.

dark_n 10-03-2006 05:28 415887

Код:

run("\\neiwton\auditscaner\ina32.exe")
sleep(2000)
WinActivate("", "Inventory Anlyzer")
sleep(200)
WinWaitNotActive("","Inventory Anlyzer")
send("{Enter}")
sleep(200)
WinActive("Inventory Analyzer")
sleep(200)
send("{Enter}")

почему-то при первом входе в систему(exe-шник скрипта выполняется при входе в систему)
Код:

WinActivate("", "Inventory Anlyzer")
не срабатывает,окно не активно
когда я делаю выход из системы а
затем вход- фокус появляется и все нормально.Почему так?.

kralex 11-03-2006 10:42 416434

Мужики, поможите, не сочтите за невежество. Все перечитал на форумах, создал диск для установки винды XP с автоустановкой приложений. Вроде разобрался со всеми необходимыми нюансами. Винда втыкается, все путем, доходит до автоустановки приложений и выходит такая картина - все приложениия с использованием AutoIt не ставятся. Все скрипты пашут, проверял, все путем. Видимо я напартачил в пакетнике - RunOnceEx.cmd. У меня так прописано:
Код:

cmdow @ /HID
@echo off
 
SET CDROM=%~d0
 
SET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
SET i=100
 
REG ADD %KEY% /V TITLE /D "Installing Applications" /f
 
REG ADD %KEY%\%i% /VE /D "Preparing Installation..." /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\prepare.cmd" /f
 
REG ADD %KEY%\%i% /VE /D "K-Lite codepack" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\K-lite codepack\AutoIt3.exe klcodec.au3" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "Total Commander" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\TOTALCOM\AutoIt3.exe total.au3" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "WinAmp 5_03 FULL" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\WINAMP\AutoIt3.exe winamp503.au3" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "RUSSIFIKATOR WinAmp 5_03" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\WINAMP\AutoIt3.exe ruswiamp.au3" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "Nero 6316" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\Nero6316\nero6316.exe /silent /noreboot /no_ui /sn=1A23-0019-3030-1988-5100-7298 /write_sn
" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "RUSSIFIKATOR Nero 6316" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\Nero6316\NBR6316rus.exe /silent /noreboot /no_ui" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "PowerDVD XP v4.0" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\PowerDVD\Setup.exe /s /sms" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "Office2003" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\Office2003\SETUP.EXE" /f
SET /A i+=1
 
REG ADD %KEY%\%i% /VE /D "Cleaning Up and Rebooting" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%l\cleanup.cmd" /f
SET /A i+=1
 
EXIT

Возможно сначала надо проинсталлировать сам AutoIt ? Например:
Код:

REG ADD %KEY%\%i% /VE /D "autoit-v3-setup" /f
REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Software\Autoit\autoit-v3-setup.exe /s" /f
SET /A i+=1


VelDmi 11-03-2006 11:25 416444

Как написать скрипт, выполняющийся в системе с наивысшим приоритетом, при этом, не использующим (почти) системных ресурсов.
По горячей клавише снимает все процессы или делает log off. Дело в том, что некоторые игры настолько грузят систему, что она не реагирует даже на сеть. или игра глючит. Так вот необходимо по горячей клавише выходить из любой игры, если она зависла.
Код:

HotKeySet("{ESC}", "Terminate")

; Что написать здесь, чтобы повысить приоритет и при этом не жрало ресурсов?

Func Terminate()
        Exit 0
EndFunc


VelDmi 11-03-2006 11:27 416446

kralex
Переконвертируй au3 в exe.

Sanja Alone 11-03-2006 13:26 416491

dark_n
Цитата:

"Inventory Anlyzer"
А здесь точно нет опечатки? Я конечно не знаю, что это за Аналайзер такой, но может должно быть "Inventory Analyzer". А возможно и одного слова "Inventory" будет вполне достаточно...

Цитата:

WinWaitNotActive("","Inventory Anlyzer")
send("{Enter}")
Эта конструкция начисто лишена смысла, т.к. ф-ция Send "Sends simulated keystrokes to the active window". Другими словами, этот ENTER гарантированно будет послан не тому окну, что нужно.

Цитата:

WinActive("Inventory Analyzer")
WinActive - "Checks to see if a specified window exists and is currently active". Использовать данную ф-цию имеет смысл лишь в каких-то проверках, может здесь должна быть WinActivate?

Цитата:

не срабатывает,окно не активно
Как я сказал выше, для неактивного окна можно еще попробовать:
  1. ControlSend ( "title", "text", controlID, "string" [, flag] ) - "works in a similar way to Send but it can send key strokes directly to a window, rather than just to the active window".
  2. ControlClick ( "title", "text", controlID [, button] [, clicks]] ) или ControlClick + ControlFocus ( "title", "text", controlID ) (учитывая ремарку "The control might first need to be given focus with the ControlFocus command.").
P.S.
Цитата:

run("\\neiwton\auditscaner\ina32.exe")
Честно говоря, не думал, что подобная конструкция может нормально работать - вроде, были проблемы, к-рые решались так или так.



kralex
Нужно писать полный путь к au3-файлу:
Код:

REG ADD %KEY%\%i% /V 1 /D "%CDROM%\Путь_к_AutoIt3.exe\AutoIt3.exe %CDROM%\Software\TOTALCOM\total.au3" /f
И не стоит класть AutoIt3.exe в каталог к каждой проге (тогда уж лучше откомпилировать), достаточно положить AutoIt3.exe в какой-то один каталог и ссылаться на него. И еще один момент - если у тебя в au3-файлах присутствуют строки вида Run('setup.exe'), то, без приведения их к виду Run(@ScriptDir&'\setup.exe') способ установки с использованием одного AutoIt3.exe на диске не сработает, т.к. не сможет найти эти самые setup.exe.

А можешь и проинсталлить - тогда можно будет сразу au3-запускать (если ты принудительно не изменишь действие по ум. для au3-файлов), или откомпилируй (не забыв заменить au3 на exe в своем батнике, ну и пути, ес-но).
P.S. Для кого я писал про тэг code?



VelDmi
Цитата:

Что написать здесь, чтобы повысить приоритет и при этом не жрало ресурсов?
Код:

ProcessSetPriority(@ScriptName, приоритет)

где, приоритет:
0 - Idle/Low
1 - Below Normal (Not supported on Windows 95/98/ME)
2 - Normal
3 - Above Normal (Not supported on Windows 95/98/ME)
4 - High
5 - Realtime (Use with caution, may make the system unstable)

А можешь не париться со скриптом, а использовать прогу Process Killer - размер около 40Кб, запускается незаметно при старте системы (через HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\run или HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\run), вызывается по Ctrl+Shift+~. Любой процесс убивается одним нажатием на Del. Также присутствует ф-ция рестарта оболочки.

DimkaZar 11-03-2006 23:51 416680

Подскажите, плиз.
Могу ли я написать скрипт, который при нажатии на оба Shift'а переключал бы раскладку ? У меня стоит ХР и там нету такой опции. А очень хочеться.
Если такое возможно, то напишите как. Или хотя бы скажите как мне поставить скрипт в режим ожидания нажатия двух Шифтов.

Sanja Alone 12-03-2006 03:09 416725

DimkaZar
Цитата:

при нажатии на оба Shift'а
Нет. Процитирую ремарку к ф-ции HotKeySet:
Цитата:

The following hotkeys cannot be set:
Ctrl+Alt+Delete - It is reserved by Windows
F12 - It is also reserved by Windows, according to its API.
NumPad's Enter Key - Instead, use {Enter} which captures both Enter keys on the keyboard.
Win+B,D,E,F,L,M,R,U; and Win+Shift+M - These are built-in Windows shortcuts. Note: Win+B and Win+L might only be reserved on Windows XP and above.
Alt, Ctrl, Shift, Win - These are the modifier keys themselves!
Other - Any global hotkeys a user has defined using third-party software, any combos of two or more "base keys" such as '{F1}{F2}', and any keys of the form '{LALT}' or '{ALTDOWN}'.

Shaul 12-03-2006 15:27 416839

Есть TreeView с $TVS_CHECKBOXES. Строки в список загружаются из файла. Мне нужно, чтобы скрипт выполнял некоторые действия над выбранными ("оптиченными") элементами (строками) списка. Я так и не смог толком понять, как из скрипта проверить, выделена ли строка в списке

DimkaZar 12-03-2006 15:39 416842

Sanja Alone
А ты не подкажешь, может есть другие программы..или еще что...мне очень надо сделать что бы на два Шифта переключалась раскладка.

Sanja Alone 13-03-2006 01:59 417030

DimkaZar
Цитата:

может есть другие программы
Они точно есть - многие старые ДОС-овские "кейрусы" переключали языки по двум шифтам и использовали L/R Shift для прямого переключения на конкретный язык. Попробуй задать свой вопрос в в соседнем подфоруме. Вот тебе две темы сходу: первая и вторая

dark_n 13-03-2006 05:55 417044

Запуск программы под дос
 
А если на машине стоит MS-Dos,то как быть (запустить Inventory Analyzer)?Может надо с какими-нибудь ключами?

nsergeip 13-03-2006 09:44 417103

Sanja Alone у тебя на сайте я нашел скрипт по установке remote administrator, а вот с регистрацией ты не постарался как я посмотрел, а ето помоему немаловажно в автоматическо установке.
Я столкнулся с проблемой по этой части, при запуске ....Radmin\radmin.exe вываливается окно у кот. нет названия, что с этим делать незнаю, мож накидаешь скрипт доконца?

kralex 13-03-2006 10:24 417118


Цитата:

И не стоит класть AutoIt3.exe в каталог к каждой проге (тогда уж лучше откомпилировать), достаточно положить AutoIt3.exe в какой-то один каталог и ссылаться на него. И еще один момент - если у тебя в au3-файлах присутствуют строки вида Run('setup.exe'), то, без приведения их к виду Run(@ScriptDir&'\setup.exe') способ установки с использованием одного AutoIt3.exe на диске не сработает, т.к. не сможет найти эти самые setup.exe.
А можешь и проинсталлить - тогда можно будет сразу au3-запускать (если ты принудительно не изменишь действие по ум. для au3-файлов), или откомпилируй (не забыв заменить au3 на exe в своем батнике, ну и пути, ес-но).
P.S. Для кого я писал про тэг code?
Большое спасибо мужики, разобрался, все влетает теперь в "лысую машину" "как слива в ж....пу". DrWeb 4.33 так никто и не победил до конца? Коли спрашивать еще, так еще вопрос: можно ли через скрипт au3 поиздеваться над разрешением экрана (установить например 1024 х 768, 32 bit, 75 Гц) и активировать винду, т.е. как прописать reboot с заходом в режим защиты от сбоев и автоматом активировать некоторые действия, запустить все тот же скрипт.

Merg 13-03-2006 12:32 417181

Почитал фак, форум про АутоИт3 в принципе ясен принцип...
Установил!
Решил посмотреть как работает, залез в examples и запустил calculator.au3...
Открывается калькулятор встроенный и баста.

По идее там должна произойти операция 2*4*8*16=
Подождать 2 секунды и закрыться.

А у меня ничего не происходит :(

В чем могет быть проблема????

PS: Стоит XP professional service pack 2

тоже самое и с примером notepad1.au3, открывается блокнот и все ...

kralex 13-03-2006 13:04 417197

Цитата:

Почитал фак, форум про АутоИт3 в принципе ясен принцип...
Установил!
Решил посмотреть как работает, залез в examples и запустил calculator.au3...
Открывается калькулятор встроенный и баста.

По идее там должна произойти операция 2*4*8*16=
Подождать 2 секунды и закрыться.

А у меня ничего не происходит :(

В чем могет быть проблема????

PS: Стоит XP professional service pack 2

тоже самое и с примером notepad1.au3, открывается блокнот и все ...

Уважаемый Merg! Твоя проблема для калькулятора по-моему такая - у тебя винда русская? Там в демо скриптах все для English винды. Смотри внимательно в данном скрипте для калькулятора строка:

Код:

; Wait for the calulator become active - it is titled "Calculator" on English systems
Код:

WinWaitActive("Calculator")


Жирным выделена проблема, titled окна должен быть как у тебя, с русским названием окна - "Калькулятор". Например:

Код:

; Wait for the calulator become active - it is titled "Calculator"
Код:

on English systems
Код:

WinWaitActive("Калькулятор")


и ниже по скрипту также, тогда все заработает. Проверь.

Merg 13-03-2006 14:14 417244

Цитата:

Уважаемый Merg! Твоя проблема для калькулятора по-моему такая - у тебя винда русская? Там в демо скриптах все для English винды. Смотри внимательно в данном скрипте для калькулятора строка:


Код:
; Wait for the calulator become active - it is titled "Calculator" on English systems
WinWaitActive("Calculator")

Жирным выделена проблема, titled окна должен быть как у тебя, с русским названием окна - "Калькулятор". Например:


Код:
; Wait for the calulator become active - it is titled "Calculator" on English systems
WinWaitActive("Калькулятор")

и ниже по скрипту также, тогда все заработает. Проверь.

Винда русская.

Большое спасибо! ПОМОГЛО! :)

Неискушенному зрителю достаточно трудно заметить разницу (воспринимается как должное)...

ЗЫ: Получается что надо писать скипты под рус и инг версии?! мде

kralex 13-03-2006 14:57 417263

Цитата:

ЗЫ: Получается что надо писать скипты под рус и инг версии?! мде
Погоди, скрипт пишется не для винды (пусть она хоть китайская), а в нем учитываются названия активных окон, для которых он исполняется. Скрипты в основном применяются для автоустановки программ, а они есть как русские так и всякие. Главное чтобы скрипт "увидел" правильное название окна. Я сам все это познал 3 дня назад. Уже шпарю в этом AutoIt-е все программы (установки оных), которые нужны. Диск с виндой втыкается, а после автоматом сразу весь необходимый софт шпарит без участия юзера. Очень удобно, особенно когда в день по 10 компутеров грузишь.

NikLok 13-03-2006 17:59 417335

Так получается, что скрипты вроде как отлаженные на винде, дают сбой на виртуальной машине!!! Вся беда в том, что при установке приложений нет строки статуса, а значит и диагностики. Как люди выкручиваются?
Далее если срубаем саму установку, то есть выходим из нея, то скрипт то продолжает работать!!! И пока его не срубишь процесс манагером, все стоит и ждет.
Я было пытался в WinWaitActivate ставить временные задержки, но там надо городить кучу if then для того что бы скрипт далше шол на выход. Может есть культурнее решение???

Tanis 13-03-2006 19:31 417364

А меня наоборот, когда ставлю на реальной машине, не появляется индикатор установки и заключительное окно. В котором написано, что программа успешно установлена. При этом на соседней машине все нормально. Еще заметил, что эта неприятность происходит с программами устанавлеваемыми из msi пакетов. Не подскаже как это можно исправить?

XXXler 13-03-2006 20:43 417402

Tanis
Цитата:

устанавлеваемыми из msi пакетов
не легче к msi делать транформации и запускать с ключами?
ИМХО, автоит нужен там где остальными путями пробится не удалось

Tanis 13-03-2006 22:05 417435

Может быть. Но я уже написал скрипты для 45 программ и не хочу начинать все с начала. Да и просто надо же разобраться в чем дело.

Sanja Alone 14-03-2006 07:33 417530

nsergeip
Цитата:

скрипт по установке remote administrator, а вот с регистрацией ты не постарался
Постарался... Прочти комментарий к переменной $dependonsn. Подобным образом, я "не постарался" и в скрипте для CDCheck 3.1.10.0 (переменная $encodedserial). Реестровый способ регистрации этих приложений проще и не требует их запуска.

Цитата:

вываливается окно у кот. нет названия, что с этим делать незнаю, мож накидаешь скрипт доконца?
Я на днях посмотрю, и, возможно, добавлю в скрипт и стандартный способ регистрации, хотя он и неудобен, imho.


kralex
Цитата:

DrWeb 4.33 так никто и не победил до конца?
В каком смысле? Ну не ставится он тихо, но нетихо :) - без проблем (скрипт для автоуст. Dr.Web 4.33).
Цитата:

поиздеваться над разрешением экрана
Это вполне возможно: через меню "Свойства: Экран" (RunDll32.exe shell32.dll,Control_RunDLL desk.cpl,,3) или через реестр (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles). Оба способа не шибко удобны, т.к. в первом нужно будет пересовывать ползунок (trackbar) для изменения разрешения, а второй потребует перезагрузки.

Цитата:

как прописать reboot с заходом в режим защиты от сбоев
Код:

bootcfg.exe /raw "/safeboot:minimal" /a /id 1
shutdown.exe -r -t 0 -f

В первой команде /id 1 - 1-й элемент списка загрузки файла boot.ini. Если на компе несколько ОС, то можно не туда дописать параметр. Поэтому, лучше воспользоваться ф-циями работы с ini-файлами самого АвтоИт-а - так точно не ошибешься.
Цитата:

и автоматом активировать некоторые действия
Ну, это уже от твоей фантазии зависит :) Только не забудь восстановить нормальный режим загрузки, удалив /safeboot:minimal из boot.ini, а то комп так и будет постоянно в safe-mode грузиться :)


Tanis
Цитата:

не появляется индикатор установки и заключительное окно.
Применительно к msi, это определяется ключами /q (детальнее см. msiexec /?):
Код:

/q[n|b|r|f]
Выбор уровня интерфейса пользователя
n - Без интерфейса
b - Основной интерфейс
r - Сокращенный интерфейс
f - Полный интерфейс (по умолчанию)

Цитата:

неприятность происходит с программами устанавлеваемыми из msi пакетов.
Ну и как тебе помочь, ты даже строки запуска не привел. А при таких исходных условиях, как любят говорить в fido, - "Телепаты в отпуске" :) Хотя, XXXler в данном сл. прав - для msi лучше использовать файлы трансформации mst. Только нужно найти нормальный редактор для удобного создания/редактирования таких файлов - Orca (можно взять на http://www.wasm.ru) плоховат в этом отношении.

nsergeip 14-03-2006 08:51 417549

кто знает как при помощи реестра изменить текущий часовой пояс в windows. по умолчанию стоит москва, а мне надо екатеринбург? или мож есть какой другой способ?

Sanja Alone 15-03-2006 01:55 417909

nsergeip
Доделал скрипт для Radmin 2.2 (добавил регистрацию стандартным методом + все действия теперь определяются переменными в секции Global).

kralex 15-03-2006 11:38 418024

Цитата:

Ну, это уже от твоей фантазии зависит Только не забудь восстановить нормальный режим загрузки, удалив /safeboot:minimal из boot.ini, а то комп так и будет постоянно в safe-mode грузиться
Все сделал, спасибо за код
Код:

bootcfg.exe /raw "/safeboot:minimal" /a /id 1
.
С восстановлением нормального режима пришлось повозиться (плохо когда мало знаний). Так и не смог найти команду после действий в Safe mode, чтобы винда "ребуталась" в нормальном режиме. пришлось прописать AutoIt-ом скриптик замены файла boot.ini - safe mode на boot.ini -normal. Дополнительно слепить пришлось SFX архив с указанием абсолютного пути. Но все равно, огромное спасибо Sanja Alone, свою проблему я решил.

Vadikan 15-03-2006 11:58 418034

nsergeip
Цитата:

кто знает как при помощи реестра изменить текущий часовой пояс в windows. по умолчанию стоит москва, а мне надо екатеринбург? или мож есть какой другой способ?
Твики реестра прикреплены в соседнем форуме
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

nsergeip 15-03-2006 14:15 418082

Vadikan
Цитата:

Твики реестра прикреплены в соседнем форуме
там я уже читал, написано там немного не про то что я спрашивал, по ветке
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
можно поменять лишь название определенного часового пояса, а мне нужно изменить не название, а сам часовой пояс!!!

Sanja Alone 16-03-2006 03:33 418308

kralex
Цитата:

Так и не смог найти команду после действий в Safe mode, чтобы винда "ребуталась" в нормальном режиме
И неудивительно - с пом. bootcfg.exe нельзя удалить параметр, внесенный в режиме /raw. Поэтому я и сказал, что лучше все сделать с пом. АвтоИт (используя ф-ции работы с ini-файлами).

Цитата:

Дополнительно слепить пришлось SFX архив с указанием абсолютного пути
А это еще зачем? Чем тебя не устраивает переменная %systemdrive% (из АвтоИт скрипта к ней можно достучаться с пом. EnvGet("systemdrive"))?

Tanis 16-03-2006 16:05 418474

Sanja Alone
Пакеты MSI я cтавлю такой командой
Код:

Run ( 'msiexec /i "'&$file&'" /norestart')
Я поразбирался, все было связано с библиотекой msi.dll. Проблемы начинались с версией 3.1.4000.2457 пришлось заменить на 3.1.4000.2435. Сейчас вроде все нормально. Еще возник вопрос : Можно ли с помощью AutoIt выставить права на ветку реестра, если нет то как это можно сделать?

Sanja Alone 17-03-2006 04:21 418676

Tanis
Цитата:

Run ( 'msiexec /i "'&$file&'" /norestart')
Одобряю, но с одной оговоркой:
Код:

$filename = '\filename.msi'
$file = @ScriptDir & $filename

Т.е., переменная $file должна содержать полный путь, а не только filename.msi (если использовать откомпилированный скрипт, то "И так сойдет..." :) /цитата с мультика о зайце-"мастере"/ ).
P.S. У меня тоже версия 3.1.4000.2435, но не думаю, что это имеет особое значение.

Цитата:

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

amel27 25-03-2006 11:48 421523

Цитата:

Цитата:

Можно ли с помощью AutoIt выставить права на ветку реестра
С пом. средств АвтоИт никак, а какой MS-утилкой это сделать я не знаю (мне известен только ручной способ - regedit -> "Разрешения"), увы
1. В оснастке MMC "Шаблоны безопасности" создать шаблон с нужными правами к реестру и сохранить в INF файле.
2. Применить шаблон к системе можно следующей командой (пример):
Код:

secedit /configure /cfg rights.inf /db %TEMP%\rights.sdb
P.S. Следует иметь ввиду что права назначаются не по имени а по SID. Поэтому для тиражирования шаблонов по другим компам нужно использовать только учетные записи с предопределенными SID, например Users (S-1-5-32-545), Administrators (S-1-5-32-544) и т.д.

Sergio12305 27-03-2006 23:12 422287

У меня вопрос по AutoIt. Как скомпилировать скрипт, который будет включать в себя *.exe , *.mp3 , *.jpg , и т.д. (все в одном exe-файле). Функция "Fileinstall" добавляет любые файлы к сценарию. А как запустить их внутри сценария ? Заранее спасибо.

Sanja Alone 28-03-2006 02:53 422333

Sergio12305
Цитата:

Как скомпилировать скрипт, который будет включать в себя *.exe , *.mp3 , *.jpg , и т.д.
Обычным способом. Все файлы, указанные в параметрах source ф-ции FileInstall ( "source", "dest" [, flag] ) будут автоматически включены в откомпилированный скрипт.

Цитата:

А как запустить их внутри сценария ?
Никак. Считай эту ф-цию аналогом sfx-архива. Т.е., сначала включенные файлы "разархивируются" в указанные в параметрах dest места, а уже затем их можно запускать и т.п.

shita 30-03-2006 17:46 423304

У меня вопрос как в автоите вызвать функцию WinApi SetSystemTime. Т.е. как ее вызвать с помощью DLLCall я знаю, а вот как правильно передать параметры чтобы поменять дату незнаю.

bogomolv 30-03-2006 22:23 423371

shita
Ну молодежь и дает! Как вызвать функцию WinApi SetSystemTime ... с помощью DLLCall знают, а что такое DATE из CMD - нет!

Sanja Alone 31-03-2006 03:23 423432

bogomolv
Привет, Сергей. Что-то давно тебя не видно было...

Цитата:

а что такое DATE из CMD - нет!
Ну, не суди так строго. Не все ведь свое знакомство с ПК начинали с DOS-а. Да и всего знать невозможно... Мне, например, нечего сказать по WinAPI :(

shita
Код:

$date = '30.12.2006'
RunWait(@comspec & ' /c date ' & $date,'',@SW_HIDE)


bogomolv 31-03-2006 07:16 423451

Sanja Alone
Саня, и тебе привет.
Да я не строго! Я любя и немножко с завистью.

А вы здесь все переиначили! Я сначала не разобрался и недели три тупо заглядывал по старому адресу, удивляясь, а чего это никто не пишет...
Новая структура стала информативнее. Только общих тем все равно не будет хватать, и зря вы, модераторы, гонятете Osa-7. Не обращал внимание, как обсуждение особенностей установки программы часто перетекает в обсуждение самих установщиков и возможностей их применения?
Именно из таких обсуждений узнал об InstallRite и удобной связке InnoUnp+InnoSetup. C удовольствием опробовал их. С помощью InnoUnp+InnoSetup расковырял Download Master, а на основе InstallRite создал свой установщик DrWeb (ставится за две секунды!). На радостях накинулся на MS IntelliPoint. Но не тут-то было. InstallRite с ним справиться не может. Но даже с непобежденным IntelliPoint установка WinXP и всех программ занимает у меня теперь 15 мин 30 сек. Именно, так - с секундомером, и вылизываю теперь свои скрипты автоустановки.

shita 31-03-2006 18:50 423705

Sanja Alone
Спасибо, а то надоело каждый раз дату менять чтобы PL/SQL Developer запустить, время trial закончилось.
bogomolv
Да вроде не молодежь, но с этим не стыкался. А DLLCall то, что в справке нашел.

Vadikan 02-04-2006 01:52 424050

bogomolv
Цитата:

Я сначала не разобрался и недели три тупо заглядывал по старому адресу, удивляясь, а чего это никто не пишет...
Так вроде в первый пост прописали большими красными буквами :)
Цитата:

зря вы, модераторы, гонятете Osa-7
Уже никто не гоняет :)
Цитата:

Именно из таких обсуждений узнал об InstallRite
Гм, а как же материалы сайта? http://oszone.net/display.php?id=2767 :)


NORIO 02-04-2006 08:44 424083

Привет.
Я хочу с помощью autoi it производить копирование выделенного текста(в edit полях) но не симулируя ввод с клавиатуры ctrl+c, а исползуя api windows. Хотелось бы узнать как это сделать.

NORIO 02-04-2006 08:56 424084

Добавлю что это нужно сделать под win 98, нужно копировать plain text и rich text.

proxy 03-04-2006 08:14 424358

Доброго Времени Суток.
Подскажите пожалуйста, как отследить нажатую - какая именно была нажата?

bogomolv 03-04-2006 13:27 424458

Vadikan

Да я не ради спора. :)

NikLok 03-04-2006 15:21 424493

Неожиданно выяснилось, что AutoIt вставляет символы в зависимости от текущей раскладки клавиатуры. В частности при вводе серийного номера в AcdSee 8 при русской раскладке, всталвяется левый номер! Вопрос как узнать текущую раскладку? Ну не анализировать же собственный воод?

amel27 03-04-2006 16:09 424506

NikLok
Цитата:

Неожиданно выяснилось, что AutoIt вставляет символы в зависимости от текущей раскладки клавиатуры.
Поконкретней - "вставляет" какой командой?.. И, кстати, AutoIT посвящена отдельная ветка.

NikLok 04-04-2006 10:01 424683

amel27
Цитата:

Поконкретней - "вставляет" какой командой?.. И, кстати, AutoIT посвящена отдельная ветка.
"Вставляет" командой -
Код:

        Send("DKXDVH-3348T-3NHQXB-GHCPRXQ")
Хотя в строке посылаются английские символы, увы попадает кракозябра. Получается, он настолько честно эмулирует, что посылает не те коды которые указаны в строке, а скан коды соотв. клавиш!?
Не смотрел как работает команда посылки в окно ввода (забыл как она называется - SendEdit может?). Неужели у нее те же грабли?

Выяснилось все это когда систему которая ставится с MUI, поставилась без него. Причем непонятно почему то раскладка клавы по умолчанию все ранво всегда русская!
Я уже всю страницу по локализации прочитал и воплотил а воз и ныне там.
Видать где то, что накрутил.
О существовании отдельной ветки знаю и читаю. Но мне кажется этот нюанс должен учитываться и в этой ветке.


amel27 04-04-2006 10:51 424704

Цитата:

Не смотрел как работает команда посылки в окно ввода (забыл как она называется - SendEdit может?). Неужели у нее те же грабли?
ControlSetText()
Цитата:

О существовании отдельной ветки знаю и читаю. Но мне кажется этот нюанс должен учитываться и в этой ветке.
Все-таки это ветка ИМХО для готовых решений, а особенности конкретного ПО лучше обсуждать отдельно.

bogomolv 04-04-2006 18:52 424899

NikLok

Используй
Код:

ClipPut('DKXDVH-3348T-3NHQXB-GHCPRXQ')
Send('+{Ins}')


Vadikan 07-04-2006 00:25 425662

В шапку добавлена ссылка на справочник по rundll32 - мне показалось, что в AutoIt это пригодится.

NikLok 07-04-2006 17:49 425865

Подскажите, как из автоит скрипта запустить другие автоит скрипты?

bogomolv 08-04-2006 03:13 426004

NikLok
Сначала поблагодари за предыдущий ответ :)

proxy 08-04-2006 18:03 426128

Доброго Времени Суток ещё раз.
1. Подскажите пожалуйста, как отследить нажатую клавишу? - какая именно была нажата?


bogomolv 09-04-2006 06:13 426243

proxy
Поясни вопрос. Обычно AutoIt сам эмулирует нажатие нужных клавиш. А ты хочешь от него обратного?

proxy 09-04-2006 09:30 426248

Я хочу узнать какую клавишу (к примеру ASCII код) нажал пользователь, для последующей записи в log.
.......проще говоря: Как в AutoIt реализовать перехват клавиш, без их замены как это делает HotKeySet.
К примеру я пишу текст в блокноте, а программа будет показывать все нажатые клавиши.

bogomolv 09-04-2006 11:00 426262

proxy
На мой взгляд, ты хочешь от AutoIt то, для чего он не предназначен. "AutoIt", - все-таки, это: "a freeware BASIC-like scripting language designed for automating the Windows GUI".
Наверное, тебе больше подойдет брат AutoIt'а - AutoHotKey. Без труда найдешь его в сети.

proxy 10-04-2006 13:12 426549

Большое Спасибо, по обилию функций в справке - AutoHotKey - это именно то, что я искал.

NikLok 10-04-2006 14:38 426578

bogomolv Канычна сапасиба. Везде поменял на твой вариант и усе замечательно за...лось!


В раже даже написал скрипт для смены веремени выбора систеым в файле BOOT.INI
мОЖЕТ ЕГО еще как можно было изменить, но я сделал так!

Код:

$file = FileOpen("c:\boot.ini",0)
; Check if file opened for writing OK
If $file = -1 Then
    MsgBox(0, "Error", "Unable to open c:\boot.ini file.")
    Exit
EndIf

$newfile = FileOpen('c:\boot_new.ini',2)
; Check if file opened for writing OK
If $newfile = -1 Then
    MsgBox(0, "Error", "Unable to open c:\boot_new.ini file.")
    Exit
EndIf

; Read in lines of text until the EOF is reached
While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    If StringInSTr( $line, "timeout=", 0) = 1 Then
            FileWriteLine($newfile, "timeout=7")
    Else
            FileWriteLine($newfile, $line)
    EndIf
;    MsgBox(0, "Line read:", $line)
Wend

FileClose($file)
FileClose($newfile)

FileSetAttrib ( "c:\boot.ini", "-R-S-H" )
FileCopy ( "c:\boot.ini" , "c:\boot_old.ini", 1 )
FileCopy ( "c:\boot_new.ini", "c:\boot.ini" , 1 )
FileDelete("c:\boot_new.ini")
FileSetAttrib ( "c:\boot.ini", "+R+S+H" )
Exit

Может кому надоть.

VelDmi 10-04-2006 17:31 426652

Имеется следующий скрипт:

$netsh = @ScriptDir & '\netsh.cfg'
RunWait (@SystemDir & '\netsh.exe interface ip dump > ' & $netsh, @SystemDir, @SW_HIDE)

Так вот файл netsh.cfg создается в ДОС кодировке. И я не могу прочитать русские слова командами автоита.
$file = FileOpen($netsh, 0)
$line = FileReadLine($file)
Получаесся абракадабра. Что делать?

bogomolv 10-04-2006 19:28 426687

NikLok
Пожалуйста! Приходите еще! :)
Код:

RunWait('AutoIt3 script.au3')

bogomolv 11-04-2006 07:52 426817

VelDmi
Когда-то решал подобную проблему так:
Код:

$f = 'C:\1.txt'
$aa = FileRead($f, FileGetSize($f))
$a1 = " ЎўЈ¤Ґс¦§Ё©Є«¬*®ЇабвгдежзийклмнопЂЃ‚ѓ„…р†‡?‰Љ‹ЊЌЋЏђ‘’“”•–—?™љ›њќћџ"
;переменная $a1 взята из ECHO "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" > C:\1.txt
$a2 = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
For $i = 1 To StringLen($aa)
 $k = StringInStr($a1, StringMid($aa, $i, 1))
 If $k>0 Then $aa = StringReplace($aa, $i, StringMid($a2, $k, 1))
Next
msgbox(0,'',$aa)


VelDmi 11-04-2006 08:11 426819

bogomolv
Спасибо, решил свою проблему так:
RunWait (@COMSPEC & ' /c chcp 1251 && netsh.exe interface ip dump > netsh.cfg', @SystemDir, @SW_HIDE)
Файл создается в нужной кодировке.

bogomolv 11-04-2006 11:48 426886

VelDmi
И это правильно! Что-то подобное и я тогда искал, но не доискал...

Sanja Alone 12-04-2006 01:48 427089

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 427527

Вложений: 2
bogomolv
Цитата:

Когда-то решал подобную проблему так
ИМХО AutoIT не лучший выбор для подобных задач - не поддерживает работу со стандартными потоками и тормозит на циклах. Для командных утилит хочется "нечто", обрабатывающее транзитный текстовый поток, в тырнете не нашел ничего подходящего, только для файлов... Сначала подумал про VBS - там есть поддержка StdIn и StdOut, но проще всего оказалось на Си. Вот что у меня получилось, пример:
Код:

type file1.txt | dos2win >file2.txt
ping 127.0.0.1 | dos2win >ping.log

Sanja Alone
Цитата:

Это я к тому, что способ неуниверсальный
Можно для надежности воткнуть chcp 866 вначале но и это не гарантия, есть утилиты выводящие только в Win-кодировке.

bogomolv 14-04-2006 07:31 427700

amel27
Цитата:

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

bogomolv 17-04-2006 09:15 428524

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 428599

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

saguna 20-04-2006 12:16 429950

всем привет!
вопрос: я заметил что скомпиленные в ехе скрипты во время своей работы занимают до 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 430033

bogomolv
Как задействовать в автоите функцию StdoutRead. Ибо версия 3 выдает - незнаю таковой!

bogomolv 20-04-2006 16:02 430046

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

NikLok 20-04-2006 16:34 430058

bogomolv
Спасибо! Ща скачаю!

Artya 25-04-2006 19:20 431552

а подскажите как в комбо загрузить текст из файла.
в файле каждая отдельная строка это какое то слово. например
слово1
слово2
слово3
и т.д.

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

Ptyuch 26-04-2006 16:15 431845

Никак не пойму: функция 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 431904

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 432608

Было бы красиво! ;) Только первый файл не выполняется: ошибок в скрипте нет, только вот:
Unable to execute an external program
Не удается найти указанный файл:
run("2.exe"&$a)

Без аргумента $a скрипт запускается. Any idea?

bogomolv 29-04-2006 11:49 432642

Ptyuch
Идей нет. Есть замечания.
Разве у меня написано run("2.exe"&$a)?

Ptyuch 29-04-2006 15:32 432699

Огромное спасибо!
%#! Даже в голову не пришло поставить пробел перед ". Может, где можно почитать про такой синтаксис? Потому что я иду дальше по схеме:
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 432715

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

Dirk Diggler 29-04-2006 16:41 432721

По старенькому пройдемся:
Цитата:

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

Цитата:

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

bogomolv 29-04-2006 18:49 432758

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 433194

Я пытаюсь перевести конвертер 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


NORIO 10-05-2006 07:51 436143

А кто нибудь знает как взять текст из TreeView, ListView и Listbox входящих в состав интерфейса других програм
(а не GUI сгенерированного autoit скриптом)?

VelDmi 10-05-2006 14:02 436280

Имеется программа Runpad Shell. У нее есть API.

API в основном используется клиентами программ контроля, хотя может быть полезным и для любых сторонних утилит.

Все функции реализованы ввиде COM-сервера.
Примеры использования для C, C++, Delphi находятся здесь

Общие замечания:
- доступ к функциям осуществляется через единый интерфейс IRunpadShell
- все функции возвращают S_OK в случае успеха и другие коды в противном случае
- функции не являются Unicode

Моя задача написать утилиту, которая бы использовала апи программы на автоит.
Примеры на C, C++, Delphi имеются, но я совершенно не понимаю в этих языках, а с автоит поладил.
Возможно ли написание такой программы на AutoIt?

Sanja Alone 11-05-2006 03:22 436573

NORIO
Цитата:

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

VedunO 12-05-2006 21:46 437339

StringRegExp - не работает :(
 
Вложений: 1
Пытаюсь разобраться с регулярными выражениями в AutoIt, но не получается :(

Следующий код не работает:

Код:

Local $sPattern, $sTest, $vResult, $nFlag

$sPattern = InputBox("StringRegExp Sample", "What is the pattern to test?")
$sTest = InputBox("StringRegExp Sample", "What is the line to test?")
$vResult = StringRegExp ($sTest, $sPattern)
Select
Case @Error = 2
    ; Error.  The pattern was invalid.  $vResult = position in $sPattern where error occurred.
Case @Error = 0
  if @Extended  Then
      ; Success.  Pattern matched.  $vResult matches @Extended
  Else
      ; Failure.  Pattern not matched.  $vResult = ""
  EndIf
EndSelect
MsgBox(0, "", $vResult)

Не работает, выпадает окошко (во вложении)

Что я делаю не так ???

XXXler 15-05-2006 13:17 438219

VedunO, функцию по-ходу убрали (во всяком случае в 3.1.1 ее уже нет)

Никто не в курсе - в будующих версиях планируется ли введение в функцию FindFirstFile() рекурсивного просмотра (с вложенными папками)?

Sanja Alone 16-05-2006 03:39 438523

VedunO
Цитата:

Что я делаю не так
Судя по скриншоту - пытаешься исп-ть более раннюю версию AutoIt не знающую данную ф-цию. Или не загрузил обновление для SciTE, в к-ром будут прописаны новые ф-ции.

XXXler
Цитата:

функцию по-ходу убрали (во всяком случае в 3.1.1 ее уже нет)
Точнее сказать - добавили, а в 3.1.1 ее еще нет.

The public history for AutoIt v3
Full technical log including beta versions

XXXler 16-05-2006 11:13 438572

Sanja Alone,
Цитата:

Точнее сказать - добавили, а в 3.1.1 ее еще нет.
странно, в русской справке к v3.1.0 она упоминается

Sanja Alone 17-05-2006 02:03 438852

XXXler
Цитата:

странно, в русской справке к v3.1.0 она упоминается
Это весьма забавный момент: в англ. справке к версии 3.1.1 этой ф-ции нет, но ее знает SciTE (с дефинишенами для AutoIt версии 3.1.1). Т.е., по идее, в 3.1.1 ф-ция должна быть, но, при попытке запуска скрипта вылазит окошко с ошибкой (неизвестное имя ф-ции) - тут явно авторы AutoIt намудрили...

Apple58 19-05-2006 23:54 440075

Подскажите, как запустить процесс с параметром снятого атрибута ONTOP.
Сам процесс - это окошко с атрибутом ONTOP.
Если ждать появления окна а потом с помощью WinSetState снять атрибут ONTOP, то оно успевает вылезти на самый верх, после чего убирается.

Да, заодно еще вопросик.
Сможет ли, запущенный процесс со снятым атрибутом ONTOP, запускать окошки с атрибутами ONTOP?
А эту проблемку можно обойти?

Dirk Diggler 21-05-2006 03:28 440467

Я использую Send для посылки текстати типа "xUSSR"
Код:

Send("xUSSR")
Но это работает только когда раскладка английская. Как сделать так, чтобы и в русской и прочих раскладках посылалось именно то, что написано?

bogomolv 21-05-2006 06:15 440477

Dirk Diggler
Цитата:

Я использую Send...
А я использую Поиск...
Поэтому знаю, что проблема легко решается с помощью clipboard. :)

Dirk Diggler 21-05-2006 13:22 440552

Какой еще клипборд в консольных приложениях типа окна cmd.exe????

bogomolv 22-05-2006 08:56 440794

Dirk Diggler
Такой: http://forum.oszone.net/post-424899-108.html. Это ответ на твой первый вопрос.
И такой: http://forum.oszone.net/post-428524-126.html. Это - на второй.

Dirk Diggler 22-05-2006 09:57 440813

Ни первая, ни вторая ссылка не в тему. Не работает вставка клипборда в консольное окно. Dixi. Нужен другой способ.
Особенно я не понял, причем тут Stdout

bogomolv 22-05-2006 20:13 441060

Dirk Diggler
Код:

WinWaitActive('Командная строка')
ClipPut('xUSSR')
MouseClick('right')
Send('а')

Я на все вопросы ответил? Спасибо за внимание.

Dirk Diggler 23-05-2006 12:39 441299

Нет. Ибо в моей практике 20% консольных окон не выкидывают контекстного меню. Пришлось доработать, но не в этом суть.. А в том, что всё это как-то через задницу. Результат - скрипт для регистрации nnbackup

Код:

$Dir = @ProgramFilesDir & "\NNbackup"
$SF= "nnbackup xReg"       


Opt        ("WinTitleMatchMode",        2)        ;1=start, 2=subStr, 3=exact, 4=...]
Opt        ("MouseCoordMode",        0)
Opt ("TrayIconDebug",1)

#include <Date.au3>


$iWeekday = _DateToDayOfWeek (@YEAR, @MON, @MDAY)

Select
    Case $iWeekday = 1
            $Day="воскресенье"
    Case $iWeekday = 2
            $Day="понедельник"
    Case $iWeekday = 3
            $Day="вторник"
    Case $iWeekday = 4
            $Day="среда"
    Case $iWeekday = 5
            $Day="четверг"
    Case $iWeekday = 6
            $Day="пятница"
    Case $iWeekday = 7
            $Day="суббота"
EndSelect


$TEMP = @WorkingDir
FileChangeDir ($Dir)
Run($SF)
WinWaitActive("nnbackup.exe")
;Sleep ( 1000 )
ClipPut('xUSSR регистрация')
MouseMove(10,10,0)
MouseClick('right')
Send("{DOWN 7}{RIGHT}{DOWN 2}{ENTER 2}")
ClipPut($day )
Sleep (500 )
MouseClick('right')
Send("{DOWN 7}{RIGHT}{DOWN 2}{ENTER 2}")


bogomolv 23-05-2006 20:10 441509

Dirk Diggler
Твоя задачка напомнила что-то подозрительно знакомое. Вспомнил - SlyControl...
Хоть давно им не пользуюсь, удалось разыскать у себя в архиве скрипт:
Код:

RunWait('regedit /s "' & $pDir & 'Sly.reg"')
If @MON=01 Then $mnc='югбоьт'
If @MON=02 Then $mnc='хлбюмеч'
If @MON=03 Then $mnc='ноуь'
If @MON=04 Then $mnc='ббулзт'
If @MON=05 Then $mnc='нок'
If @MON=06 Then $mnc='йрот'
If @MON=07 Then $mnc='йрит'
If @MON=08 Then $mnc='бмаээь'
If @MON=09 Then $mnc='рлоьупыт'
If @MON=10 Then $mnc='пдсснюч'
If @MON=11 Then $mnc='маьпьт'
If @MON=12 Then $mnc='елйонюч'
RegWrite('HKEY_CURRENT_USER\Software\SlyDiman\SlyControl2', 'xUSSR', 'REG_SZ', $mnc)


VedunO 24-05-2006 18:23 441951

Не могу понять, как работает функция "InetGet", пишу:

Код:

FtpSetProxy(1)    ; прокси не используется
InetGet ("ftp://user:password@10.1.1.18/file.ext", "D:\file.ext", 1)

... и ничего

P.S. вбиваю этот же адрес в Internet Explorer (v6.0) и все работает отлично, пока пользуюсь внешним WGET-ом

Solitude 28-05-2006 02:27 443311

Подкажите как в AutoIt скрипте дождаться появления некотрого файла, тоесть выполнение скрипта надо продолжить только тогда как появиться конкреткный файл ???

Monarhia 28-05-2006 03:45 443320

1) Можно ли замениь значок который светитса в панели здач?
2) Какой командой возможно открыть порт?

godoo 29-05-2006 14:05 443775

Monarhia, по первому вопросу: в Aut2Exe смотри в раздел Options -> Custom Icon.

Sanja Alone 29-05-2006 21:36 443955

Solitude
Цитата:

выполнение скрипта надо продолжить только тогда как появится конкретный файл
Способ 1 (ожидание с прерыванием основной программы)
Код:

While 1
If FileExists ('disk:\path\filename.ext') Then
...
действия, производимые после появления файла
...

EndIf
;интервал проверок (в данном примере - 2 с)
Sleep (2000)
WEnd

Или
Код:

While FileExists ('disk:\path\filename.ext')=0
Sleep (2000)
WEnd
...
действия, производимые после появления файла
...

Или
Код:

Do
Sleep (2000)
Until FileExists ('disk:\path\filename.ext')=1
...
действия, производимые после появления файла
...

Способ 2 (ожидание на фоне основной программы)
Код:

AdlibEnable('fe',2000)
...
Func fe()
If FileExists ('disk:\path\filename.ext') Then
...
действия, производимые после появления файла
...

EndIf
EndFunc


Monarhia 05-06-2006 09:11 446546

А нельзя компилировать с путём к файлу, а он компилируетса со скриптом, типо одним целым становятса?
Хотябы картинку можно вставить?

godoo 05-06-2006 11:01 446616

Monarhia Иконки, которые отображаются в трее хранятся в AutoIt3.exe. Можно попробовать скорректировать редактором ресурсов - но это не выход. Иконка будет другая, но опять-же одна. Проще всего просто скрыть иконку в трее.

adima 08-06-2006 10:58 448321

Не подскажет ли кто как организовать индикатор процесса установки (типа бегунка или любой другой) для данной команды

RunWait (@ScriptDir & '\wmp10.exe /q:A /c:"setup_wm.exe /Q /R:N /DisallowSystemRestore"')

desperate 15-06-2006 01:52 450763

извините если пишу немного не сюда, просто у меня не одна ссылка на скачивание самой программы AutoIT3 не работает.... ктобы мог поделиться этой прогой и прислать мне ее на niro@lipetsk.ru заранее спасибо

Redisych 15-06-2006 16:02 451030

Объясните, что за функции Visa Management? В первый раз с таким сталкиваюсь.
И ещё, есть ли возможность как-то работать с железом - COM портом, USB, и т.д.

bogomolv 18-06-2006 10:03 452129

adima
А чем тебя не устраивают ранее предлагавшиеся варианты? Особенно много вариантов (с активным обсуждением!) было в прародительнице этой темы.

desperate
Только что проверил ссылки: http://www.autoitscript.com/autoit3/downloads.php, http://www.autoitscript.com/autoit3/files/beta/autoit/
Работают!

Redisych
Про Visa Management ничего не знаю. Узнаешь сам - не забудь отписаться сюда и поделиться.
Про работу с железом. Не понял, что ты имеешь ввиду, но скорее всего тебе поможет использование в скриптах MS-овской утилитки devcon (http://support.microsoft.com/kb/311272/ru).

Redisych 20-06-2006 22:22 452816

bogomolv
Хочется обработки сигналов, например, с COM порта, а ещё генерацию произвольных сигналов.

bogomolv 21-06-2006 07:54 452913

Redisych
Могу лишь процитировать AutoIt Help:
Цитата:

AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI.

Redisych 21-06-2006 08:09 452916

Надеюсь, что дойдёт и до остального, раз приличный конструктор GUI приделали. Я, если честно, когда начал осваивать язык, и не думал, что изначально он предназначался для "автокликанья". Хотелось бы услышать об опыте написания "классических" приложений и о перспективе такого подхода. Стоит ли, или лучше изучить языки, на которых пишет большинство?

Redisych 21-06-2006 08:32 452924

Вот ведь, как чувствовал, что Visa близко к моим потребностям. Нашёл на их форуме такое:
Цитата:

Basically GPIB allows you to control instruments like Power Supplies, Signal Generators, Oscilloscopes, Signal Generators, etc. You need to install or connect a GPIB interface card (PCI, PCMCIA or USB) to your PC and install the corresponding GPIB driver.

VISA is a standard API that sits on top of the GPIB driver and it allows you to use the same programs to control your instruments regardless of the type of GPIB card that you have installed in your PC (most cards are made either by National Instruments or by Agilent/Hewlett-Packard).
Остаётся разобраться, что за GPIB interface card
bogomolv, кстати, мои соболезнования по поводу вентилятора. А мы соседи, я в городе химиков, энергетиков и строителей...

SyCraft 23-06-2006 18:47 454194

а как в Auto IT сделать GUI, очень много прочел про то как описывается сам GUI но вот как назначить его элементам те или иные действия мне не ясно..

XXXler 23-06-2006 19:01 454198

После прорисовки GUI гоняешь цикл:
Код:

While 1
        $msg = GuiGetMsg()
        ....
        ....
WEnd

В теле цикла проверяешь какой елемент послал сообщение:
Код:

Select
        Case $msg=$GUI_EVENT_CLOSE
                Exit
        Case $msg=$Имя_елемента_1
                ....
        Case $msg=$Имя_елемента_2
                ....
        ....
                EndSelect
        EndSelect

и соответственно обрабатываешь.
Взять значение с елемента можно с пом. GUICtrlRead(), установить - GUICtrlSetData(), GUICtrlSetState() и т.д. - все можно найти в справке

vasin 23-06-2006 23:55 454305

Вложений: 1
Проблемка со скриптом для создания Dial-up подключения..
Суть проблемы в том что не всегда "ставиться" галка "использовать правила набора номера"..
Вот скрипт с пометками автора... Может кто-нибудь может что-то добавить/изменить..




SyCraft 24-06-2006 01:42 454330

XXXler
Спасибо буду разбираться!!!

bogomolv 24-06-2006 06:44 454353

vasin
Так проще:
Код:

;Настройка "Свойства" соединения
$pbk='@AppDataCommonDir@\Microsoft\Network\Connections\Pbk\rasphone.pbk'
$co=IniReadSectionNames($pbk)
For $i=1 to $co[0]
 IniWrite ($pbk, $co[$i], 'DataEncryption',                '8')
 IniWrite ($pbk, $co[$i], 'ShowMonitorIconInTaskBar',        '1')
 IniWrite ($pbk, $co[$i], 'ConnectBPS',                '460800')
 IniWrite ($pbk, $co[$i], 'Speaker',                        '0')
 IniWrite ($pbk, $co[$i], 'AreaCode',                $cod)
 IniWrite ($pbk, $co[$i], 'CountryCode',                $ccod)
 IniWrite ($pbk, $co[$i], 'CountryID',                $ccod)
 IniWrite ($pbk, $co[$i], 'UseDialingRules',                '1')
Next


SyCraft 24-06-2006 11:06 454391

XXXler
Скажи а как скажем зделать что бы скажем было 2-е строки ввода пути
10 чек боксов, и кнопка старта. Идея копирование из источника в получатель тех групп файлов которые отмечены чек боксом, при нажатии на кнопку Старт но с возможностью отмены!
Такое возможно зделать?

XXXler 24-06-2006 13:22 454445

SyCraft
Если я правильно понял про отмену (одна для всех перед копированием) то долно получится примерно так:
Код:

While 1
$msg = GuiGetMsg()
If $msg=$GUI_EVENT_CLOSE Or $msg=$Имя_кнопки_отмены Then
Exit (или ExitLoop)
ElseIf $msg=$Имя_кнопки_старт Then
GUISetState(@SW_HIDE)
TrayTip("Идет копирование файлов","Дождитесь окончания копирования файлов",1,1)
$FirstPath=GUICtrlRead($Имя_елемента_ввода_1)
$SecondPath=GUICtrlRead($Имя_елемента_ввода_2)

If GUICtrlRead($чек_бокс_1)=1 Then
....
EndIf

If GUICtrlRead($чек_бокс_2)=1 Then
....
EndIf

....

If GUICtrlRead($чек_бокс_n)=1 Then
....
EndIf

Exit (или ExitLoop)
EndIf
WEnd


SyCraft 24-06-2006 23:55 454548

XXXler
Спасибо!!!

SyCraft 25-06-2006 16:12 454654

Вот что получаеться, но при компиляции вываливаеться с ощибкой, подскажи пожалуйста что я напутал?
Код:

#include <GUIConstants.au3>

;Получаем переменные Opera AC
$AC_OPERA = RegRead ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "AC_OPERA")
$AC_SOURCH = RegRead ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "AC_SOURCH")

While 1
$msg = GuiGetMsg()
If $msg = $GUI_EVENT_CLOSE
        Or $msg = $Close Then
        ExitLoop

ElseIf $msg = $Start Then
        GUISetState(@SW_HIDE)
TrayTip("Идет копирование файлов","Дождитесь окончания копирования файлов",1,1)

$FirstPath=GUICtrlRead($Input)
$SecondPath=GUICtrlRead($Output)

$Form1 = GUICreate("AForm1", 659, 352, 214, 146)
$Pic1 = GUICtrlCreatePic("D:\Project\Soft\Opera$\Create\WizModernImage-IS.BMP", 8, 0, 153, 345)

GUICtrlCreateLabel("Источник", 176, 8, 52, 17)
$Input = GUICtrlCreateInput("AInput1", 176, 24, 425, 21, -1, $WS_EX_CLIENTEDGE)
GUICtrlCreateLabel("Получатель", 176, 56, 63, 17)
$Output = GUICtrlCreateInput("AInput2", 176, 72, 425, 21, -1, $WS_EX_CLIENTEDGE)

$Bookmaarks = GUICtrlCreateCheckbox("ACheckbox1", 184, 112, 97, 17)
$Notes = GUICtrlCreateCheckbox("ACheckbox2", 184, 136, 97, 17)
$cookies = GUICtrlCreateCheckbox("ACheckbox3", 184, 160, 97, 17)
$wand = GUICtrlCreateCheckbox("ACheckbox4", 184, 184, 97, 17)
$vlink4 = GUICtrlCreateCheckbox("ACheckbox5", 184, 208, 97, 17)
$global = GUICtrlCreateCheckbox("ACheckbox6", 184, 232, 97, 17)
$download = GUICtrlCreateCheckbox("ACheckbox7", 184, 256, 97, 17)
$cache = GUICtrlCreateCheckbox("ACheckbox8", 184, 280, 97, 17)

$Start = GUICtrlCreateButton("AButton1", 328, 312, 113, 25)
$Close = GUICtrlCreateButton("AButton2", 544, 312, 105, 25)

GUICtrlCreateLabel("Закладки", 288, 112, 315, 17)
GUICtrlCreateLabel("Заметки", 288, 136, 315, 17)
GUICtrlCreateLabel("Куки", 288, 160, 315, 17)
GUICtrlCreateLabel("Пароли жезла", 288, 184, 315, 17)
GUICtrlCreateLabel("Набранные адреса", 288, 208, 315, 17)
GUICtrlCreateLabel("История посещений", 288, 232, 315, 17)
GUICtrlCreateLabel("История закачек", 288, 256, 315, 17)
GUICtrlCreateLabel("Кеш", 288, 280, 313, 17)
GUISetState(@SW_SHOW)

If GUICtrlRead($Bookmaarks) = 1 Then
DirCreate("$SecondPath")
FileCopy("$FirstPath\profile\opera6.adr", "$SecondPath\profile\",1)
EndIf

If GUICtrlRead($Notes) = 1 Then
DirCreate("$SecondPath")
FileCopy("$FirstPath\profile\notes.adr", "$SecondPath\profile\",1)
EndIf

If GUICtrlRead($cookies) = 1 Then
DirCreate("$SecondPath")
FileCopy("$FirstPath\profile\cookies4.dat", "$SecondPath\profile\",1)
EndIf

If GUICtrlRead($wand) = 1 Then
DirCreate("$SecondPath")
FileCopy("$FirstPath\profile\wand.dat", "$SecondPath\profile\",1)
EndIf

If GUICtrlRead($global) = 1 Then
DirCreate("$SecondPath")
FileCopy("$FirstPath\profile\global.dat", "$SecondPath\profile\",1)
EndIf

If GUICtrlRead($download) = 1 Then
DirCreate("$SecondPath")
FileCopy("$FirstPath\profile\download.dat", "$SecondPath\profile\",1)
EndIf

If GUICtrlRead($cache) = 1 Then
DirCreate("$SecondPath")
DirCopy("$FirstPath\profile\cache4\", "$SecondPath\profile\cache4\",1)
EndIf

ExitLoop

EndIf
Wеnd


Creat0R 06-07-2006 18:42 458593

Всем доброго времени суток!

У меня возникла следущая проблема:

Я создал скрипт, который вызывает окно где можно выбрать каталог, и затем скрипт вписывает результат выбора в файл.
Вот его состав:

Код:

$var = FileSelectFolder("Вибирите каталог...", "")

If @error Then
    Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(292,"?","Вы уверенны")
Select
  Case $iMsgBoxAnswer = 6;Yes

  Case $iMsgBoxAnswer = 7;No
EndSelect
Else
    $var = StringReplace($var, "|", @CRLF)
    MsgBox(4096,"","You chose " & $var)
    FileWrite ( "file.tmp", $var )
EndIf

Теперь вопрос:
Как я могу сделать так, что если в том окне, которое появится после нажатия на 'Отмена' (в первом окне), пользователь нажимает в нём 'Нет', то будет запущено первое окно снова. Т.е нужно как-то вернуться на метку, которая будет стоять перед выводом первого окна.

P.S:
Я знаю что существует команда Wend и она как-то связанна с командой While = - Но как ей пользоваться, т.е как её подставлять в скрипт, я беспонятия

Creat0R 06-07-2006 19:30 458609

Есть ещё вопрос:
Можно ли каким-то образом, конвертировать скрипт Bath (файла *.bat), в скрипт AutoIT?

bogomolv 06-07-2006 21:33 458663

SyCraft
Цитата:

Вот что получаеться, но при компиляции вываливаеться с ощибкой, подскажи пожалуйста что я напутал?
Насажал ошибок, причем не только в каждом слове этого сообщения, но и в скрипте :)
В частности, неправильно пишешь имена переменных внутри строки:
вместо "$FirstPath\profile\notes.adr",
нужно писать $FirstPath&"\profile\notes.adr"
или "$FirstPath$\profile\notes.adr" (в последнем случае нужно задать Opt("ExpandVarStrings",1)).

Creat0R
1) Нужная тебе конструкция While... Wend подробно и с примерами описана в AutoIt Help. Лучше, чем там, тебе никто не объяснит.
2) Конверторов скриптов Bath в скрипт AutoIT нет и не будет.

Creat0R 07-07-2006 00:09 458701

bogomolv
Цитата:

1) Нужная тебе конструкция While... Wend подробно и с примерами описана в AutoIt Help.
Вот пример который описан в справке:

Код:

Пример

$i = 0
While $i <= 10
    MsgBox(0, "Значение $i равно:", $i)
    $i = $i + 1
WEnd

С этого примера, и с описании которые в справке, мне трудно понять, каким образом в моём скрипте, будет возвращено управление на метку в начало скрипта?! я пробовал так, но не работает, пишет ошибка в команде wend:

Код:

While $iMsgBoxAnswer = 7
$var = FileSelectFolder("Select a folder.", "")
If @error Then
Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(292,"Msg","you sure?")
Select
  Case $iMsgBoxAnswer = 6 ;Yes

  Case $iMsgBoxAnswer = 7 ;No

EndSelect
Wend
Else
        $var = StringReplace($var, "|", @CRLF)
       
        MsgBox(64,".....","Вы выбрали:  " & $var)
        FileWrite ( "c.tmp", $var )
EndIf

Тут, где команда While $iMsgBoxAnswer = 7, нужно чобыы туда происходил переход в том случае, если была нажата кнопка No
Цитата:

Лучше, чем там, тебе никто не объяснит.
А может всё-таки ты сможешь лучше объяснить? плиз? - очень очень нужно.

SyCraft 07-07-2006 00:50 458707

Ну вроде все исправил.. но тепрь такая проблема.. после нежатии кнопки начала копирования, копирование не происходит, просто выскакивает информационное окно о начале процеса все..
Не подскажите где я вновь учудил?
Код:

#include <GUIConstants.au3>

;Получаем переменные Opera AC
$AC_OPERA = RegRead ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "AC_OPERA")
$AC_SOURCH = RegRead ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "AC_SOURCH")

$Form1 = GUICreate("AForm1", 659, 352, 214, 146)
$Pic1 = GUICtrlCreatePic("D:\Project\Soft\Opera$\Create\WizModernImage-IS.BMP", 8, 0, 153, 345)
$Bookmaarks = GUICtrlCreateCheckbox("Закладки", 184, 112, 97, 17)
$Notes = GUICtrlCreateCheckbox("Заметки", 184, 136, 97, 17)
$cookies = GUICtrlCreateCheckbox("Куки", 184, 160, 97, 17)
$wand = GUICtrlCreateCheckbox("Пароли жезла", 184, 184, 97, 17)
$vlink4 = GUICtrlCreateCheckbox("Набранные адреса", 184, 208, 97, 17)
$global = GUICtrlCreateCheckbox("История посещений", 184, 232, 97, 17)
$download = GUICtrlCreateCheckbox("История закачек", 184, 256, 97, 17)
$cache = GUICtrlCreateCheckbox("Кеш", 184, 280, 97, 17)
GUISetState(@SW_SHOW)

$Start = GUICtrlCreateButton("Go", 328, 312, 113, 25)
$Close = GUICtrlCreateButton("Exit", 544, 312, 105, 25)

GUICtrlCreateLabel("Источник", 176, 8, 52, 17)
$Input = GUICtrlCreateInput($AC_SOURCH, 176, 24, 425, 21, -1, $WS_EX_CLIENTEDGE)
GUICtrlCreateLabel("Получатель", 176, 56, 63, 17)
$Output = GUICtrlCreateInput($AC_OPERA, 176, 72, 425, 21, -1, $WS_EX_CLIENTEDGE)

$SecondPath=GUICtrlRead($Output)
$FirstPath=GUICtrlRead($Input)

While 1
$msg = GuiGetMsg()
If $msg = $GUI_EVENT_CLOSE  Or $msg = $Close Then
        Exit
ElseIf $msg = $Start Then
        MsgBox("Идет копирование файлов","Дождитесь окончания копирования файлов", "Дождитесь окончания копирования файлов",1)
EndIf

Opt("ExpandVarStrings",1)

If GUICtrlRead($Bookmaarks) = 1 Then
        FileCopy("$FirstPath$\profile\opera6.adr", "$SecondPath$\profile\*.*",1)
        EndIf

If GUICtrlRead($Notes) = 1        Then
        FileCopy("$FirstPath$\profile\notes.adr", "$SecondPath$\profile\*.*",1)
        EndIf

If GUICtrlRead($cookies) = 1 Then
        FileCopy("$FirstPath$\profile\cookies4.dat", "$SecondPath$\profile\*.*",1)
        EndIf

If GUICtrlRead($wand) = 1 Then
        FileCopy("$FirstPath$\profile\wand.dat", "$SecondPath$\profile\*.*",1)
        EndIf

If GUICtrlRead($global) = 1 Then
        FileCopy("$FirstPath$\profile\global.dat", "$SecondPath$\profile\*.*",1)
        EndIf

If GUICtrlRead($download) = 1 Then
        FileCopy("$FirstPath$\profile\download.dat", "$SecondPath$\profile\*.*",1)

If GUICtrlRead($cache) = 1 Then
        DirCopy("$FirstPath$\profile\cache4\", "$SecondPath$\profile\cache4",1)
        EndIf

EndIf
WEnd


bogomolv 07-07-2006 08:33 458766

Creat0R
Ты не понимаешь суть базового понятия "цикл".
+
Несколько раз перечитал твое
Цитата:

Как я могу сделать так, что если в том окне, которое появится после нажатия на 'Отмена' (в первом окне), пользователь нажимает в нём 'Нет', то будет запущено первое окно снова. Т.е нужно как-то вернуться на метку, которая будет стоять перед выводом первого окна.
В твоем описании задачи все окна "первые"...

Поэтому могут лишь подправить твой скрипт:
Код:

While 1
$var = FileSelectFolder("Select a folder.", "")
If NOT @error Then
  $iMsgBoxAnswer = MsgBox(292,"Msg","you sure?")
  Select
    Case $iMsgBoxAnswer = 6 ;Yes
      $var = StringReplace($var, "|", @CRLF)
      MsgBox(64,".....","Вы выбрали:  " & $var)
      FileWrite ( "c.tmp", $var )
      Exit
    Case $iMsgBoxAnswer = 7 ;No
    Case Else
      Exit
  EndSelect
Else
  Exit
EndIf
Wend

SyCraft
Цитата:

Не подскажите где я вновь учудил?
Везде:
1. У оператора MsgBox другой синтаксис MsgBox(0,"", "",1)
2. Считывать значения редактируемых переменных нужно в цикле
Код:

While 1
$msg = GuiGetMsg()
$SecondPath = GUICtrlRead($Output)
$FirstPath = GUICtrlRead($Input)
...

3. Следи за условными переходами! У тебя $cache будет копироваться только, если копируется $download!
Сделай так:
Код:

While 1
...
If $msg = $GUI_EVENT_CLOSE  Or $msg = $Close Then
        Exit
ElseIf $msg = $Start Then
      MsgBox(0,"Идет копирование файлов","Дождитесь окончания копирования файлов",1)
      If GUICtrlRead($Bookmaarks) = 1 Then
              ...
              EndIf
      ...
EndIf
WEnd

4. Учись отлаживать свои скрипты сам! Мне очень помогает вставка в проверяемое место MsgBox(0,"", "",1).
Например, в твой скрипт я вставил вместо FileCopy("$FirstPath$\profile\opera6.adr", "$SecondPath$\profile\*.*",1)
проверку MsgBox(0,"","$FirstPath$\profile\opera6.adr TO $FirstPath$\profile\*.*").
Тут же все твои косяки вылезли наружу.
5. Много мелких недочетов. В частности, зачем циклишь объявление опции Opt("ExpandVarStrings",1)? Обычно это делается в начале скрипта.

SyCraft 07-07-2006 09:39 458783

bogomolv
Спасибо, ты уж не взыщи просто я далек от программирования и только учусь!!!
Спасибо тебе!

Creat0R 07-07-2006 10:59 458814

bogomolv
Огромное тебе спасибо! Всё так как и нужно было! :bye:
Я кажется понял суть работы команд Wend и While - Всё что находится между ними, будет выполняться до тех пор, пока значение одной из команд будет ровно 0 (или любое другое кроме 1 - если есть такого), но как я понял, это в случае если у команды While присутствует значение 1 (While = 1). А какие ещё есть возможности её использования?

У меня есть пару вопросов:

1) Как осуществлять поиск существующего пути\каталога, и затем произвести определённое действие?
Т.е, вот например команда $search = FileFindFirstFile("file.tmp"), произведёт поиск файла file.tmp.
А если сделать так:
Код:

$search = FileFindFirstFile("File.tmp")
If $search = -1 Then
MsgBox(0, "Error", "File was not found")
    Exit
EndIf

То в случае если файл не найден, будет выведенно сообщение.
Но мне вообще-то нужно, чтобы был поиск не файла, а каталога\пути (или даже будет лучше, если значения $var). Примерно так я себе это представляю:
Код:

$search = FileFindFirstFile("$var")
If $search = -1 Then
Тут нужно перейти в начало файла (думаю вместо этой строки поставить просто wend, а в строке выше, поменять -1 на 0, так?)

2) Как во время выполнения сценария, можно спрятать окно другого-запущенного приложения? (в данном случае - *.bat файл). Т.е чтобы сам скрипт, какой то командой, скрыл запущенное окно командной строки. Или хотябы сделать так, чтобы запущенное окно (Bath файла) самим скриптом AutoIt, было скрыто в момент его (батника) запуска!

Dirk Diggler 07-07-2006 11:52 458846

в хелпе все написано. Ох, батенька, взяли бы какую-нть книжку по информатике для 9 класса.

Creat0R 07-07-2006 13:01 458887

Dirk Diggler
Цитата:

в хелпе все написано.
Не всё, и не понятно! :no: (уж извените) - а книжка по информатике чем мне поможет? как правильно восспринимать информацию с хелпов? думаю тут ни это нужно... мне нужна практика (ведь как известно, одна лишь практика даёт желаемые результаты почти в любом деле - а в програмировании тем более)... читать и понимать написанное, я умею, вот если бы написанно было кем-то не очень ленивым (или занятым?) чувалеком, было бы легче понимать. Ясное дело, что тем кто уже знает толк в этом деле (да и в любом другом), легче рассуждать и утверждать, что в хелпе, и в факе, и ещё где, написанно всё понятно - хотя для такого, можно сказать - чайника в сфере программирования как я сам, то что там пишут, и так как это пишут, далеко не понятно! (по крайней мере не всё!).
Имхо, справку, которую переделали на русский, как будто с помощью словаря переделывали. Не то чтобы автор этой справки не знает английского, или программирования в AutoIt, я вовсе этого не утверждаю, просто считаю что можно было бы приложить немного больше усилии, ради такой весчи - как помощь по AutoIt'у!).

P.S:
Извеняюсь за офтоп! (если он таков есть).

Dirk Diggler 08-07-2006 00:27 459037

книжка поможет освоить базовые понятия программирования.
2ALL Написал тут скрипт VBS-> AU3. Ничего особенного, просто закатывает VBS в AU3, а тот пишет его в темп и запускает. Какую длину потянет - не проверял. Да и всякие ситуации хэндлятся не особо. Но мне достаточно, я более доделывать не буду. Работает из командной строки
script.au3 vbsname.vbs Au3name.au3
при отсутсвии параметров или только второго запросит соот-но оба или один в виде виндового диалога. Запрос на перезапись не дает.
Код:

Global $filename
Global $vbs
Global $vbshandle
Global $au3handle
Global $au3filename
Global $Line
Global $error

   
$func = 'Func RunVBS( $vbs)  ' & @CRLF  _ 
& ' Local $batname= "temp"& @MIN & @SEC & ".bat"  ' & @CRLF  _
& ' Local $vbsname= "temp"& @MIN & @SEC & ".vbs"  ' & @CRLF  _
& ' FileDelete(@TempDir & "\" & $vbsname)  ' & @CRLF  _
& ' FileWrite(@TempDir & "\" & $vbsname  , $vbs)  ' & @CRLF  _
& ' FileWrite(@TempDir & "\" & $batname, $vbsname)  ' & @CRLF  _
& ' sleep(1000)  ' & @CRLF  _
& ' RunWait( @ComSpec &' & " ' /c" & ' "' & "'& @TempDir & '\' & $batname &" & "'" &  '"' &  "'" & ',@TempDir,@SW_HIDE)  '  & @CRLF  _ 
& ' FileDelete(@TempDir & "\" & $vbsname )  ' & @CRLF  _
& ' FileDelete(@TempDir & "\" & $batname) ' & @CRLF  _
& ' EndFunc'


If $cmdline[0] =0 Then
        $filename = FileOpenDialog("Choose vbs", @HomeDrive,"VBScript (*.vbs)", 1)
        if @error = 1 Then
            MsgBox(0,"Error","Wrong filename or file error")
            Exit
        EndIf
       
    Else
        $filename = $cmdline[1]
EndIf

$vbshandle =FileOpen($filename,0)
If $vbshandle = -1 Then
    MsgBox(0,"Error","vbs file read error")
    Exit
EndIf
   
if $cmdline[0]>1 Then
    $au3filename = $cmdline[2]       
Else
    $au3filename = FileSaveDialog("Enter au3 filename", @HomeDrive,"AutoIt3 (*.au3)",0, "vbs.au3")
    if @error = 1 Then
            MsgBox(0,"Error","Wrong filename or file error")
            Exit
    EndIf
EndIf

$au3handle =FileOpen($au3filename,2)
If $au3handle = -1 Then
    MsgBox(0,"Error","Au3 file write error")
    Exit
EndIf
$Line = " $vbsscript = '" & FileReadLine($vbshandle)
FileWrite($au3handle,  $Line)
SetError(0)
While $error <> -1
    $Line = FileReadLine($vbshandle) 
    $error = @error
    if ($error <> -1) And StringStripWS($Line,8) <> ""  Then 
        FileWrite($au3handle, "' & @CRLF  _ " & @CRLF)
       
    EndIf
    if StringStripWS($Line,8) <> "" Then
        $Line = "& '" & $Line   
    Else
        ContinueLoop
    EndIf
    FileWrite($au3handle,  $Line)   
WEnd   
    FileWrite($au3handle,"'")
    FileWrite($au3handle,@CRLF & @CRLF)
    FileWrite($au3handle,"RunVBS($vbsscript)")
    FileWrite($au3handle,@CRLF & @CRLF)
   
    FileWrite($au3handle,$func)
FileClose($vbshandle)
FileClose($au3handle)


bogomolv 08-07-2006 07:15 459079

Creat0R
Цитата:

Думаю вместо этой строки поставить просто wend, а в строке выше, поменять -1 на 0, так?
Ну так ставь! Вместо пустых простыней и споров, лучше бы двадцать раз перепопробовал все свои варианты. Глядишь бы, и понял, что Wend без While не бывает, да и много чего другого полезного узнал.
Цитата:

Как во время выполнения сценария, можно спрятать окно другого-запущенного приложения?
Shows, hides, minimizes, maximizes, or restores a window - WinSetState ( "title", "text", flag )

"Всему лучшему в себе я обязан книгам". А.М.Горький

VelDmi 08-07-2006 12:39 459142

Creat0R
Цитата:

Имхо, справку, которую переделали на русский, как будто с помощью словаря переделывали. Не то чтобы автор этой справки не знает английского, или программирования в AutoIt, я вовсе этого не утверждаю, просто считаю что можно было бы приложить немного больше усилии, ради такой весчи - как помощь по AutoIt'у!
Не удержался, так как считаю что сдесь ты не прав. Я не задаю сдесь кучу вопросов потому, что русификация справки ВЕЛИКОЛЕПНА! Может быть не идеал, но по сравнению с другими русификациями что я видел сделано очень хорошо. По крайней мере большинство вопросов решалось именно путем перечитывания справки.

PS А тебе действительно поможет учебник для начинающих, так как само понятие циклов, условных переходов и т.д. одинаково для всех языков и начинать нужно с изучения основ.

ANGRO 08-07-2006 14:29 459181

Попробовал решить проблему с выводом из CMD как предлогал bogomolv в 120 посте. Во первых если копировать код из инета то он не работает т.к. изменяется строка в $a1 надо брать именно по ECHO, но у меня и она не заработала пока не взял эту строку из GUI самого скрипта. Более того есть большое подозрение что на Win с MUI эта строка будет другой и вообще памятуя о проблемах с кодировками сделал запрос при запуске скрипта. Теперь $a1 будет генерироваться при запуске скрипта под каждой виндой заново.
Код:

#include <Constants.au3>
#NoTrayIcon
$f = "C:\test.txt"
$aa = FileRead($f, FileGetSize($f))
$a2 = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
    $cmdRun = Run(@ComSpec & " /c ECHO " & $a2, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
                $a1 = StdoutRead($cmdRun, -1)
For $i = 1 To StringLen($aa)
 $k = StringInStr($a1, StringMid($aa, $i, 1))
 If $k>0 Then $aa = StringReplace($aa, $i, StringMid($a2, $k, 1))
Next
msgbox(0,'',$aa)

P.S. Метод предложенный VelDmi в 121 посте не сработал при выводе в GUI скрипта.
Хотя здесь и писалось хочу напомнить что StdoutRead работает только в последних беттах.
P.P.S. bogomolv, VelDmi смотрел форум на сайте разработчиков, не нашёл таких решений как у Вас, хотя конечно все посты не читал но поиск поюзал основательно. Было бы неплохо закинуть код туда.

ANGRO 08-07-2006 15:05 459186

Creat0R хелп не ругай коли чайник. Я сам полный самовар в программировании, как здесь советовали пробую сотни вариантов кода и методом научного тыка пытаюсь разобраться. ИМХО читать не люблю особенно учебники. А объяснять основы программирования справка не обязанна. Если мозги текут отпишись в PM гуру, здесь люди отзывчивые помогут. А вообще для того чтобы писать листинги на чистом листе уходят годы обучения. Так что если не готов закажи нужную весч у знающих людей. Кстати справочку человек переводил бесплатно и нужно сказать спасибо за человекачасы и применённые знания.

Извените не удержался.

Creat0R 08-07-2006 17:39 459224

bogomolv
Цитата:

"Всему лучшему в себе я обязан книгам". А.М.Горький
А есть книги по AutoIt'у? (Хорошо, т.е понятно написанны).

Creat0R 08-07-2006 18:32 459236

ANGRO
Цитата:

хелп не ругай коли чайник.
Я и не ругал хелп. Конечно же огромное спасибо автору справки, просто я лично не узнал в ней то что мне нужно (также как и из справки которая сделана на английском) - Кстати, я если и возмущён по поводу этой справки, так это только по поводу того, что она не сильно информативна (та что на английском).


P.S:
А у автора этой справки, прошу искринние извинения, у меня небыло намеринии оскорблять, или ругать работу кого либо! -Просто как сказал ANGRO, я есть Чайник в сфере программирования (или самовар ;) )

ANGRO 08-07-2006 20:39 459273

Решил собрать на основе кода из 196 поста что нить полезное так сказать для проверки в драйв тесте.
Почему-то получился пинг :biggrin: .
Код:

#include <GUIConstants.au3>
#include <Constants.au3>
#NoTrayIcon
Opt("GUICloseOnESC", 0)
GUICreate("Пинг", 372, 304)
;GuiSetIcon("11.ico", 0)
$Edit1 = GUICtrlCreateEdit("", 2, 2, 370, 251, $ES_READONLY + $WS_VSCROLL, $WS_EX_CLIENTEDGE)
GUICtrlSetFont ($Edit1,10, 550, 0, "Lucida Console")
GuiCtrlSetBkColor($Edit1,0xf5f5f5)
GuiCtrlSetCursor($Edit1,2)
GuiCtrlCreateLabel("Домен или IP", 42, 257, 112, 20)
GuiCtrlCreateLabel("Кол-во запросов", 141, 257, 90, 20)
$Quant = GUICtrlCreateInput("5", 140, 279, 90, 20)
$Host = GUICtrlCreateInput("www.ru", 26, 279, 112, 20)
$Button_1 = GUICtrlCreateButton("Пинг", 240, 257, 105, 43)
;------------------------------------------------
$a2 = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
$cmdRun = Run(@ComSpec & " /c ECHO " & $a2, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
        $a1 = StdoutRead($cmdRun, -1)
;------------------------------------------------
GUISetState(@SW_SHOW)
; GUI BUTTON PROCESSING
Do
        $msgP = GUIGetMsg()
Select       
        Case $msgP = $Button_1
            $ip = GUICtrlRead($Host)
            $Quantity = GUICtrlRead($Quant)
                $PingI = Run(@ComSpec & " /c ping.exe -n "  & $Quantity & " " & $ip, @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
                While 1
                        $aa = StdoutRead($PingI, -1)
                        If @error = -1 Then ExitLoop
                        ;-------------------------------------
                                For $i = 1 To StringLen($aa)
                $k = StringInStr($a1, StringMid($aa, $i, 1))
                If $k>0 Then $aa = StringReplace($aa, $i, StringMid($a2, $k, 1))
                Next
                        ;-------------------------------------
                        GUICtrlSetData($Edit1, StringStripWS($aa, 1) & @crlf, 1)
                Wend
EndSelect
Until $msgP = $GUI_EVENT_CLOSE

Еслиб кто ещё прикрутил сюда кнопку стоп, а то я не додумался как выслать Control-C и главное куда.

Creat0R 10-07-2006 03:34 459622

Кто-то может мне помочь со следующей задачей:

Нужно запустить прогрессБар, и чтобы он автоматом закрылся, в тот момент как завершит свою работу определённый запущенный процесс в системе (а точнее запущеный скрипт *.bat файла) - и если возможно, то чтобы в окне прогресс бара, была видна бегущая надпись, с текстом который я выберу. (если нет, то хотябы поместить этот текст обычно, как в MsgBox).
Возможно таке осуществить?

Есть ещё вопрос:

При запуске диалога для выбора файла, возвращается значение в переменную $var (что-то в этом роде):
Код:

$var = FileOpenDialog("Выбирите архив...", "", "Zip (*.zip)")
Но когда я пытаюсь записать результат в файл:
Код:

FileWrite("c.tmp", $var)
То файл (c.tmp) сохраняется в том каталоге, где и был выбран архив.
Следовательно вопрос: Как мне осуществить сохранение файла (c.tmp), в текущем каталоге? т.е в том каталоге где и находится сам скрипт. Но чтобы ненужно было указывать полный путь, так как запускаться скрипт будет постоянно с разных мест.

XXXler 10-07-2006 12:04 459730

Цитата:

Как мне осуществить сохранение файла (c.tmp), в текущем каталоге? т.е в том каталоге где и находится сам скрипт. Но чтобы ненужно было указывать полный путь, так как запускаться скрипт будет постоянно с разных мест.
Смотри в списке макро папок (в данном случае @ScriptDir)
Код:

$var = FileOpenDialog("Выбирите архив...", "", "Zip (*.zip)")
FileWrite(@ScriptDir&"\c.tmp", $var)


DenchikK 12-07-2006 03:47 460484

Подскажите пожалуйста, как можно совместить работу такого (примерного)
скрипта. На основе поставленной в ней задачи, хочу научится некоторым
нужным впоследствии, рабочим скриптам. Так что не удевляйтесь
возможной несуразности его (скрипта) логики.

По частям он работает, но как совместить его работу, моего ума, хелпов
и статей форума явно не достаточно...

Идея вот в чём:

1. Выбираю первую или вторую колонку, и/или ставлю вручную нужные
галочки.
2. Жму на "Кнопка Выбора".
3. Если надо, повторяю п.1 и/или п.2 для выбора другой колонки.
4. Жму "Выполнить" - выполняются соответствующие чекбоксам операции.

5. Нажатия на кнопку "Выход" должно приводить к выходу из скрипта на
любом этапе.

6. Не знаю, как придумать, чтоб при повторном нажатии на "Кнопка
Выбора" происходил бы select / deselect чекбокса.


Вроде бы смог понятно обяснить...

Вот скрипт:
Код:


#include <GUIConstants.au3>

Opt("GUICoordMode", 1)

GUICreate("Учусь Работать С Чекбоксами", 400, 300)

$checkCN1 = GUICtrlCreateCheckbox ("CHECKBOX 1", 10, 10, 120, 20)
$checkCN2 = GUICtrlCreateCheckbox ("CHECKBOX 2", 10, 30, 120, 20)
$checkCN3 = GUICtrlCreateCheckbox ("CHECKBOX 3", 10, 50, 120, 20)
$checkCN4 = GUICtrlCreateCheckbox ("CHECKBOX 4", 130, 10, 230, 20)
$checkCN5 = GUICtrlCreateCheckbox ("CHECKBOX 5", 130, 30, 230, 20)
$checkCN6 = GUICtrlCreateCheckbox ("CHECKBOX 6", 130, 50, 230, 20)

$Start = GUICtrlCreateButton("Выполнить", 10, 100, 120, 20)
$Close = GUICtrlCreateButton("Выход", 10, 120, 120, 20)

$button_1 = GUICtrlCreateButton ("Кнопка Выбора ", 10, 150, 120, 20)
$group_1 = GUICtrlCreateGroup ("Группа", 5, 175, 120, 95)
GUIStartGroup()
$radio_1 = GUICtrlCreateRadio ("Первая Колонка", 10, 190, 120, 20)
$radio_2 = GUICtrlCreateRadio ("Вторая Колонка", 10, 205, 120, 20)

$radioval1 = 0    ; We will assume 0 = first radio button selected, 2 = last button
$radioval2 = 2

GUISetState ()

While 1
  $msg = GUIGetMsg()
  Select
      Case $msg = $GUI_EVENT_CLOSE
        Exit
      Case $msg = $GUI_EVENT_MINIMIZE
        MsgBox(0,"", "Dialog minimized",2)
      Case $msg = $GUI_EVENT_MAXIMIZE
        MsgBox(0,"", "Dialog restored",2)
 
      Case $msg = $button_1

        if  $radioval1 = 0 then
                ControlCommand ( 'Учусь Работать С Чекбоксами', '', 'Button1', 'Check', '' )
                ControlCommand ( 'Учусь Работать С Чекбоксами', '', 'Button2', 'Check', '' )
                ControlCommand ( 'Учусь Работать С Чекбоксами', '', 'Button3', 'Check', '' )
        EndIf

        if  $radioval1 = 1 then
                ControlCommand ( 'Учусь Работать С Чекбоксами', '', 'Button4', 'Check', '' )
                ControlCommand ( 'Учусь Работать С Чекбоксами', '', 'Button5', 'Check', '' )
                ControlCommand ( 'Учусь Работать С Чекбоксами', '', 'Button6', 'Check', '' )
        EndIf
     
; Назначение этих двух строчек я не понимаю...
      Case $msg >= $radio_1 AND $msg <= $radio_2
        $radioval1 = $msg - $radio_1

  EndSelect
WEnd

;************************************************************************
#cs
----------------------


While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE  Or $msg = $Close Then
        Exit

ElseIf $msg = $Start Then

      If GUICtrlRead($checkCN1) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 1",1)
        EndIf

        If GUICtrlRead($checkCN2) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 2",1)
        EndIf

        If GUICtrlRead($checkCN3) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 3",1)
        EndIf

        If GUICtrlRead($checkCN4) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 4",1)
        EndIf

        If GUICtrlRead($checkCN5) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 5",1)
        EndIf

        If GUICtrlRead($checkCN6) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 6",1)
        EndIf

EndIf
WEnd

----------------------
#ce


bogomolv 12-07-2006 09:35 460539

DenchikK
Цитата:

Вроде бы смог понятно обяснить...
Наоборот :)

Цитата:

По частям он работает, но как совместить его работу, моего ума, хелпов
и статей форума явно не достаточно.
По каким частям? Что нужно совмещать?

Цитата:

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

Цитата:

6. Не знаю, как придумать, чтоб при повторном нажатии на "Кнопка
Выбора" происходил бы select / deselect чекбокса.
Это придумали за тебя и назвали оператором GUICtrlSetState
Код:

      Case $msg = $button_1
        If GUICtrlRead($checkCN1)=$GUI_CHECKED Then
          GUICtrlSetState($checkCN1,$GUI_UNCHECKED)
        Else
          GUICtrlSetState($checkCN1,$GUI_CHECKED)
        EndIF

Цитата:

; Назначение этих двух строчек я не понимаю...
Ну, так не ставь их!

DenchikK 12-07-2006 12:55 460639

bogomolv
Попробуйте, пожалуйста, запустить мой скрипт - всё наглядно увидите. ;-)

Цитата:

;Назначение этих двух строчек я не понимаю...
Ну, так не ставь их!
Ну так не работает без них! :-)

Ладно - попробую ещё понятнее объяснить:
Как видно по моему скрипту - есть одна часть, которая выполняется, и вторая - закоментированная. Это я думаю видно и понятно. Первая (незакоментированная) часть в зависимости от того, какая из RadioButton выбрана, выделяет три левых или правых чекбокса - то же вроде должно быть понятно. Вторая, закоментированная, часть показывает, что с выделенными чекбоксами делать. И если запустить скрипт в том виде, как у меня он дан, можно увидеть - что первая часть (отметка чекбоксов) работает. Если закоментитровать первую часть, и раскоментировать вторую - видим что и вторая часть так же выполняет свою функцию, что на неё возложена.

Теперь немного понятнее стало какие части и что нужно совмещать?

Может и не так, как у меня записано, принцип того, что должно получится, ясен?

Добавлено:
Всё, вопрос снимается - разобрался, как это всё работает (вроде-как).
Видать жара и недосып дают о себе знать ;-) Вот что в итоге вышло:
Код:

#include <GUIConstants.au3>

GUICreate("Учусь Работать С Чекбоксами", 400, 300)

$checkCN1 = GUICtrlCreateCheckbox ("CHECKBOX 1", 10, 10, 120, 20)
$checkCN2 = GUICtrlCreateCheckbox ("CHECKBOX 2", 10, 30, 120, 20)
$checkCN3 = GUICtrlCreateCheckbox ("CHECKBOX 3", 10, 50, 120, 20)
$checkCN4 = GUICtrlCreateCheckbox ("CHECKBOX 4", 130, 10, 230, 20)
$checkCN5 = GUICtrlCreateCheckbox ("CHECKBOX 5", 130, 30, 230, 20)
$checkCN6 = GUICtrlCreateCheckbox ("CHECKBOX 6", 130, 50, 230, 20)

$Start = GUICtrlCreateButton("Выполнить", 10, 100, 120, 20)
$Close = GUICtrlCreateButton("Выход", 10, 120, 120, 20)

$button_1 = GUICtrlCreateButton ("Кнопка Выбора ", 10, 150, 120, 20)
$group_1 = GUICtrlCreateGroup ("Группа", 5, 175, 120, 95)
GUIStartGroup()
$radio_1 = GUICtrlCreateRadio ("Первая Колонка", 10, 190, 120, 20)
$radio_2 = GUICtrlCreateRadio ("Вторая Колонка", 10, 205, 120, 20)

$radioval1 = 0    ; We will assume 0 = first radio button selected, 2 = last button
$radioval2 = 2

GUISetState ()

While 1
  $msg = GUIGetMsg()

  Select
 
      Case $msg = $GUI_EVENT_CLOSE  Or $msg = $Close
        Exit
      Case $msg = $GUI_EVENT_MINIMIZE
        MsgBox(0,"", "Dialog minimized",2)
      Case $msg = $GUI_EVENT_MAXIMIZE
        MsgBox(0,"", "Dialog restored",2)


  Case $msg = $button_1
   
    if  $radioval1 = 0 then

        If GUICtrlRead($checkCN1)=$GUI_CHECKED Then
          GUICtrlSetState($checkCN1,$GUI_UNCHECKED)
        Else
          GUICtrlSetState($checkCN1,$GUI_CHECKED)
        EndIF

        If GUICtrlRead($checkCN2)=$GUI_CHECKED Then
          GUICtrlSetState($checkCN2,$GUI_UNCHECKED)
        Else
          GUICtrlSetState($checkCN2,$GUI_CHECKED)
        EndIF

        If GUICtrlRead($checkCN3)=$GUI_CHECKED Then
          GUICtrlSetState($checkCN3,$GUI_UNCHECKED)
        Else
          GUICtrlSetState($checkCN3,$GUI_CHECKED)
        EndIF
   
    EndIf


if  $radioval1 = 1 then

        If GUICtrlRead($checkCN4)=$GUI_CHECKED Then
          GUICtrlSetState($checkCN4,$GUI_UNCHECKED)
        Else
          GUICtrlSetState($checkCN4,$GUI_CHECKED)
        EndIF

        If GUICtrlRead($checkCN5)=$GUI_CHECKED Then
          GUICtrlSetState($checkCN5,$GUI_UNCHECKED)
        Else
          GUICtrlSetState($checkCN5,$GUI_CHECKED)
        EndIF

        If GUICtrlRead($checkCN6)=$GUI_CHECKED Then
          GUICtrlSetState($checkCN6,$GUI_UNCHECKED)
        Else
          GUICtrlSetState($checkCN6,$GUI_CHECKED)
        EndIF
   
    EndIf


     
; Назначение этих двух строчек я не понимаю...
      Case $msg >= $radio_1 AND $msg <= $radio_2
        $radioval1 = $msg - $radio_1

Case $msg = $Start

      If GUICtrlRead($checkCN1) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 1",1)
        EndIf

        If GUICtrlRead($checkCN2) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 2",1)
        EndIf

        If GUICtrlRead($checkCN3) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 3",1)
        EndIf

        If GUICtrlRead($checkCN4) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 4",1)
        EndIf

        If GUICtrlRead($checkCN5) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 5",1)
        EndIf

        If GUICtrlRead($checkCN6) = 1 Then
                    MsgBox(0,"Установка","Чекбокс 6",1)
        EndIf

  EndSelect
WEnd


Creat0R 13-07-2006 12:07 461033

XXXler
Цитата:

Смотри в списке макро папок (в данном случае @ScriptDir)
Огромное Спасибо!

Есть такой вопрос:

Как по команде IniWrite, записывать строчки в файл конфигурации, но не в самый конец раздела, а, например, во вторую строчку заданного раздела?

И ещё, при команде IniRead, возвращается
Цитата:

Значение указанного ключа или <стандартное значение>, если указанный ключ отсутствует. (справка)
А как можно проверить совпадает ли указанная строка (или ключь в разделе) с существующей строкой в файле конфигурации? (*.ini) - и если совпадает, то нужно выполнить определённые действия (например, показать сообщение по MsgBox).

XXXler 13-07-2006 12:35 461052

Цитата:

Как по команде IniWrite, записывать строчки в файл конфигурации, но не в самый конец раздела, а, например, во вторую строчку заданного раздела?
С помошью только IniWrite - никак
Цитата:

А как можно проверить совпадает ли указанная строка (или ключь в разделе) с существующей строкой в файле конфигурации? (*.ini) - и если совпадает, то нужно выполнить определённые действия (например, показать сообщение по MsgBox).
строки здесь причем? Если используем Ini файл, так и работаем с Секция\Параметр\Значение, со строками как таковыми работа невозможна.

Если надо сравнить одно значение:
Код:

If IniRead($File,"Section","Parameter","Default Value")="Текст для сравнения" Then MsgBox(0,"","Значение совпадает")

DenchikK 13-07-2006 12:46 461063

Creat0R
Цитата:

А как можно проверить совпадает ли указанная строка (или ключь в разделе) с существующей строкой в файле
конфигурации? (*.ini) - и если совпадает, то нужно выполнить определённые действия (например, показать сообщение по
MsgBox).
Так пойдёт?

Код:

$var = IniRead("boot.ini", "boot loader", "timeout", "")
        if $var = 5 then
                MsgBox(0,"Информация", "Запись существует",2)
        else
                MsgBox(0,"Информация", "Запись не существует",2)
        endif
Exit


Creat0R 13-07-2006 13:11 461077

XXXler
Цитата:

С помошью только IniWrite - никак
Мне в принципе не важно с помощью чего, главное как такое сделать?

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

DenchikK
Цитата:

Так пойдёт?
Таким образом у меня в любом случае выводится сообщение “Запись не существует”, и ключь в файле не проверяется... или я просто что-то не так делаю?

Цитата:

if $var = 5 then
Разве IniRead возвращает значение 5, судя по справке, оно возвращает либо значение указанного ключа, либо значение которое приютствует у ключа в указанном разделе.

XXXler 13-07-2006 13:55 461087

Может найдешь что тебе именно нужно:
Код:

;~ Условия поиска
$Sect="Имя_секции"
$Param="Имя_параметра"
$Val="Значение_параметра"
$File="Имя_файла"

If Not FileExists($File) Then Exit 1
       
;~ Поиск по имени секции
$SecList=IniReadSectionNames($File)
For $i=1 To $SecList[0]
        If $SecList[$i]=$Sect Then        MsgBox(0,"","Секция "&$Sect&" существует")
Next

;~ Поиск по имени параметра в любой секции
$SecList=IniReadSectionNames($File)
For $i=1 To $SecList[0]
        $ParList=IniReadSection($File,$SecList[$i])
        For $y=1 To $ParList[0][0]
                If $ParList[$y][0]=$Param Then MsgBox(0,"","Параметр "&$Param&" существует в секции "&$SecList[$i])
        Next
Next

;~ Поиск по значению параметра в любой секции
$SecList=IniReadSectionNames($File)
For $i=1 To $SecList[0]
        $ParList=IniReadSection($File,$SecList[$i])
        For $y=1 To $ParList[0][0]
                If $ParList[$y][1]=$Val Then MsgBox(0,"","Значение "&$Val&" существует в  параметре "&$ParList[$y][0]&", секции "&$SecList[$i])
        Next
Next

;~ Поиск по имени секции и параметра
If IniRead($File,$Sect,$Param,"А вот и нет такого параметра")<>"А вот и нет такого параметра" Then MsgBox(0,"","Параметр "&$Param&" существует в секции "&$Sect)

;~ Поиск по имени секции, параметра и значения
If IniRead($File,$Sect,$Param,"А вот и нет такого параметра")=$Val Then MsgBox(0,"","Значение "&$Val&" существует в параметре "&$Param&", секции "&$Sect)


Creat0R 15-07-2006 19:39 461741

XXXler
Огромное спасибо! помогло!


Появился у меня интерес к такому вопросу - Можно ли каким то образом, воспринимать переданный ключь (рефферер) из другой программы, и чтобы скрипт распознавал, и если это определённый ключь, то что-то должно происходить. Т.е, например, скрипт был вызван из контекстного меню определённой программы, и при этом вызове, был указан ключ (Пример: Item, "Script" = Execute program, "Script.exe", "%A") - И теперь, скрипт должен распознать этот ключь, и если был передан именно этот ключь, то скрипт продолжит заданные действия в цепочке, а если ключь не совпадает, т.е если не был передан именно этот ключ, или вообще не был передн ключь, то должен происходить выход из цепочки (Do....Until...)


P.S:
Как делать цепочку\выход с неё, продолжение действии и т.д, я уже знаю, и мне нужно только узнать, как распозновать тот самый ключь (рефферер).

И ещё вот что хотел узнать, кто-то знает, где мможно посмотреть на разные структуры скриптов, например, для чекбоксов, для передачи результата из выбранного файла\каталога через FileOpenDialog, в затемнённое поле GUI интерфейса, и тому подобное (что-то вроде преведённого XXXler'ом в посте на один выше чем мой).

XXXler 15-07-2006 23:53 461784

Цитата:

как распозновать тот самый ключь (рефферер).
команданая строка обрабатывется с пом. переменной $CmdLine, которая возвращает массив значений, где $CmdLine[0] количество параметров, $CmdLine[1], $CmdLine[2], $CmdLine[3] - параметры (в командной строке м\у параметрами разделитель - пробел, если параметр с пробелом внутри, его надо заключить в кавычки).
Обработка коммандной строки выглядит примерно так:
Код:

For $i=1 To $CmdLine[0]
Select
Case CmdLine[$i]="Параметр_1"
....

Case CmdLine[$i]="Параметр_2"
....

......
Case CmdLine[$i]="Параметр_n"
....

EndSelect
Next


Creat0R 16-07-2006 16:28 461891

XXXler
Ещё раз огромное Сенкс за наводку!
Вот как мне впринципе нужно было:

Код:

Select
Case $CmdLine[1] = 1
MsgBox(0, "", "ok 1")
Case $CmdLine[1] = 2
MsgBox(0, "", "ok 2")
Case $CmdLine[1] = 3
MsgBox(0, "", "ok 3")
EndSelect

Тут, Меседжь боксы естественно для примера, мне требуются совсем инные действия :).

Если запустить из внешней программы, этот скрипт с ключём, например 1, то будет сообщение: "ок 1", если с ключём 2, то естественно сообщение будет "ок 2" и т.д.
--------------------------

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

*Вопрос который я уже задавал:
Цитата:

Как по команде IniWrite, записывать строчки в файл конфигурации, но не в самый конец раздела, а, например, во вторую строчку заданного раздела?
Но мне НЕ важно по какой команде (просто я думал что раз уж файл ини, значит нужно именно этой командой).

Dirk Diggler 16-07-2006 22:34 461933

Никак. Только написать свою функцию.

Creat0R 17-07-2006 00:00 461942

Dirk Diggler
Цитата:

Только написать свою функцию.
А как это сделать?

VelDmi 17-07-2006 19:46 462252

Уважаемый bogomolv!
Большое спасибо за скрипт по настройке dial-up подключений. Когда я давным давно видел его на форуме не думал что он пригодится.
Поясните пожалуйста некоторые моменты, которые у меня не получаются.
Итак, подключение создается, но:
Не стоит галочка "использовать правила набора номера" - как ее поставить?
Код страны или региона почему-то США, как сделать Россию?

Dirk Diggler 17-07-2006 20:54 462269

Creat0R. Для начала прочитать всё-таки книжку по информатике и хелп к AutoIt3

bogomolv 18-07-2006 01:08 462337

VelDmi
Не "выкай". Настаиваю именно на этой форме общения. Тем более, что двухлетнее знакомство дает право обращаться "на ты" даже за пределами интернета.

Цитата:

Не стоит галочка "использовать правила набора номера" - как ее поставить?
Код:

;Настройка "Свойства" соединения
$pbk='@AppDataCommonDir@\Microsoft\Network\Connections\Pbk\rasphone.pbk'
$co=IniReadSectionNames($pbk)
For $i=1 to $co[0]
 IniWrite ($pbk, $co[$i], 'DataEncryption',                '8')
 IniWrite ($pbk, $co[$i], 'ShowMonitorIconInTaskBar',        '1')
 IniWrite ($pbk, $co[$i], 'ConnectBPS',                '460800')
 IniWrite ($pbk, $co[$i], 'Speaker',                        '0')
 IniWrite ($pbk, $co[$i], 'AreaCode',                $cod)
 IniWrite ($pbk, $co[$i], 'CountryCode',                $ccod)
 IniWrite ($pbk, $co[$i], 'CountryID',                $ccod)
 IniWrite ($pbk, $co[$i], 'UseDialingRules',                '1')
 $phone2= IniRead($ini, $con[$i],'Phone_Number2','')
 If $phone2<>'' Then
  IniWrite ($pbk, $co[$i], 'Comment','@CRLF@PhoneNumber=$phone2$@CRLF@AreaCode=$cod$@CRLF@CountryCode=$ccod$@CRLF@CountryID=$ccod$@CRLF@UseDialingRules=0@CRLF@Comment=')
 EndIF
 ;это выделено для Creat0R в качестве примера того, как записать в ini-файл параметры в нужной последовательности

Next

Цитата:

Код страны или региона почему-то США, как сделать Россию?
Уточни, что имеешь ввиду.
Если код страны как параметр драйвера модема, так этот скрипт драйверы не настраивает.
Если же Area_Code и Country_Code, то это коды выхода на межгород и международную связь. У меня там, наверное, были жестко забиты код саратовские - 8452 и 7. В приведенном выше кусочке скрипта Area_Code и Country_Code определяются переменными $cod и $ccod.
(Кстати, а на какой мой скрипт настройки интернет ты ссылаешься? Давай ПМ, вышлю свеженький.)
Цитата:

Большое спасибо за скрипт по настройке dial-up подключений. Когда я давным давно видел его на форуме не думал что он пригодится.
А как же ты настривал соединения? Хотя, даже не удивляюсь. И в знакомом тебе обсуждении на хоботе, и здесь возможности автоматической настройки соединений почему-то мало кого интересуют.

Creat0R
Глянь в скрипт. Там есть пример того, как можно записать в ini-файл параметры в нужной последовательности.

Creat0R 18-07-2006 02:15 462348

bogomolv
Цитата:

Глянь в скрипт. Там есть пример того, как можно записать в ini-файл параметры в нужной последовательности.
Спсибо, но дело в том, что мне нужно не именно последовательность, а помещение ключа со значением, в указанную строку определённого рздела. Т.е, мне нужно поместить ключь (со значением), допустим в середину раздела, и это единственный ключь который будет добвляться за один сеанс (запуска скрипта).

Вот так (см. код ниже), мне удалось во второй раздел ini файла, поместить ключ со значением, но уже не в конец раздела, а в его начало:

Код:

$co=IniReadSectionNames("Test.ini")
For $i=2 to $co[0]

IniWrite ("Test.ini", $co[$i], "Test" , "OK")
Next

Мне нужно как то узнать, каким образом я могу монипулировать помещением ключа в нужную строку (именно заданного раздела).
Буду очень благодарен если сможешь помочь!
И спасибо за внимание (за пример, и за попытку помочь).

Dirk Diggler
Цитата:

Для начала прочитать всё-таки книжку по информатике и хелп к AutoIt3
Справку почти всю прочёл, но у меня голова начинает пухнуть, когда перечитываю снова и снова один и тот же пример\объяснение и т.д....
А на счёт книжки по информатике - как это связанно с AutoIt? или эта книжка предназначена для него?, тогда дай пожалуйста полное название этой книжки, или по возможности, линк по которому я смог бы её скачать...

VelDmi 18-07-2006 14:35 462482

bogomolv
Привет! Использовал этот скрипт:
Код:

$f = FileOpen(@TempDir & '\ispcnfg.ins', 2)
FileWriteLine($f, '[Entry]')
FileWriteLine($f, 'Entry_Name=otts')
FileWriteLine($f, '')
FileWriteLine($f, '[Phone]')
FileWriteLine($f, 'Dial_As_Is=yes')
FileWriteLine($f, 'Phone_Number=8w770')
FileWriteLine($f, 'Area_Code=')
FileWriteLine($f, 'Country_Code=7')
FileWriteLine($f, 'Country_ID=7')
FileWriteLine($f, '')
FileWriteLine($f, '[Device]')
FileWriteLine($f, 'Type=modem')
FileWriteLine($f, '')
FileWriteLine($f, '[User]')
FileWriteLine($f, 'Name=otts')
FileWriteLine($f, 'Password=otts')
FileWriteLine($f, 'Display_Password=no')
FileWriteLine($f, '')
FileWriteLine($f, '[ConnectionSettings]')
;FileWriteLine($f, 'ApplyInsToConnection='&$con[$i])
FileWriteLine($f, '')
FileClose($f)

Run(@ComSpec&' /C Start %temp%\ispcnfg.ins','',0)
WinWaitActive('Мастер подключения к Интернету')
Send('{ENTER}')
WinWaitActive('Мастер подключения к Интернету','Завершена подготовка')
Send('{ENTER}')

$pbk=@AppDataCommonDir & '\Microsoft\Network\Connections\Pbk\rasphone.pbk'
IniWrite ($pbk, 'otts', 'UseDialingRules', '1')
IniWrite ($pbk, 'otts', 'CountryCode', '7')
IniWrite ($pbk, 'otts', 'CountryID', '7')
IniWrite ($pbk, 'otts', 'ConnectBPS', '115200')
IniWrite ($pbk, 'otts', 'AreaCode', '')
IniWrite ($pbk, 'otts', 'RedialSeconds', '3')
IniWrite ($pbk, 'otts', 'RedialAttempts', '100')

В итоге подключение настраивается, и даже галочка ставится, но при нажатии свойства->правила выскакивает окно изменение местонахождения, там где указывают код города и регион.

Цитата:

Уточни, что имеешь ввиду.
Если код страны как параметр драйвера модема, так этот скрипт драйверы не настраивает.
Если же Area_Code и Country_Code, то это коды выхода на межгород и международную связь.
При использовании файла *.ins в котором даже прописаны все параметры все равно получается США с кодом города 805. Может и правда от дров модема зависит. Поэтому после правлю rasphone.pbk по твоему совету. Вроде галки поставились где надо, но местоположение все равно спрашивает.

Цитата:

Кстати, а на какой мой скрипт настройки интернет ты ссылаешься? Давай ПМ, вышлю свеженький.
Намылил тебе по этому поводу.

Цитата:

А как же ты настривал соединения? Хотя, даже не удивляюсь. И в знакомом тебе обсуждении на хоботе, и здесь возможности автоматической настройки соединений почему-то мало кого интересуют.
А вот так вот вручную и настраивал. Пока не принесли подряд 3 компьютера. Только тогда понял насколько рутинная эта операция.

XXXler 18-07-2006 14:44 462484

Creat0R,
Цитата:

Как по команде IniWrite, записывать строчки в файл конфигурации, но не в самый конец раздела, а, например, во вторую строчку заданного раздела?
пложение самого раздела в файле тоже критично?

Creat0R 18-07-2006 17:02 462537

XXXler
Цитата:

пложение самого раздела в файле тоже критично?
Положение нет, оно иногда может менятся (не моим скриптом), но вот название его будет всегда одинаковым.

P.S:
Под словом Раздел - я подразумиваю начало пунктам под которым есть ключи и значение у них, вот пример:
[Раздел1]
Ключь = Значение

[Раздел2]
Ключь = Значение

И т.д..

XXXler 18-07-2006 19:09 462595

Вызов функции:
IniWriteVP(Файл,Секция,Параметр,Значение,[опционально:позиция параметра в секции])
Например:
IniWriteVP($File,"Section","Parametr","Этот параметр будет вторым",2)
IniWriteVP($File,"Section","Parametr","Этот параметр будет записан также, как и с пом. IniWrite")

Код:

Func IniWriteVP($File,$Sect,$Param,$Val,$Pos=0)
        Local $ValArr,$i
        If $Pos<>0 Then IniDelete($File,$Sect,$Param)
        $ValArr=IniReadSection($File,$Sect)
        If @error Or $Pos=0 Or $ValArr[0][0]<$Pos Then
                IniWrite($File,$Sect,$Param,$Val)
                SetError(@error)
        Else
                For $i=1 To $ValArr[0][0]
                        IniDelete($File,$Sect,$ValArr[$i][0])
                Next
                For $i=1 To $ValArr[0][0]
                        If $Pos=$i Then        IniWrite($File,$Sect,$Param,$Val)
                        IniWrite($File,$Sect,$ValArr[$i][0],$ValArr[$i][1])
                Next
        EndIf
EndFunc


Creat0R 19-07-2006 00:11 462683

XXXler
У меня что-то не получается :( . Я если честно, так и не понял, что куда прописывать - Я пытался сделать так:

Код:

$Sect="Test1"
$Param="Параметр"
$Val="Значение"
$File="Test.ini"

        Func IniWriteVP($File,$Sect,$Param,$Val,$Pos=0)
  IniWriteVP($File,$Sect,$Param,$Val, 2)

EndFunc

Но я понимаю что тут явно чего то нехватает, и этот вариант не срабатывает.

Если не трудно, напиши пожалуйста скрипт так, чтобы он в файл Test.ini, в секцию "Test3", и в третью строчку этой секции, записывал параметр "Проба" со значением "1". Т.е вот так должна быть прописана строка:

Код:

[Test3]
Тут неважно что, но что-то записано.
Тут тоже неважная запись.

Проба = 1
Тут тоже неважная запись, но не обязательно последняя


Creat0R 19-07-2006 01:48 462708

bogomolv
Цитата:

"Я читал в справке раздел по использованию функций. Приведенный там пример меня не вдохновил, и я решил усовершенствовать синтаксис команд в AutoIt3, засунув обращение к функции внутрь самой функции. Но я понимаю, что тут явно чего-то не хватает! Как бы мне еще поиздеваться над AutoIt'ом, а заодно и над сокнижниками?"
А зачем-же так издеваться надо мной, я всего навсего, прошу о помощи в том, чего ещё не понимаю, но это не значит что я полный тупицца, который не хочет слушать то, что ему твердят... вот только твердили бы ясно, а не вырожениями типа „Как бы мне еще поиздеваться над AutoIt'ом“ - Я же не знаю как эти функции работают, и что куда можно пихать, а что нельзя.
Ты хочеш сказать, что в справке ясно описанно как сделать мою задумку, или что мою задумку не реально сделать в AotoIt? Тогда как-же в нём делают очень сложные задачи? а такую простую, как запись в определённую строку определённой секции ини файла, не возможно?! не поверю. Просто другое дело, нехватает опыта, или знании сделать такую задачу (или желания), а так или иначе, прямым, или обходным путём, реализовать мою задумку возможно... и надеюсь найдутся добрые, опытные, и желающие помочь новичку в этом деле (в программировании) люди (В их число, думаю входишь и ты, но почему-то предпочитаешь видеть во мне не новичка в программировании, а чайника в целом - что вовсе неверно!).

P.S:
Извеняюсь за офтоп, но мне хочется чтобы меня понимали, это необходимо для моего прибывание на форуме!

Creat0R 19-07-2006 15:32 462878

bogomolv
Цитата:

Ты не хочешь:
1) читать справку;
2) слушать советы прочитать справку;
3) договариваться, что ты все-таки почитаешь справку.
Я справку почитал, и теперь попытаюсь объяснить (метафорой), как я понимаю то что я с неё (и не только) вычитал...

Во многих кодах, мне ясны только основные вырожения, типа IniWrite, IniRead, For..Next, Do...Untill, переменные $var, $Func, $Sect, $param, $val, $File и т.д и т.п... Но во многих случаях (да почти во всех), увидив их в примерах справки, или тут на форуме, мне не удаётся соеденить их логический смысл воедино. Это подобно тому, как я знаю с десяток слов на французском в отдельности (их звучание и дословный перевод), но если мне начнут говорить на этом языке, даже услышав знакомые слова, я не пойму о чём речь, потому что нету опыта в разгаворе и понимании языка. А взяв русско-французский словарь (аналогия на справку в AotoIt), и прочитав его залпом, будет таже ситуация, и разговор на этом языке я не пойму, пока не стану говорить на нём (разве что если тот самый словарь, будет написан с подробными разъяснениями и мини-уроками по практике речепонимания и произношения).

А пример выше, огромное конечно спасибо за попытку, но он, как я понял, проверяет существует ли заданное значение в заданной секции, и если да, то создаёт заданный параметр с заданным значением в этой секции на одну строчку ниже, распознанного значения... а если значение не найдено, то заданный параметр со значением записывается в первую строчку заданного параметра...

Но мне, вообще-то, ненужно чтобы там была какая-то либо или чего-то либо проверка, нужно чтобы был скрипт, в определённую команду которого (типа $Pos=3), я смог бы внести номер строки заданной секции, и после запуска данного скрипта, в эту строку прописался бы заданный параметр со значеним.

Цитата:

На основе этого примера очень легко нарисовать свою конструкцию:
Я согласен, что может быть тебе просто, но вот мне, вовсе не просто, не то чтобы написать такую конструкцию, но и понять мне её вовсе не просто.

Цитата:

Ты так и не прочитал пример использования функций из справки:
Так я и немогу, у меня в справке приведённого тобой примера вовсе нет... может у меня другая справка? если не трудно, дай пожалуйста ссылку, на ту справку которую юзаешь...

Creat0R 20-07-2006 14:43 463055

bogomolv
Цитата:

Скопируй написанный для тебя код в конец своего скрипта (после Exit) и обратись к функции командой IniWriteVP($File,"Section","Parametr","Этот параметр будет вторым",2).
Я делал точно так, но параметр со значением прописывается именно в первую строчку секции.

Цитата:

Кстати, а зачем тебе это? Обычно, программам, работающим с INI-файлами, по барабану, какая последовательность у нужных им параметров.
В моём случае, как раз-то не побарабану. Дело в том, что эти параметры, это пункты меню в программе (Файл | Правка | Вид и т.д), которые нужно убирать\показывать при необходимости. Но для этого, нужно именно прописывать строчки в то место, где они и должный быть (я знаю заранее где), чтобы небыло путанницы в последовательности их появления в программе.

А на счёт справки, Спасибо, так намного проще понимать что тебе советуют! :)

XXXler 20-07-2006 14:54 463060

Creat0R, пустые строки в секции имеют место?

Creat0R 20-07-2006 15:04 463072

XXXler
Цитата:

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

XXXler 20-07-2006 15:18 463078

Creat0R, все отловил ситуацию:
при таком заполнении:

Код:

Func IniWriteVP($File,$Sect,$Param,$Val,$Pos=0)
        Local $ValArr,$i
        If $Pos<>0 Then IniDelete($File,$Sect,$Param)
        $ValArr=IniReadSection($File,$Sect)
        If @error Or $Pos=0 Or $ValArr[0][0]<$Pos Then
                IniWrite($File,$Sect,$Param,$Val)
                SetError(@error)
        Else
                For $i=1 To $ValArr[0][0]
                        IniDelete($File,$Sect,$ValArr[$i][0])
                Next
                For $i=1 To $ValArr[0][0]
                        If $Pos=$i Then        IniWrite($File,$Sect,$Param,$Val)
                        IniWrite($File,$Sect,$ValArr[$i][0],$ValArr[$i][1])
                Next
        EndIf
EndFunc

For $i=1 To 3
        For $y=1 to 10
                IniWriteVP(@ScriptDir&"\Test.ini","Test"&$i,"Par"&$y,"Фигня")
        Next
Next


IniWriteVP(@ScriptDir&"\Test.ini","Test1","Par100","пятое значение",5)
IniWriteVP(@ScriptDir&"\Test.ini","Test3","Par3","третье значение",3)
IniWriteVP(@ScriptDir&"\Test.ini","Test3","Par1","седьмое значение",7)

при присвоении Par1 седьмой позиции Par3 становится вторым, т.к. Par1 переходит в 7 строку:

Код:

[Test1]
Par1=Фигня
Par2=Фигня
Par3=Фигня
Par4=Фигня
Par100=пятое значение
Par5=Фигня
Par6=Фигня
Par7=Фигня
Par8=Фигня
Par9=Фигня
Par10=Фигня
[Test2]
Par1=Фигня
Par2=Фигня
Par3=Фигня
Par4=Фигня
Par5=Фигня
Par6=Фигня
Par7=Фигня
Par8=Фигня
Par9=Фигня
Par10=Фигня
[Test3]
Par2=Фигня
Par3=третье значение
Par4=Фигня
Par5=Фигня
Par6=Фигня
Par7=Фигня
Par1=седьмое значение
Par8=Фигня
Par9=Фигня
Par10=Фигня

тут наверное прийдется, предварительно загнать все изменения ini-файла в массив, а потом его перезаписать с нуля - тогда позиции будут жесткими, иначе все будет плавать.

попожжа наваяю, может быть

Creat0R 20-07-2006 16:10 463100

XXXler
Огромное спасибо за такое внимание!

А может быть есть такая команда, которая после вставки параметра в первую строку, будет как бы двигать его (параметр) по одной строке вниз?

А вообще, как я потихоньку начинаю убиждаться, моя задумка очень сложная для выполнения (не только на AutoIt) тем способом который я объяснил. Тогда у меня есть немного другая альтернатива, но цель впринципе та же:

Вместо прописывания параметров в определённую строку секции, можно было бы проверять если заданный параметр прописан так как он определён (в скрипте), и если так и прописан, то пусть к этому параметру дописывается символ ; (чтобы параметр был как бы закоментирован), а если у этого параметра уже прописан такой символ, то пусть он убирается, и параметр таким образом становится активным - Этот вриант, как мне кажется, наиболее подходящий, и думаю даже более прост для выполнения скриптом AutoIt.

XXXler 20-07-2006 18:44 463162

Creat0R, чего-то я недопонимаю: если тебе нужно добавить\убрать, например, 5 и 6 по счету элемент меню, зачем изменять позиции остальных елементов?

добавить:
IniWriteVP($IniFile,"Menu_1","Item_5","пятый элемент",5)
IniWriteVP($IniFile,"Menu_1","Item_6","шестой элемент",6)


убрать:
IniDelete($IniFile,"Menu_1","Item_5")
IniDelete($IniFile,"Menu_1","Item_6")

Creat0R 20-07-2006 19:23 463173

XXXler
Дело в том, что там 7 пунктов меню, и если я, допустим уберу третьий пункт, то тот который был четвёртым, автоматом станет третьийм, и уже потом скрипт ошибётся. А также, может быть такая ситуация (если почти все меню будут убранны), когда останутся два-три пункта меню, и их ненужно трогать, а также ненужно создавать тех которых нету (и которые должный быть, если их включикли - по вызову этого же скрипта, но с другим ключём), поэтому я немогу узнать, какие есть, а каких нету, и нужно просто не убирать их, а закоментировать (как я писал в последнем посте про альтернативу), или раскоментировать, если они закоментированный (символом ; ).

Creat0R 20-07-2006 19:38 463179

bogomolv
Цитата:

Давай проверим.
Создай Блокнотом файл C:\Test.ini из трех строк
Сделал всё в точности так, и вообще никакая строчка не прописалась.

Creat0R 20-07-2006 22:48 463247

Вложений: 1
bogomolv
Цитата:

Запости скрипт, который ты написал для проверки.
В атаче скрипт Test.au3 и файл Test.ini.

ANGRO 21-07-2006 02:15 463293

Цитата:

А есть книги по AutoIt'у? (Хорошо, т.е понятно написанны)
Возьми хорошо написанную книгу по WinAPI, почитай недельку перед сном, будеш AutoIt набирать с выключенным монитором. :laugh:

Creat0R 21-07-2006 04:05 463308

ANGRO
Цитата:

Имелось в виду что ты Creat0R вставиш функцию целиком из поста выше
Так можно было так и написать, а не вводить такого как я, по твоим словам, чайника, в догадки.

Цитата:

для тебя человек целую функцию написал а ты даже разобраться не хочеш.
Спасибо ему что написал эту функцию, но я не то что не хочу - я не могу, не знаю как, не хватает опыта, знании и т.д и т.п.

Цитата:

Возьми за правило сначало разобраться в листинге хотя бы процентов на 50, а потом стремиться к результату в виде билда иначе соберёш 100% не работающий код.
Что такое листинг, и что такое билд?

Цитата:

Матрицу наверное смотрел от туда "Знать путь и пройти его это не одно и тоже"
А при чём тут это, и при чём тут матрица, то что я писал, не имеет никакого отношения к приведённой тобой цитате. Я же не про путь писал, я писал про понимание сочетании команд, при том что часть из них я знаю как отдельное значение, а сочетание их вместе, нет.

Цитата:

если нужен конечный результат закажи его и не разводи флуд.
А что значит заказать? я же и так рассказал что мне конкретно требуется, и флуд, если я и развожу, то только потому, что меня провоцируют на него.

Цитата:

Интересно в какой программе пункты меню храняться в ini фаилах ??
Неужели програмёр (даже с малой буквы ;) ), такого не знает?
Это в браузере Opera!

Цитата:

Возьми хорошо написанную книгу по WinAPI, почитай недельку перед сном, будеш AutoIt набирать с выключенным монитором.
Это было серъёзно, или в шутку? потому что если в шутку, то могу ответить лишь так (тоже в шутку):
Возле ссылки Полезное сообщение, нужно было-бы приделать и ссылку такую - Бесполезное сообщение :laugh:

P.S:
А вообще, спасибо за советы, думаю кога-то, в далёком будущем, они мне и пригодятся, и думаю если бы я и планировал серъёзно начинать программировать, то уж точно не начинал бы с AotoIt (При всём уважении к этому проэкту, и поверь, оно есть).

bogomolv 21-07-2006 06:39 463327

Creat0R
Да-а-а, глянул твой скрип... Слов нет - одни буквы...
Надеюсь, ты сам все понял.

Я всю бурную и бесполезную переписку с тобой поудалял. Прошу это сделать и тебя.
Те проблемы, которые ты решаешь, - результат твоей фантастической безграмотности и не имеют никакого отношения к программированию и к AutoIt.

Creat0R 21-07-2006 11:59 463430

bogomolv
Цитата:

результат твоей фантастической безграмотности
Если не понимание в прграммировании, называется безграмотностью, то грамотных людей в нашем мире, очень и очень мало!

Большое спасибо за помощь! :beer: (это я серъёзно, без всякого сорказма).

ANGRO 22-07-2006 00:54 463674

Я тут людей спрашивал как получить данные сетевых соединений, вот как-то так
Код:

        Dim $strComputer = "."
        Dim $ret

        $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
                If Not @error = 0 Then
                        MsgBox(48, "Ошибка", "Не удалось соединиться со службой WMI")
                  EndIf
        $colNicConfigs = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
               
        For $objNicConfig In $colNicConfigs
                For $strIPAddress In $objNicConfig.IPAddress
               
                $objNic = $objWMIService.Get("Win32_NetworkAdapter.DeviceID=" & $objNicConfig.Index)
                        $ret &= "-- " & "Имя:  " &  $objNic.NetConnectionID & @CRLF & _
                                      "IP адрес:  " & $strIPAddress & @CRLF & _
                                      "Номер адаптера:  " & $objNicConfig.Index & @CRLF
                Next
        Next
                If $ret <> '' Then Msgbox(0,"Output", $ret )


ANGRO 22-07-2006 01:52 463687

Цитата:

думаю если бы я и планировал серъёзно начинать программировать, то уж точно не начинал бы с AotoIt
Думаю это бан с высылкой своп фаила на мыло. По крайней мере с моей стороны.

adima 24-07-2006 10:11 464249

Есть ли у кого пример или готовый скрипт поиска файла по всем дискам и всем директориям и поддиректориям

bogomolv 25-07-2006 01:24 464521

adima
Пример поиска файла здесь уже приводился. В твоем случае нужно лишь зациклить поиск по дискам:
Код:

Opt('ExpandEnvStrings', 1); default = 0
Opt('ExpandVarStrings', 1); default = 0
Opt('RunErrorsFatal', 0); default = 1
Opt('TrayIconDebug', 1); default = 0

$drives = DriveGetDrive("all")
If @error Then Exit

For $i=1 to $drives[0]
  $dr=dir($drives[$i]&'\*_1.au3')
  For $k=1 To $dr[0]-1
    MsgBox(0,'',$dr[$k])
  Next
  $dr=0
Next
Exit

Exit

Func dir($d)
 $dr = Run('%Comspec% /c dir "$d$" /s /b','',0,6)
 $f  = ''
 While not @error
  $f = $f & StdoutRead($dr)
 Wend
 Return (StringSplit(StringReplace($f,@LF,''),@CR))
EndFunc


kovdaev 25-07-2006 13:19 464662

Где можно взять готовый скрипт или может у кого есть на программу R-STUDIO v.3 EN

xstranger 28-07-2006 05:19 465697

Скажите, как с помощью AutoIt можно получить раздел реестра содержащий какой либо параметр=значение.
Надо чтобы результатом был раздел реестра содержащий данный параметр равный данному значению.

Или может кто подскажет как получить название устройства (установленого, например видео карты)из реестра. По адресу
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ имееется информация о всех установленых драйверах системы, но конечный раздел для каждого устройства разный, в зависимости от того как его назвали при разработке драйвера, единственное как можно определить например видеокарту - это что параметр Group = video

bogomolv 28-07-2006 08:55 465721

xstranger
ПННХНЧ (Пишу, Но Ни Хрена Не Читаю)?

На основе этого примера можно считать и проверить на соблюдение любого условия любую информацию из любого раздела реестра:
Код:

;Считывание на стадии CMDLINES.TXT будущего разрешение экрана
$screen=1024
If RunWait('@ComSpec@ /C reg query "HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses" /s | find "DefaultSettings.XResolution" | find "500"','',0)=0 Then $screen=1280

Для работы железками есть специализированная утилита DEVCON: http://support.microsoft.com/kb/311272/ru.
Данный пример позволяет проверить наличие железки по ее HWID:
Код:

$hwid='PCI\VEN_10DE' ;nforce4
If RunWait('@ComSpec@ /C devcon.exe hwids "$hwid$" | find "$hwid$"','',0) Then Exit


xstranger 28-07-2006 11:24 465767

нет.... это немного не то. Или то но я не могу понять как этого добиться.

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

Можно конечно открыть devmgr по shift+а10, но какаяже тогда автоматизация..., а идея мне кажется хорошая.

может есть у когонибудь какие нибудь практические предложения!?... давайте вместе подумаем

xstranger 28-07-2006 11:56 465775

вот уже кое что нашел:
в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video - перечисляются все видео драйверы установленые на компьютере включая vgasave, но только один вложеный раздел содержит параметр Device Description и его значение равно названию видео карты.
с помощью утилиты из состава reskit 2k srv - regfind можно получить значение параметра Device Description

kpuk 28-07-2006 22:13 466022

прошу сильно не пинать, а подробненько разжувать:
Есть прога. К ней есть API-функции.
Как их передать программе через autoit??
Просьба попожробенее и на примере.
Вот, для примера имею:
- доступ к функциям осуществляется через единый интерфейс IRunpadShell
----------------------------------------------
HRESULT TurnShell(BOOL bNewState);
Включает или отключает шелл (TRUE/FALSE соответственно)
----------------------------------------------

Как мне к примеру через автоит закрыть прогу через эту функцию???

bogomolv 29-07-2006 02:10 466074

xstranger

Цитата:

может есть у когонибудь какие нибудь практические предложения!?... давайте вместе подумаем
Над чем подумать-то? Над тем, как вывести на экран за 9 мин. до конца установки "Диспетчер устройств"? Можно и devcon'ом вывести на экран все характеристики всех имеющихся в системе устройств (в том числе и какие драйвера установлены). У меня таких устройств devcon насчитал 118. Оно тебе надо?
Может все же поделишься, зачем тебе все это нужно?

Цитата:

в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video - перечисляются все видео драйверы установленые на компьютере включая vgasave, но только один вложеный раздел содержит параметр Device Description и его значение равно названию видео карты
В разделе HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses тоже перечисляются различные устройства. И только один из подразделов содержит заветную информацию о том, какое разрешение подхватили драйвера... Поэтому и предложил простой способ выуживать информацию из реестра, не перебирая все подразделы и не зная точного иентификатора видеокарты.
Задай в параметре find название своей видеокарты и укажи в reg query свою ветку реестра, и мой скрипт ответит тебе, есть ли такая видеокарта.

kpuk

Цитата:

Как мне к примеру через автоит закрыть прогу через эту функцию???
А почему это нужно делать через эту функцию? Почему нельзя закрыть стандартной autoit'овской функцией WinClose?

kpuk 29-07-2006 12:31 466110

Это только одна из функций для примера, вот другой пример, который можно тока через API сделать:
-------------------------------------------------------------------------------
HRESULT DoSingleAction(RSHELLACTION dwAction);

Выполняет определенное действие:
RSA_SHOWPANEL - показывает плавающую панель с закладками
RSA_MINIMIZEALLWINDOWS - минимизирует все активные окна
RSA_KILLALLTASKS - снимает все разрешенные задачи (аналог команды шелла/сервера)
RSA_RESTOREVMODE - восстанавливает видеорежим (после выхода из проблемных игр)
RSA_UPDATEDESKTOP - обновляет рабочий стол шелла
RSA_CLOSECHILDWINDOWS - закрывает все дочерние окна шелла
RSA_SWITCHTOUSERMODE - переключает шелл в режим пользователя
RSA_TURNMONITORON - включает монитор
RSA_TURNMONITOROFF - отключает монитор
RSA_ENDVIPSESSION - завершает личную (VIP) сессию клиента (только с версии 4.52)

Функция является асинхронной.
-----------------------------------------------------------------------------------
Как мне через апи завершить личную VIP сессию клиента? через API !!!!

bogomolv 29-07-2006 22:46 466201

kpuk
А какое отношение имеет ко всему этому Autoit? Разбирайся с API!

kpuk 30-07-2006 13:11 466291

Ну какбы на нём писать просто - это раз!
И в нём вроди как есть функция dllcall которая позволяет работать с апи!
ВОт по этому и спрашиваю

VelDmi 30-07-2006 14:47 466308

kpuk
На Autoit сделать то, что ты хочешь невозможно. Так же как и на WBS. Это проблема реализации API в програме RunpadShell.

ANGRO 01-08-2006 22:30 467211

Набросал включение отключение сетевой карточки, мож кому пригодится.
Код:

$sConnectionName = "Home Office Connection"
$shellApp = ObjCreate("shell.application")
$oNetConnections = $shellApp.Namespace(0x00000031)
For $folderitem in $oNetConnections.items
    For $verb in $folderitem.verbs
        if $folderitem.name = $sConnectionName Then
          $verb.DoIt
          Sleep(1000)
          ExitLoop 2
        EndIf
    Next
Next
If $folderitem.name <> $sConnectionName Then msgbox(48, "Ошибка", "Имя соединения указанно не правильно")
Exit

Посмотрите позжалуйста Namespace(0x00000031) по этому адресу находятся "Сетевые подключения" по крайней мере у меня, судя по всему и во всех ХР подобных операционках.

bogomolv 02-08-2006 06:03 467285

ANGRO
??????
Код:

devcon disable *net*

ANGRO 02-08-2006 10:19 467369

Цитата:

devcon disable *net*
Понятно, у меня его на W2K3SP1 нет я думаю что в WinXP его тоже не найдут. А если приложению необходимо работать скажем на 500 разных компьютерах не являющихся собственностью одной конторы, да даже если и являющихся, что закидывать на каждый комп кучу DLL, EXE, OCX и т.д. А ведь есть компы где запрещено инсталлирование каких либо компонентов без проверки.
Да да знаю скажиш можно включить в сборку и не кто не узнает, а ещё лучше прямо в реестор писать и всё.
Я стараюсь придерживаться другой концепции, пользоваться только стандартным API настолько глубоко насколько знания позволяют и ничего не писать напрямую в реестор, пусть Win сам с этим разбирается.
Для узкой направленности автокликанья в своей винде и сборках для друзей и помощи на работе самый короткий путь типа "взял скачал, на винт забросил, команду передал" подходит, а когда билд уходит на сторону хочется гарантировать определённые вещи.
В любом случаи ИМХО мне интересней учится взаимодействию с операционкой используя её возможности.
P.S. сколько твой devcon весит, а сколько мой код ?

bogomolv 02-08-2006 11:28 467402

ANGRO
Может, все же зайдешь по ссылке, которую я тебе давал? Это снимет кучу заданных вопросов.
А на счет "интереснее" - тут спору нет. :)

ANGRO 03-08-2006 00:32 467649

bogomolv
Спасибо воспользуюсь твоим предложением.
Namespace(49) разобрался писать нужно так Namespace(0x00000031)

Creat0R 03-08-2006 03:17 467674

Кто нибудь может пожалуйста помочь разобраться с такой пропблемой:

Чтобы прописывать строчки в начало секции *.ini файла, я воспользовался функцией Func IniWriteVP...
Так вот, когда я попытался воспользоваться этой функцией в (цикле?) Select...Case...EndSelect, то выдалась ошибка о том что нету совпадения между Select и Case и между EndSelect (что-то в этом роде), и вообще практический все команды в таком цикле не исполняются (т.е если в этом цикле используется упомянутая функция). Вот пример, который по идее, должен записывать в заданную секцию, параметр со значением, в первую строку этой секции:


Код:

Select
       
        Case $CmdLine[0] = 0

$File = "Test.ini"
$Sect = "Test Section"
$Param = "Parametr Test"
$Val = "Value Test"


        IniWriteVP($File,$Sect, $Param, $Val, 1)
                Func IniWriteVP($File,$Sect, $Param, $Val, $Pos=0)
                        IniWrite($File,$Sect,$Param,$Val)
        EndFunc

EndSelect

Но как я уже упомянул, этого не происходит, и выдаётся ошибка.
Может кто нибудь подскажет в чём дело, как это осуществить?

XXXler 03-08-2006 16:23 467923

Цитата:

IniWriteVP($File,$Sect, $Param, $Val, 1) Func IniWriteVP($File,$Sect, $Param, $Val, $Pos=0) IniWrite($File,$Sect,$Param,$Val) EndFunc
ну теперь я буду матерится :read: , сколько можно топтатся на этих граблях?

Функция - это подпрограмма, описанная за пределами основного тела программы (впрочем в AutoIT это не обязательно, т.к. нет четкой границы, можно ставить и в начале (после объявления глобальных переменных ипользованных в ней), и в конце), которую можно вызывать из основного тела программы, передавая ей параметры, получая от нее результат:

Код:

;~ Описываем функцию:
Func MyFunc($par1,$par2)
;~ Выводим сообщение с переданными параметрами
        MsgBox(0,$par1,$par2)
;~ Возвращаем результат Result
        Return "Result" 
EndFunc

;~ Тело программы
;~ .....................
$var=MyFunc("Заголовок","Сообщение")
MsgBox(0,"","Функция MyFunc возвранила значение "&$var)
;~ .....................

Значит смотрется это все будет так:

Код:

;~ Описываем функцию
Func IniWriteVP($File,$Sect,$Param,$Val,$Pos=0)
        Local $ValArr,$i
        If $Pos<>0 Then IniDelete($File,$Sect,$Param)
        $ValArr=IniReadSection($File,$Sect)
        If @error Or $Pos=0 Or $ValArr[0][0]<$Pos Then
                IniWrite($File,$Sect,$Param,$Val)
                SetError(@error)
        Else
                For $i=1 To $ValArr[0][0]
                        IniDelete($File,$Sect,$ValArr[$i][0])
                Next
                For $i=1 To $ValArr[0][0]
                        If $Pos=$i Then        IniWrite($File,$Sect,$Param,$Val)
                        IniWrite($File,$Sect,$ValArr[$i][0],$ValArr[$i][1])
                Next
        EndIf
EndFunc

;~ А теперь ее используем
Select
        Case $CmdLine[0] = 0
                IniWriteVP(@ScriptDir&"\Test.ini","Test Section","Parametr Test","Value Test",1)
;~ .......

EndSelect


Creat0R 03-08-2006 19:14 467976

XXXler
Цитата:

ну теперь я буду матерится
Не надо :sorry:

Цитата:

Значит смотрется это все будет так:
Приогромнейшее человеческое спасибо - За разъяснения и за примеры!

это то что и нужно было!

ANGRO 05-08-2006 10:54 468506

XXXler ты человек смотрю добрый разъесни тогда такую весч.

$var=MyFunc("Заголовок","Сообщение") ну с этим всё понятно, а вот здесь

Case $CmdLine[0] = 0
IniWriteVP(@ScriptDir&"\Test.ini","Test Section","Parametr Test","Value Test",1)


разве не нужно делать через Call(Func).

ANGRO 05-08-2006 11:24 468513

Может кто подскажет как создать WAN PPPoE соединение (обычно это соединение создающееся для работы через модем) и прописать туда логин пароль. Спасибо

XXXler 05-08-2006 12:29 468540

Цитата:

Цитата ANGRO
разве не нужно делать через Call(Func).

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

DenchikK 07-08-2006 04:14 468913

C хитрым кейгеном столкнулся - идентификации не происходит. Почитал
help - но так и не понял, можно ли из этого положения выйти. Как видно
по картинке AutoIt определяет лишь:
видимый тект:
Digerati и ключ (например HEUBGOKIMFLQRJNSP) в полях Edit1 и Edit2
4 кнопки: Static4, Static3, Static2, Static1


Dirk Diggler 07-08-2006 14:08 469106

я не понял, какой такой идентификации не происходит. Но попробуй еще WinSpy от nnCron, они здорово дополняют друг друга

DenchikK 07-08-2006 15:39 469181

Цитата:

я не понял, какой такой идентификации не происходит
Грубо говоря, такой функции, как WinWaitActive (и иже с ней), не за что зацепится. В окне в принципе нет ничего в разделах:

>>>>>>>>>>>> Window Details <<<<<<<<<<<<<
Title:

>>>>>>>>>>> Control Under Mouse <<<<<<<<<<<
Text:

Dirk Diggler 07-08-2006 22:33 469327

Как с пом. Autoit получить SID пользователя или группы? Я сделал функцию обработки файлового вывода от psgetsid.exe, но она слишком медленно работает.

Sanja Alone 08-08-2006 02:26 469360

DenchikK
Цитата:

идентификации не происходит
Ну, это не проблема :) В подобной ситуации нужно исп-ть 4-й режим определения окон Opt("WinTitleMatchMode",4).
Можно подождать этого окна вот так:
Код:

WinWaitActive('')
или так:
Код:

Do
Sleep ( 200 )
$handle = WinGetHandle ( "classname=#32770" )
Until $handle <> ""
WinActivate ( $handle )
WinWaitActive ( $handle )

P.S. Все это есть в справке по AutoIt. Кстати, именно по этой причине я не включил сией инфы в FAQ.
Процитирую AutoIt.chm:
Цитата:

Mode 4
Advanced mode.

In this mode special sequences are used in the title parameter so that window classnames and handles can be used. The text parameter remains the same.

The special sequences must contain no whitespace. They are:
"classname=CLASSNAME"
"regexp=REGEXP"
"active"
"last" or ""


"classname=" matches a window based on its classname. For example to identify a window that has the classname "MYCLASS1" then you would use "classname=MYCLASS1" for the title parameter.

"regexp=" matches a window matching REGEXP pattern.
"active" matches the currently active window (same as "" in the default WinTitleMatchMode).
"last" uses the last successful window match so you don't have to keep specifying the title and text again and again. e.g.

AutoItSetOption("WinTitleMatchMode", 4)
WinWaitActive("Untitled - Notepad")
WinClose("last") ; Closes the previously matched notepad window


Note: If "classname=", "regexp=", "active", "last" or "" are not used as the title then the window matching takes place as in Mode 1 making this a good mode for general use.

Sanja Alone 08-08-2006 04:23 469365

Dirk Diggler
Цитата:

Как с пом. Autoit получить SID пользователя или группы? Я сделал функцию обработки файлового вывода от psgetsid.exe
Столкнулся с подобной проблемой при написании скрипта для сохранения/восстановления настроек Outlook Express (нужен был SID текущего пользователя).
Решил похожим методом (т.е. слегка раком :) ), только без посторонних утилит и без обработки потоков с пом. соотв. ф-ций в последних бетах АвтоИт-а (RegRead здесь не катит по причине запрета на чтение требуемой ветки):
Код:

Func findsid()
        Local $file, $sid
        RunWait(@ComSpec & ' /c for /F "tokens=5 delims=\" %j in ('&Chr(39)&'reg query "HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider"'&Chr(39)&') do (echo %j> %temp%\sid.tmp)','',@SW_HIDE)

        $file = FileOpen(@TempDir&'\sid.tmp',0)
        If $file = -1 Then
                SetError(1)
                Return(0)
        EndIf
        $sid=FileReadLine($file,1)
        FileClose($file)

        FileDelete(@TempDir&'\sid.tmp')

        Return $sid
EndFunc

А вообще, SID-ы пользователей записаны в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList; SID-ы групп - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\GroupMembership и HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy\GroupMembership. Только не понятно, как их сопоставить с названиями групп (за исключением стандартных групп, вроде S-1-1-0 /Все/, S-1-5-544 /Администраторы/, S-1-5-545 /Пользователи/ и т.п.). В справочнике Джерри Хонейкатта по реестру WinXP, к сожалению, подробной инфы по рассматриваемой теме нет. Т.о., использованная тобой утилка Марка Руссиновича является вполне приемлемым ответом на твой же вопрос, если нет желания копать глубже или переписывать эту же утилку на АвтоИт с пом. DllCall-ов, вооружившись знанием WinAPI.
Цитата:

но она слишком медленно работает
И как это можно исправить, если ты не приводишь код?

Creat0R 08-08-2006 06:48 469380

Подскажите пожалуйста, можно ли сделать сравнение даты создания (изминения) файла в сети, с другой датой (указанной в скрипте), и если дата создания (изминения) файла, ровняется указанной в скрипте, то пусть появляется меседжбокс, в противном случае, что-то должно делаться. Т.е, допустим в сети, лежит файл, который в последний раз был изменён 25-ого Января, 2006 г. А в скрипте, указать ту же дату для сравнения - 25-го января 2006 г. И если в момент запуска скрипта, файл не был изменён, и дата его изменения ровна указанной в скрипте, то пусть выскакивает меседжбокс, а если файл был изменён (т.е если уже его дата изминения не ровняется указанной), то что-то должно делаться (неважно что :) ).
Если такое возможно, подскажите плиз как это оуществить.

Заранее благодарю за внимание!

Dirk Diggler 08-08-2006 13:42 469522

Цитата:

И как это можно исправить, если ты не приводишь код?
А никак. Надо придумать другой способ. Код вот:

Код:

Func GetSid($_Username)  ;возвращает сид юзера. имя должно быть полным, все довески(домен, комп) должны быть уже переданы в функкцию
        FileDelete(@TempDir & '\getsid.tmp')
        Run(@ComSpec & ' /c "' & @ScriptDir & '\psgetsid.exe" ' & $_Username & '> ' & @TempDir & '\getsid.tmp', '', @SW_HIDE)
        Sleep(50)
        Local $f= FileOpen(@TempDir & '\getsid.tmp',0)
        Local $a= FileReadLine($f,2)
        FileClose($f)
        If StringStripWS ( $a, 8) <> "" Then Return StringStripWS($a, 8)
        Return $_Username
EndFunc

Дело в том, что эта функция используется в цикле до 2-3 тыс. раз. И обработка файлового вывода вообще не вариант, цикл будет выполняться годами. Есть вариант вот такой:
Код:

Func GetSid($UserName, $Domain)

    Dim $UserSID, $oWshNetwork, $oUserAccount
    $objWMIService = objGet( "winmgmts:{impersonationLevel=impersonate}!//"  & @ComputerName & "/root/cimv2")
    $oUserAccounts = $objWMIService.ExecQuery("Select SID from Win32_UserAccount WHERE Name = '" & $UserName & "' AND Domain = '" & $Domain & "'")
    For $oUserAccount In $oUserAccounts
        Return $oUserAccount.SID
    next
EndFunc

Но у него свои недостатки - в функцию надо передавать отдельно имя пользователя и домен. В то время как первая функция умеет конвертировать имена в любом формате, например user@domain.local

AdrenalinE 10-08-2006 12:40 470446

Код:

HotKeySet("{PAUSE}", "Pause")
Global $Paused

While 1
    $Click = _FindMonster()
    MouseClick('left', $click[0], $click[1], 1, 0)
    Attack()
WEnd



Func _FindMonster()
    Dim $iCoord
    While 1
        $iCoord = PixelSearch(250, 225, 374, 274, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(375, 225, 474, 274, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(415, 275, 474, 359, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(375, 360, 474, 399, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(250, 225, 374, 399, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(250, 175, 474, 224, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(475, 175, 574, 399, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(0, 400, 424, 474, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(0, 175, 259, 399, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        $iCoord = PixelSearch(0, 100, 664, 174, 0xFF00FF, 25, 1)
        If @error <> 1 Then ExitLoop
        ; The sleep is there to prevent the PixelSearches
        ; from lagging the script a lot if a monster is not found
        ; in the first loop
        Sleep(250)
    WEnd
    $iCoord[0] = $iCoord[0] + 4
    $iCoord[1] = $iCoord[1] + 4
    Return $iCoord
EndFunc  ;==>_FindMonster

Func Attack()
    While 1
        If WinActive("SRO_Client") And PixelGetColor(77, 47) = 3947324 Then;IF ACTIVE AND INGAME
            ; USE SKILL 1 (mine is sword attack, strike and smash) UNLESS MONSTER IS CLOSE TO DYING
            if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(442, 45) = 16762566) Then
                Send("2")
                Sleep(1000)
            EndIf
            ; USE SKILL 7 (mine is combo sword attack (5hits)) UNLESS MONSTER IS ALMOST DOWN
            if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(475, 45) = 16743291) Then
                Send("1")
                Sleep(1000)
            EndIf
            ; USE IMBUE SKILL (mine is skill 2) UNLESS MONSTER IS ALMOST DOWN
            if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(475, 45) = 16743291) Then
                Send("3")
                Sleep(1000)
            EndIf
            ; USE SKILL 5 (mine is sword attack, stab and smash)UNLESS MONSTER IS CLOSE TO DYING
            if (PixelGetColor(605, 23) = 14077580 And PixelGetColor(442, 45) = 16762566) Then
                Send("4")
                Sleep(1000)
            EndIf
            ;THIS WILL TRY AND PICK UP ANYTHING EVEN IF YOU WALK PASSED SOME GOLD
            Send("g"); CHECK WICH KEY TO USE IN SILKROAD OPTIONS !!
            Sleep(1000); DEFAULT GRABKEY IN SILKROAD IS "G"
        EndIf
    WEnd
EndFunc  ;==>attack

Func Pause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
    WEnd
EndFunc  ;==>Pause

нужно подправить скриптик, после нахождения монстра-клика-атаки - почему-то не происходит возврат на поиск монстра =\
подскажите что не так?

Sanja Alone 11-08-2006 02:38 470722

AdrenalinE
Цитата:

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

Func Attack()
While <монстр жив>
;чистим монстру репу
WEnd
EndFunc


sunb0rn 11-08-2006 18:47 471111

Цитата:

Код:

Func GetSid($_Username)  ;возвращает сид юзера. имя должно быть полным, все довески(домен, комп) должны быть уже переданы в функкцию
        FileDelete(@TempDir & '\getsid.tmp')
        Run(@ComSpec & ' /c "' & @ScriptDir & '\psgetsid.exe" ' & $_Username & '> ' & @TempDir & '\getsid.tmp', '', @SW_HIDE)
        Sleep(50)
        Local $f= FileOpen(@TempDir & '\getsid.tmp',0)
        Local $a= FileReadLine($f,2)
        FileClose($f)
        If StringStripWS ( $a, 8) <> "" Then Return StringStripWS($a, 8)
        Return $_Username
EndFunc


А если попробовать вместо Run() и Sleep(50) --> RunWait () ставить, а то точно по как минимум 100 секунд функция исполняется!!! И скорость выполнения не будет зависить от времени, а менятся.

Creat0R 14-08-2006 00:19 471558

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

Creat0R 14-08-2006 01:05 471564

Всё, разобрался :) ...

Я пробовал через макрос @ScriptName, но таким образом удаляется сам скрипт, а если он закомпилирован в екзешник, то он не удаляется... вот я и решил эту задачю другим способом, и опять таки в помощь пришёл батник:

Код:

FileWrite(@ScriptDir&"\temp.bat", "Del /q """ & @ScriptDir & "\" & @ScriptName & """" & @CRLF & "Del /q """ & @ScriptDir & "\temp.bat""")
Run("temp.bat", @ScriptDir, @SW_HIDE)


P.S:
А на счёт моего предыдущего вопроса в посте #272 никто не знает? хотябы подскажите, возможно такое реализовать на AutoIt, или нет?

amel27 14-08-2006 07:31 471598

Есть вопрос - можно ли по хэндлу восстановить имя файла?.. В противном случае функции FileFind* почти бесполезны

EDIT: все, разобрался - повелся на имена функций, несмотря на схожее название эти две функции делают совершенно разные вещи - одна возвращает хэндл, а другая имя

Creat0R 15-08-2006 06:43 472113

Кто-то может подсказать - как можно осуществить поиск определённого слова, в файле (например, в test.tmp), и именно в простом файле содержащем текст, а не в ini (т.к решение для ини уже тут пдооставили ранее).

Заранее спасибо!

Sanja Alone 15-08-2006 09:40 472160

Creat0R
Цитата:

поиск определённого слова в файле
Код:

;в каком файле искать текст
$InputFile = 'test.tmp'
;какой текст искать
$TxtToFind = 'иСкоМый Текст'

;демонстрация работы ф-ции
$var = _FindTextInFile($InputFile,$TxtToFind)
MsgBox(0,'','Текст <'&$TxtToFind&'> найден в строке '&$var[0]&@LF&'Содержимое строки:'&@LF&@LF&$var[1])

;ф-ция возвращает массив из двух эл-тов (0 - номер строки файла, к-рая содержит искомый текст, 1 - сама строка)
Func _FindTextInFile($ifile,$text)
Local $i
Dim $ret[2]
$file = FileOpen($ifile,0)
$a = StringSplit( FileRead($file, FileGetSize($ifile)), @LF)
FileClose($file)
#cs
поиск кириллического текста без учета регистра символов возможен только в сл.
принудительного приведения искомой и текущей анализируемой строк к общему регистру
(ф-ции StringLower или StringUpper),
т.к. данный режим ф-ции StringInStr работает только с латиницей
#ce

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


bogomolv 15-08-2006 13:35 472284

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 472534

bogomolv

Строго говоря, оба варианта находят не слова, а заданные последовательности символов. Например, при поиске слова "кот" мы найдем и "котлету", и "антрекот" и много еще чего... В AutoIt явно не хватает поддержки регулярных выражений, в качестве альтернативы можно использовать FINDSTR. Например, следующий скрипт ищет все вхождения слова BASIC:
Код:

If RunWait('@ComSpec@ /C findstr /I "\<baSic\>" lang.txt','',0)=0 Then
...
EndIf

Ложка дегтя - судя по всему FINDSTR распознает только слова из английских букв, остальные для него лишь набор символов.

XXXler 15-08-2006 19:33 472549

Цитата:

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

Creat0R 15-08-2006 22:04 472603

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 472610

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 472650

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 472655

Дополнил код по сетевым интерфейсам.
Не могу понять почему не получается обновить информацию по состоянию интерфейса после включения / выключения.
Мож кто подскажит.
Код:

#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 472667

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 472676

bogomolv
Цитата:

У тебя потрясающее умение делать ошибки там, где их сделать невозможно!
Я знаю :)

Цитата:

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

Цитата:

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

amel27 16-08-2006 02:29 472687

XXXler
Цитата:

что мешает искать в строке вхождение не "кот" а " кот ", т.е. с пробелами с обоих сторон?
Тогда придется еще учесть все знаки препинания, а также расположение слова в начале и конце строки

Creat0R 16-08-2006 03:48 472695

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

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

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

lakis 16-08-2006 07:15 472714

Есть у кого нибудь скрипт на MsOffice 2003 rus?

bogomolv 16-08-2006 08:33 472737

Creat0R
Цитата:

И он не работает
Не могут они не работать! Опять демонстрируешь свои потрясающие умения? :)

ANGRO 16-08-2006 23:47 473207

lakis
Цитата:

Есть у кого нибудь скрипт на MsOffice 2003 rus?
А здесь смотреть не пробовал.

Dirk Diggler 17-08-2006 09:56 473328

Цитата:

Не могут они не работать!
Вы по привычке там переменную окружения заключаете не в %%, а в @@. И уже не в первый раз. CreatOR, как и положено тупизню, не пытался разобраться в механизме действия скрипта, потому и не понял, почему скрипт не работает

Dark Engel 17-08-2006 13:27 473464

Господа. Никто не подскажет как запустить файл.hta
Я делал так

Код:

run ("mshta.exe /имя файла.hta")
mshta.exe в прцессах появляется но ничего не открывает. Плиз хелп.

DmitryOlenin 17-08-2006 14:09 473497

Dark Engel
Смоти соседнюю тему ;) Просто start /wait wpi.hta и все...

Sanja Alone 17-08-2006 20:36 473705

Dark Engel
Цитата:

Никто не подскажет как запустить файл.hta
Нужно указать ПОЛНЫЙ путь к файлу:
Код:

run ("mshta путь\имя файла.hta")
Если файл находится рядом со скриптом, строка запуска будет выглядеть так:
Код:

run ("mshta " & @ScriptDir & "\имя файла.hta")

DenchikK 18-08-2006 03:51 473834

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/au...t-v3-setup.exe

ANGRO 18-08-2006 15:17 474057

А вот очередной семпл 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))


bogomolv 18-08-2006 19:17 474179

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

Dirk Diggler 19-08-2006 00:04 474271

А что такое COM object support и COM вообще? Дайте пару ссылок

ANGRO 19-08-2006 00:23 474276

Как вариант 288 пост

Creat0R 19-08-2006 12:17 474375

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 474387

Цитата:

;Пытаемся проверить, закачался ли файл, но безуспешно :) 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 474461

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 474699

Цитата:

Как вариант 288 пост
Это Вы мне? А что там написано про COM? я не понял. :(

ANGRO 20-08-2006 21:46 474788

Очередной семпл, в дополнение к 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 475111

Какой будет правильный синтаксис в скрипте 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 475159

Цитата:

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 475172

XXXler

Спасиба!

ANGRO 21-08-2006 20:08 475233

А вот кстати как это будет на 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 475300

Рабочий вариант:
Код:

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 475434

Нужен скрипт который бы сканировал текущий каталог и выводил в результате все подпапки, вот что у меня вышло
Код:

;--------------------------------------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 475516

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 475525

конечно, синтаксическая ошибка. внимательнее надо быть, у Вас апостроф вместо & .

XXXler 22-08-2006 13:12 475526

Код:

;~ Функция вывода структуры каталогов
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 475715

спасибо DIR /AD /S /B >test.txt меня полностью удовлетворил :)

Creat0R 24-08-2006 00:15 476167

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

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

Ivan1986 24-08-2006 00:32 476170

А ProcessClose разве его не корректно завершеает?
Кстати не нашел там ProcessKill

По поводу винампа попробуй
Код:

AutoItSetOption("WinTitleMatchMode", 4)
WinClose("classname=Winamp v1.x", "")


Creat0R 24-08-2006 01:14 476175

Ivan1986
Цитата:

А ProcessClose разве его не корректно завершеает?
Нет, эта опция "Убивает процесс".

Цитата:

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

Код:

;Проверяю, если винам не запущен, то...
If Not ProcessExists("winamp.exe") Then

;Счинываю размещение винампа с реестра...
$PathToWinamp = RegRead("HKEY_CURRENT_USER\Software\Winamp", "")       

;Запускаю винамп...
        Run($PathToWinamp & "\winamp.exe", "")

EndIf

AutoItSetOption("WinTitleMatchMode", 4)
  WinActivate("classname=WINAMP", "")
  Sleep(1500)

;Открываю окно для выьбора файлов
Send ("l", 1)

Но таким образом, не всегда сработает, например, если машина слабая (медленная), то окно для выбора файлов может не появиться, а хотелось бы сделать ожидание окна винампа - но не получается.

LORDMA 28-08-2006 11:20 477554

Вложений: 1
Уважаемые знатоки помогите как в элементе "ClassNameNN: SysTreeView321" поставить чекбокс в нужном мне месте . Перерыл справку но ничего не нашел , наверняка есть как это сделать но ничего не могу найти??

Creat0R 28-08-2006 14:52 477616

Интересно, как можно задать в скрипте, чтобы определял два параметра командной строки? Т.е, например, я запускаю закомпилированный скрипт таким образом - start script.exe %l %c - Где %l это параметр, который интерпритируется как ссылка (запуск происходит их браузера opera), а %c это параметр, который передаёт содержимое буффера обмена. Так вот, после такого запуска, нужно чтобы для первого параметра происходило одно дейсТвие (пусть даже выводитя MsgBox со значением), а для второго параметра другое действие.

Или хотябы сделать так, чтобы можно было распозновать параметр не по его конечному значению (если %l то значение будет ссылкой по которой было нажато действие для вызова скрипта), а именно по его изначальному виду. Если скрипт допустим запущен так - start script.exe %l - то нужно чтобы в скрипте было распознование того, что его (скрипт) "вызвали" именно с таким ключом (т.к в скрипте есть ещё другие функции, вызываемые другими ключами)... я пробовал таким образом:

Код:

If $CmdLine[1] = "%l" Then
; Что-то делаем...
EndIf

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

Код:

If $CmdLine[1] = 0 Then
; Что-то делаем...
EndIf

Что-то делается :) , но тогда если в скрипте присутствует If $CmdLine[0] = 0 Then... То и в этом условии что-то делается (т.е как будто скрипт был запущен без параметров).

Sanja Alone 29-08-2006 04:09 477844

Creat0R
Вот простенький разборщик ком. строки:
Код:

If $CmdLine[0]<>0 Then
        For $k=1 To $CmdLine[0] Step 1
                ;проверка наличия конкретного ключа
                If $CmdLine[$k]="/a" Then
                ; Что-то делаем...
                EndIf
                ;проверка наличия одного из ключей
                Select
                        Case $CmdLine[$k]="/b"
                ; Что-то делаем...
                        Case $CmdLine[$k]="/c"
                ; Что-то делаем...
                        Case $CmdLine[$k]="/d"
                ; Что-то делаем...
                EndSelect
        Next
Else
        MsgBox(16,'Ошибка',"Командная строка пуста...",7)
        Exit
EndIf

P.S. Гораздо удобнее вместо "Что-то делаем..." присваивать определенное значение какой-то переменной, а уже в самой программе производить действия в зависимости от значения этой переменной-флажка. К тому же, в данном сл., можно без проблем оформить анализ ком. строки в виде ф-ции.

KotoVAS 29-08-2006 19:01 478179

Доброго времени суток!!!
1.Сначала у меня вопрос
Как запустить папку Панель управления? а ещё лучше сразу открыть "свойства системы" (Система)

2.Обнаружил косяк. Собрал exe-шник, у меня работает хорошо и закрывается, а вот у друзей работает, но не закрывается - просто сворачивается в трей - что делать ??

3.И ещё как оказалось - у них не отображаются сообщения

MsgBox(0, "Сменщик имени рабочей группы", "Вы уже в группе PLEXUS")

Вааще странно. У меня всегда отображались :(

boss911 29-08-2006 19:18 478185

KotoVAS
Цитата:

Как запустить ... а ещё лучше сразу открыть "свойства системы" (Система)
Код:

%WINDIR%\system32\sysdm.cpl

boss911 29-08-2006 22:38 478252

KotoVAS
Цитата:

А можно код открытия полностью ???
Если вопрос ко мне, то я AutoIt неюзаю, а вообще, чтоб запустить команду в скрипте, то это наверно элементарно, ты же юзаеш и незнаеш как запустить команду!! :)

KotoVAS 29-08-2006 22:43 478254

Да все, как запустить я нашел - А мож знаешь надежный спосб переключения между закладками в "Свойства системы". Мышью пользвать и CTRL+TAB - не очень надежно )

Sanja Alone 30-08-2006 01:45 478320

KotoVAS
Цитата:

надежный способ переключения между закладками в "Свойства системы"
Я еще в старой теме по AutoIt приводил ссылку на "Справочник по командам rundll32". Vadikan посчитал нужным внести эту информацию в "шапку" данной темы и был абсолютно прав. Там есть строки запуска любых диалоговых окошек...

Вот полный список закладок окна "Свойства системы":
System Properties: Advanced
System Properties: Advanced Tab
System Properties: Automatic Updates (2003)
System Properties: Automatic Updates (XP)
System Properties: Computer Name
System Properties: Device Manager
System Properties: General
System Properties: Hardware
System Properties: Hardware Profiles
System Properties: Network Identification
System Properties: Performance
System Properties: Remote (XP)
System Properties: Remote (2003)
System Properties: System Restore
System Properties: User Profiles

P.S. Сейчас подправлю шапку, чтобы всем было понятно зачем нужен этот справочник.

Creat0R 30-08-2006 11:04 478411

Sanja Alone

Цитата:

Вот простенький разборщик ком. строки:
Болшое спасибо! это мне поможет запускать программу с несколькими ключами. Но вот как запускать с ключом, который заранее не известен? Т.е если запуск происходит с ключом %l, то скрипт его не распознаёт, т.к в результате этот ключь преобразовывается в ссылку (самим браузером). А нужно распознать что скрипт был запущен именно с таким ключом, и в данном случае должны происходить определённые операции.

XXXler 30-08-2006 14:39 478556

Цитата:

Болшое спасибо! это мне поможет запускать программу с несколькими ключами. Но вот как запускать с ключом, который заранее не известен?
тогда надо либо определится с количеством и\или порядком ключей\параметров либо делать подключи и опциональные параметры
я уже давал пример здесь, если его видоизменить то можно передавать определенные значения с подключами:
Код:

For $i=1 To $CmdLine[0]
Select
Case StringLeft(CmdLine[$i],5)="/url="
$url=StringTrimLeft(CmdLine[$i],5)

Case StringLeft(CmdLine[$i],6)="/save="
$savename=StringTrimLeft(CmdLine[$i],6)

....

EndSelect
Next

тогда можно вызывать с параметрами /url=http://ya.ru/logo.gif и\или /save=c:\temp, только следует не забывать что параметры с пробелами следует заключать в кавычки

prokazzza 30-08-2006 15:07 478573

Sanja Alone

помогите мне сделать сделать маленький скрипт на RAR SFX архив, нажать извлечь, потом вставить пароль с текстового дока, подождать пока распакуется, подождать пока запуститься установка проги, а потом нажать - No то есть не перезагружать комп.

заранее большое спасибо!

boss911 30-08-2006 17:22 478650

prokazzza
Цитата:

маленький скрипт на RAR SFX архив, нажать извлечь
Зачем? Ключ /s , что не подходит!!

prokazzza 30-08-2006 17:42 478659

boss911

Цитата:

Зачем? Ключ /s , что не подходит!!
Ключ то подходит а вот потом кто вставит пароль и нажмет на кнопки?

boss911 30-08-2006 18:02 478667

prokazzza
Цитата:

а вот потом кто вставит пароль и нажмет на кнопки?
Так может можно решить подобное через твик и вообще, что это за приложение!?
Сори, оффтоп получаетса!!

Creat0R 30-08-2006 18:26 478682

XXXler

Цитата:

можно передавать определенные значения с подключами
Приогромнейшее спасибо!

Цитата:

следует не забывать что параметры с пробелами следует заключать в кавычки
Если запускать программу с браузера опера, то там для этого предусмотренна возможность прописывания ключа с заглавной буквы, и тогда передаваемое значение (в данном случае адрес url + выделенный текст) будет автоматический помещаться в кавычки.

Вот как я приминил это дело:

Код:

Select

; Всё что ниже, буде делаться если скрипт был запущен с каким либо параметром

    Case $CmdLine[0] <> 0

For $i=1 To $CmdLine[0]
Select
Case StringLeft($CmdLine[$i],5)="/url="
$url=StringTrimLeft($CmdLine[$i],5)

Case StringLeft($CmdLine[$i],5)="/txt="
$Text=StringTrimLeft($CmdLine[$i],5)

EndSelect
Next

; Пишу в файл преобразованные параметры (ключи) используя заданные для них переменные

FileWrite(@ScriptDir & "\test.txt", "Скопированный текст: " & $Text & @CRLF & "Текст был скопирован с этой странички: " & $url)

EndSelect


А команда для запуска из браузера такая:

Код:

Execute program, "Test.exe", "/url=%u /txt=%T"
В результате получаю файл с выделенным текстом (в момент вызова функции), и с адресом того документа, на котором было произведенно выделение текста\вызов функции.

Кстати, ты упустил символы $ у некоторых переменных CmdLine ;)

Sanja Alone 31-08-2006 05:00 478817

prokazzza
Цитата:

маленький скрипт на RAR SFX архив
Код:

;имя (или полный путь и имя) sfx-архива берем из ком. строки (если ничего нет - выходим)
If $CmdLine[0]=1 Then
        $sfx=$CmdLine[1]
Else
        MsgBox(16,'Ошибка',"Недопустимое содержимое командной строки",7)
        Exit
EndIf
       
;пароль (если нужно считать из файла, тогда см. в строну ф-ций FileRead, FileReadLine, IniRead в зависимости от формата файла)
$password='Мой pass'

AutoItSetOption("WinTitleMatchMode",4)
;запуск
$pid=Run('"'&$sfx&'" -s')
WinWait('classname=#32770','.exe')
$handle=WinGetHandle("")
;вставить пароль
ControlSetText($handle,'','Edit1',$password)
;нажать извлечь
ControlClick($handle,'','Button1')
;подождать пока распакуется
ProcessWaitClose($pid)

;дальнейшие действия зависят от того, что запускается из параметра комментария Setup sfx-архива
MsgBox(64,'Готово','Файлы извлечены из архива')


Sanja Alone 31-08-2006 05:11 478818

Creat0R
Если порядок параметров строго определен, то можно не париться с доп. текстом.
Тогда "анализ" ком. строки будет выглядеть так:
Код:

If $CmdLine[0]<>0 Then
        $url=$CmdLine[1]
        If $CmdLine[0] = 2 Then
                $Text=$CmdLine[2]
        EndIf
Else
        MsgBox(16,'Ошибка',"Командная строка пуста...",7)
        Exit
EndIf

Команда запуска из браузера так:
Код:

Execute program, "Test.exe", "%u %T"

Creat0R 31-08-2006 17:11 479140

Sanja Alone

Цитата:

можно не париться с доп. текстом.
Спасибо, действительно так проще.

Но у меня появилась немного другая проблема (на эту-же тему) - Дело в том, что если выделенный текст содержал кавычки (более чем две пары), то кавычки не попадают в файл. И ещё, если выделенный текст содержит кавычку, а затем пробел (в дальнейшем тексте, и именно в дальнейшем, не в предыдущем), то выдаётся сообщение с ошибкой выполнения сценария - Что мол переменная используется без того чтобы она была объявленна. А когда объявляю переменные, скрипт не выводит ошибок, но при таком случае (кавычка а затем пробел -> "текст ) вообще ничего не пишет в файл (кроме ссылки естественно). - Это лечится?


P.S:
Странно, но вот например, если выделить такой текст:

"Текст

То кавычка становится после слова (в файле):

Текст"

Sanja Alone 01-09-2006 03:57 479324

Creat0R
Цитата:

кавычки не попадают в файл
При передаче AutoIt-скрипту текста в кавычках из ком. строки, обрезаются первая и вторая кавычки, а текст внутри них считаеся одним параметром, НО! если за второй кавычкой вплотную идет текст, то и он "приклеивается" к содержимому текущего параметра (возможно, это ошибка разработчиков AutoIt). Пробелы вне этих кавычек являются разделителями параметров ком. строки.

Например, если в ком. строке скрипта я напишу:
Код:

"Hello, Остап Ибрагимович. Вы являетесь работником фирмы "Рога и копыта"?"
, то получу при разборе строки 3 параметра:
Код:

1 - "Hello, Остап Ибрагимович. Вы являетесь работником фирмы Рога"
2 - "и"
3 - "копыта?"

Можешь это легко проверить при пом. такого тестового скриптика:
Код:

For $i=1 To $CmdLine[0]
Msgbox(0,"Параметр "&$i,'<'&$CmdLine[$i]&'>')
Next

Т.о., если ты хочешь не потерять какой-то части текста, то должен анализировать полное содержимое ком. строки - $CmdLineRaw. А в этом сл., удобнее будет использовать первый вариант передачи параметров скрипту - "/url=%u /txt=%T"

P.S. Можешь еще попробовать побороться с буфером обмена. Похожая на твою задача была в старой теме - я решал ее вот так

Creat0R 01-09-2006 09:55 479390

Sanja Alone

Цитата:

Можешь еще попробовать побороться с буфером обмена
Как не странно, но к такому (подбному) решению я пришёл до затеи использовать параметры командной строки, для записи текста в файл - в скрипте я писал так:

Код:

$Text = ClipGet()

If $CmdLine[0] <> 0 Then

$Url = $CmdLine[1]

FileWrite(@ScriptDir & "\File.txt", "Скопированный текст: " & $Text & @CRLF & "Текст скопирован с документа: " & $Url)

EndIf

А команду в браузере писал так:

Код:

Copy & Execute program, "Script.exe", "%u"
Таким образом, до вызова самого скрипта, выделенный текст в документе, помещается в буффер обмена, и скрипт “берёт” из буффера полный текст в переменную, и вписывает в файл. Это решение в принципе не имеет проблем, но причина по которой я хотел узнать как передавать два значения (ключа) скрипту, являлась обходом помещения текста в буффер обмена, т.е чтобы не занимать лишни раз буффер обмена.

Ещё раз спасибо за помощь!
-------------------------------------

У меня тут появилась проблема с другой сферы...

Я сделал немного примитивный (пробный) гуи интерфейс (см. код ниже), и есть пару вопросов по этому поводу:

А) Как можно сделать, чтобы после зажатия галки у надписи “Опция”, окно (MsgBox) появлялось только после зажатия, а не каждый раз. Т.е в данный момент, если я зажму галку, то сообщение появляется, если отожму, то тоже появляется - как сделать чтобы появлялось только после зажатия?

Б) У меня в гуи (GUI), есть две кнопки (кроме прочих) - Одна для отмечивания всех галок ("Выбрать все"), а другая для их снятия ("Очистить все") - Вопрос: Как сделать чтобы была такая одна кнопка, а ещё лучше тоже чекбокс, после нажатия которого\ой, выделялись бы все чекбоксы, а если отжать эту\от кнопку\чекбокс, то чтобы также и отжимались все остальные чекбоксы?

Г) Это самая большая прблема, и она у меня имеет наивысшый приоритет для решения - Я поместил в гуи прогресс бар (progressbar), и хотел бы добиться такого результата, чтобы в то время, как происходит копирование определённых файлов, этот прогресс бар был задйствован. Т.е если я копирую например большой файл (фильм к примеру), то чтобы пока он копировался, ползунок бегал в прогрес баре. Мне в принципе не нужно чтобы происходил там какого то рода подсчёт размера файла (хотя думаю в этом и заключается достижение моей задачки), и на основе чего и делался прогресс, а чтобы просто было видно что копирование в прогрессе (и не важно в каком этапе оно находится :) ).

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


Скрипт:

Код:

#include <GUIConstants.au3>

$Form1 = GUICreate("Test", 450, 370, 214, 126)

$Opt = GUICtrlCreateCheckbox("Опция", 230, 50, 300, 20)

$File = GUICtrlCreateCheckbox("Файл", 70, 50, 97, 17)
$Edit = GUICtrlCreateCheckbox("Правка", 70, 70, 97, 17)
$View = GUICtrlCreateCheckbox("Вид", 70, 95, 97, 17)
$Bookmarks = GUICtrlCreateCheckbox("Закладки", 70, 120, 97, 17)
$Session = GUICtrlCreateCheckbox("Сеансы", 70, 145, 97, 17)

$progressbar1 = GUICtrlCreateProgress (10,10,200,20)
GUICtrlSetColor(-1,32250)

$All1 = GUICtrlCreateButton("Выбрать все", 70, 330, 90, 23)
$All2 = GUICtrlCreateButton("Очистить все", 70, 300, 90, 23)

$Start = GUICtrlCreateButton("Выполнить", 260, 330, 93, 25)
$Close = GUICtrlCreateButton("Выход", 360, 330, 70, 25)

Dim $radioval1

$group_1 = GUICtrlCreateGroup ("Группа", 255, 190, 140, 110, 100)
GUIStartGroup()
$radio_1 = GUICtrlCreateRadio ("Вариант 1", 285, 220, 90, 20)
GUICtrlSetState ($radio_1,$GUI_CHECKED)
$radio_2 = GUICtrlCreateRadio ("Вариант 2", 285, 270, 90, 20)

GUISetState(@SW_SHOW)
GUISetState ()

        While 1

; Здесь по идее, хотелось бы чтобы прогресс бар начал крутится, а остановится пусть в конце скрипта (перед wend)

$msg = GuiGetMsg()
       
        If $msg = $Opt Then MsgBox(48, "Atantion", "This is a test")
       
If $msg = $All1 Then

        GUICtrlSetState ($File,$GUI_CHECKED)
        GUICtrlSetState ($Edit,$GUI_CHECKED)
        GUICtrlSetState ($View,$GUI_CHECKED)
        GUICtrlSetState ($Bookmarks,$GUI_CHECKED)
        GUICtrlSetState ($Session,$GUI_CHECKED)
       
EndIf

If $msg = $All2 Then

        GUICtrlSetState ($File,$GUI_UNCHECKED)
        GUICtrlSetState ($Edit,$GUI_UNCHECKED)
        GUICtrlSetState ($View,$GUI_UNCHECKED)
        GUICtrlSetState ($Bookmarks,$GUI_UNCHECKED)
        GUICtrlSetState ($Session,$GUI_UNCHECKED)

EndIf
       
If $msg = $GUI_EVENT_CLOSE  Or $msg = $Close Then Exit

Select
       
        Case $msg >= $radio_1 AND $msg <= $radio_2
        $radioval1 = $msg - $radio_1

        Case $msg = $Start

If $radioval1 = 0 Then

                If GUICtrlRead($Opt) = 1 Then

EndIf

                If GUICtrlRead($File) = 1 Then


EndIf
       
                If GUICtrlRead($Edit) = 1 Then

               
EndIf

                If GUICtrlRead($View) = 1 Then


EndIf

                If GUICtrlRead($Bookmarks) = 1 Then


EndIf

                If GUICtrlRead($Session) = 1 Then

                       
EndIf

If GUICtrlRead($File) <> 1 and GUICtrlRead($Edit) <> 1 and GUICtrlRead($View) <> 1 and GUICtrlRead($Bookmarks) <> 1 and GUICtrlRead($Session) <> 1 and GUICtrlRead($Opt) <> 1 Then

                MsgBox(48, "Error", "Выберите как минимум один чекбокс")
        ContinueLoop
EndIf

        MsgBox(64, "Finishing...", "Финито 1", 15)

        GUICtrlSetState ($Opt,$GUI_UNCHECKED)       
        GUICtrlSetState ($File,$GUI_UNCHECKED)
        GUICtrlSetState ($Edit,$GUI_UNCHECKED)
        GUICtrlSetState ($View,$GUI_UNCHECKED)
        GUICtrlSetState ($Bookmarks,$GUI_UNCHECKED)
        GUICtrlSetState ($Session,$GUI_UNCHECKED)
       
EndIf

If $radioval1 = 1 Then

                If GUICtrlRead($Opt) = 1 Then

EndIf

                If GUICtrlRead($File) = 1 Then

EndIf
       
                If GUICtrlRead($Edit) = 1 Then
                       
EndIf

                If GUICtrlRead($View) = 1 Then

EndIf

                If GUICtrlRead($Bookmarks) = 1 Then

EndIf

                If GUICtrlRead($Session) = 1 Then
       
EndIf


If GUICtrlRead($File) <> 1 and GUICtrlRead($Edit) <> 1 and GUICtrlRead($View) <> 1 and GUICtrlRead($Bookmarks) <> 1 and GUICtrlRead($Session) <> 1 and GUICtrlRead($Opt) <> 1 Then

                MsgBox(48, "Error", "Выберите как минимум один чекбокс")
        ContinueLoop
EndIf


        MsgBox(64, "Finishing...", "Финито 2", 15)

        GUICtrlSetState ($Opt,$GUI_UNCHECKED)
        GUICtrlSetState ($File,$GUI_UNCHECKED)
        GUICtrlSetState ($Edit,$GUI_UNCHECKED)
        GUICtrlSetState ($View,$GUI_UNCHECKED)
        GUICtrlSetState ($Bookmarks,$GUI_UNCHECKED)
        GUICtrlSetState ($Session,$GUI_UNCHECKED)

EndIf
        EndSelect
                WEnd


sattva 01-09-2006 21:34 479711

Помогите разобраться почему не работает выбор строки из выпадающего меню для Adobe Creative Suite 2 Russian by cvs/SSG

Код:

ControlCommand('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1','SelectString','Photoshop CS2 9.0')
выбор строки "Photoshop CS2 9.0" не происходит

Sanja Alone 02-09-2006 04:07 479791

Creat0R

А)
Код:

If $msg = $Opt Then
        If GUICtrlRead($Opt)=$GUI_CHECKED Then MsgBox(48, "Atantion", "This is a test")
EndIf

Б) См. пример выше и читай о ф-циях GUICtrlRead ( controlID ), GUICtrlGetState ( [controlID] )

А где ты В) потерял? :)

Г) Прогрессбар - это весьма муторная штука, когда нет естественных привязок. Твой вариант - это именно тот случай (такая же проблема была и у меня в OEsr). Я не стал париться, и сделал простой "светофор" :) Он не мешает работе основного приложения (в данном сл. - архиватора) и дает пользователю представление о происходящем (для верности, можно в процессе/конце операции еще проигрывать звуковой файл и/или выводить сообщения в трее - SoundPlay ( "filename" [, wait] ), TrayTip ( "title", "text", timeout [, option] ) ). Я этого делать не стал, а ты можешь попробовать...



sattva
Цитата:

не работает выбор строки из выпадающего меню
Для начала, дай фокус данному эл-ту управления:
Код:

ControlFocus('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1')
Если это не поможет, то замени свою строку выбора эл-та комбобокса такой:
Код:

ControlCommand('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1',"SetCurrentSelection", ControlCommand('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1',"FindString",'Photoshop CS2 9.0'))
Ну, и самый тежелый случай (если 2 первых не работают):
Код:

Send("{DOWN число}")
, где "число" - это требуемое к-во нажатий на кнопку для выбора нужной строки комбобокса.

prokazzza 02-09-2006 18:10 479978

Sanja Alone

я не силен в скриптах пожалуста можно сделать вот скрипт

запуск c:/install/install.sfx.exe
нажать кнопку "извлечь"
вставить пароль из c:/install/password.txt
нажать кнопку "ок"
пождать пока распакуется RAR архив
подождать пока установится istall.exe
если выйдет надпись "сделать перезагрузку" нажать нет, если не выйдет надпись то ничего не делать.

sattva 02-09-2006 22:19 480020

Sanja Alone

Спасибо, сработал только этот вариант
Код:

Global $file='Adobe Photoshop CS2.msi', $key='keygen.exe'

; Запуск кейгена
Run ( $key )
WinWaitActive ( 'Adobe Creative Suite 2 Russian by cvs/SSG' )
ControlFocus('Adobe Creative Suite 2 Russian by cvs/SSG','Activation','obj_COMBOBOX1')
Send ("{DOWN}")


Sanja Alone 03-09-2006 01:58 480080

prokazzza
Цитата:

вставить пароль из c:/install/password.txt
Это неструктурированный текстовый файл или ini-файл? В какой кодировке? В какой строке находится пароль?

Цитата:

подождать пока установится istall.exe
Комментарий архива в студию!

Цитата:

если выйдет надпись "сделать перезагрузку" нажать нет, если не выйдет надпись то ничего не делать
А не проще ли будет указать ключ, отменяющий перезагрузку для данного приложения прямо в строке его запуска после извлечения из архива? (например: Setup=install.exe REBOOT=ReallySuppress /qn). Я надеюсь, что это загадочное приложение использует какой-то стандартный установщик (см. статью Типы инсталляторов).

amel27 03-09-2006 11:21 480132

Возвращаясь к задаче поиска вхождений заданного слова в произвольный текст. Выше я дал маху утверждая, что AutoIT не поддерживает регулярные выражения... хотя с русским опять облом - если метасимволы \l \u \w еще работают, то (?i) ни в какую... :(

StringRegExp - Check if a string fits a given regular expression pattern.
StringRegExpReplace - Replace text in a string based on regular expressions.

вариант поиска слова с использованием регулярных выражений (на основе скрипта Sanja Alone):
Код:

#include <File.au3>

$fileInput = 'file.txt'
$wordToFind= 'исКать'

$find = _FindTextInFile ($fileInput,$wordToFind)
If $find Then
        MsgBox (0, 'Поиск слова в файле',  'Слово "' & $wordToFind & '" найдено в ' & $find & '-й строке.')
Else
        MsgBox (0, 'Поиск слова в файле',  'Слово "' & $wordToFind & '" в файле не обнаружено.')
EndIf

Func _FindTextInFile ($ifile, $word)
        Local $i, $a, $ret=0
        _FileReadToArray($ifile, $a)
        For $i=1 To Ubound ($a)-1
                If StringRegExp ($a [$i], _WordToReg ($word) ) Then
                        Return $i
                EndIf
        Next
        Return 0
EndFunc

; перевод произвольного слова в регулярное выражение
; требуется для поддержки русских слов, так как (?i)
; воспринимает только регистры английских букв;
; пример: "Кот" --> "\<[кК][оО][тТ]\>"


Func _WordToReg ($word)
        Local $i, $c, $w=""
        If StringIsASCII($word) Then
                Return '(?i)\<' & $word & '\>'
        Else
                For $i=1 To StringLen($word)
                        $c = StringMid ($word, $i, 1)
                        If StringLower($c) == StringUpper($c) Then
                                $w=$w & $c
                        Else
                                $w=$w & '[' & StringLower($c) & StringUpper($c) & ']'
                        EndIf
                Next
                Return '\<' & $w & '\>'
        EndIf
EndFunc


Creat0R 03-09-2006 19:50 480258

Sanja Alone
Снова огромно спасибо за А) и Б)

Цитата:

А где ты В) потерял?
От волнения забыл про него ...

А на счёт Г), я всё же решил немного попариться, и нашёл, я бы сказал, обходное решение...

Вместо того, чтобы копировать файл командами AutoIt'а, я повесил копирование на ком. строку:

Код:

Run(@ComSpec & " /c copy /y ""c:\File.txt"" ""d:\File.txt""", "", @SW_HIDE)

; Затем заключил в вечную петлю прогресс бар, до тех пор, пока в системе висит процесс “cmd.exe”, т.е это значит, что до тех пор, пока будет делаться копирование...
While 1

        For $i = 5 To 100
          GUICtrlSetData ($progressbar1, $i)
          Sleep(1)
        Next
        If Not ProcessExists("cmd.exe") Then ExitLoop
Wend
        GUICtrlSetData ($progressbar1, 0)

Хотя и тут может быть проблема, ведь в этот момент, юзеру может приспичить включить ком. строку для своих целей...
Но и это можно обойти, создав той-же ком. строкой, файл во временной папке %temp%, и по завершению копирования удалять его, а проверку для завершения прогресс бара, делать так:

If Not ProcessExists("cmd.exe") or Not FileExists(@TempDir & "\mark.tmp") Then ExitLoop

Или может есть более надёжный способ, но тогда нужно узнать, возможно ли, и как, проверять когда был запущен процесс (cmd.exe), и если именно этот процесс не существует, тогда выходить с петли. Если кто-то подскажет возможно ли такое, и если да, то как осуществить, то буду очень признателен.
----------------------

У меня есть ещё один вопрос, и тоже в другом направлении -
Нужно взять в переменную, все последние символы идущие после определнного знака у значения другой переменной. Т.е, вот например значение переменной $Var ровняется c:\program files\my programm\test.zip - и нужно чтобы из этой переменной, вернулось такое значение - test.zip - в другую переменную, например в $Var1.
Но заранее, не известно, ни количество слэшей (\) в пути, ни количество символов после последнего слэша. Возможно такое осуществить?
Как я понимаю, тут как-то нужно задействовать одну из вариации команды String, но если честно, то я уже замучался в попытках подобрать подхолящюю для этой цели вариацию, и справка тоже не помогла :(

Я временно это решил опять-таки ком. строкой :) :
Код:

$Var = "c:\program files\my programm\test.zip"

; Беру нужное значение, и вывожу последние его символы после последнего слэша, в файл test.tmp
Run(@ComSpec & " /c for %a in (""" & $Var & "") do echo %~nxa> """ & @ScriptDir & "\test.tmp""")

; Помещаю новое значение (из файла) в переменную $Var1
$Var1 = FileReadLine(@ScriptDir & "\test.tmp", 1)

    MsgBox(0, "", The New Value is: " & $Var1)
FileDelete (@ScriptDir & "\test.tmp")

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

Sanja Alone 04-09-2006 02:17 480349

Creat0R
Цитата:

значение переменной $Var ровняется c:\program files\my programm\test.zip - и нужно чтобы из этой переменной, вернулось такое значение - test.zip - в другую переменную, например в $Var1.
Это очень просто:
Код:

Func PathName($fullpath)
        Local $s=StringInStr($fullpath,'\',0,-1) ;первый слэш с конца
        Local $n=StringMid($fullpath,$s+1)
        Local $p=StringLeft($fullpath,$s-1)
        Dim $pn[2]
        $pn[0]=$p ;путь
        $pn[1]=$n ;имя
        Return $pn
EndFunc


amel27 04-09-2006 02:45 480352

Creat0R
Цитата:

Нужно взять в переменную, все последние символы идущие после определнного знака у значения другой переменной. Т.е, вот например значение переменной $Var ровняется c:\program files\my programm\test.zip - и нужно чтобы из этой переменной, вернулось такое значение - test.zip - в другую переменную, например в $Var1.
Но заранее, не известно, ни количество слэшей (\) в пути, ни количество символов после последнего слэша. Возможно такое осуществить?
Вот вариант с применением регулярных выражений:
Код:

$var = 'c:\program files\my programm\test.zip'
$res = StringRegExpReplace ($var, '^.*\\', '')


Creat0R 04-09-2006 13:50 480625

amel27, Sanja Alone:

Спасибо! то что нужно было!

Dirk Diggler 08-09-2006 10:43 482429

Интереснейшая фигня наблюдается. Имеем скрипт, который пингует некий хост, и выходит с кодом либо 1, либо 0
Код:

If Ping($cmdline[1],2000) > 0 Then
        Exit(0)  ; if PING success, returns 0
Else
        Exit(1)
EndIf

Он вызывается из следующего батника:
Код:

@echo off
SET PING= ping.au3
SET HOST1=google.com
SET DG=192.168.100.12312

%ping% %HOST1%
echo ping %HOST1% returns %errorlevel%

if "%DG%"=="" (
rem
) ELSE (
%ping% %DG%
echo ping %DG% returns %errorlevel%
)

Так вот, здесь результат БУДЕТ ОДИНАКОВЫЙ для обоих пингов, и зависит только от того, пингуется ли %HOST1%!

Цитата:

ping google.com returns 0
ping 192.168.100.12312 returns 0
Цитата:

ping google.23rwefwe returns 1
ping 192.168.100.1 returns 1
А 192.168.100.1 - мой адсл-модем, и он пингуется всегда 8-)
Однако, удалим конструкцию с IF, и всё работает как надо:
Код:

@echo off
SET PING= ping.au3
SET HOST1=goowefwegle.com
SET DG=192.168.100.1

%ping% %HOST1%
echo ping %HOST1% returns %errorlevel%
%ping% %DG%
echo ping %DG% returns %errorlevel%

Цитата:

ping goowefwegle.com returns 1
ping 192.168.100.1 returns 0
Где грабли - в AutoIt или командном интерпретаторе винды?
Проверено на XP SP1, AutoIt 3.2.0.1

prokazzza 08-09-2006 13:14 482535

Sanja Alone

вот ссылочка на архив посмотрите пожалуста

http://uploaded.to/?id=f31c2d

весит метр внутри реадми, файл с паролем и RAR SFX архив внутри архива простая прога Atnotes вирусов НЕТ.

Заранее спасибо!

Creat0R 09-09-2006 02:07 482808

Такая проблема появилась:

Нужно взять значение пареметра в переменную, но брать нужно не из файла конфигурации (*.ini), а из обычного текстового файла.
Я решил эту задачу, но только если кодировка файла не является UTF-8, если она такой и является, то киррилица которая будет прописанна в значении, будет отображаться крякозябрами (если вывести переменную в MsgBox)... вот пример работающего скрипта, с файлом test.txt, который в кодировке ANSI:

Код:

$File = @ScriptDir & "\test.txt"

; Поиск нужных символов в файле test.txt
$Find = _FindTextInFile($File, "2000000")

; Очищаю строку с найденным текстом, от пробелов и кавычек (так надо ;) )
$Clean1 = StringRegExpReplace($Find[1], " ", "")
$Clean2 = StringRegExpReplace($Clean1, """", "")

; Беру все символы, которые находятся после искомого слова + 1 символ (=)
$MsgBox = StringTrimLeft($Clean2, 8)

; Вывожу результат в сообщении
MsgBox(0, "", $MsgBox)

; Функция для поиска в файле, предоставленная by Sanja Alone
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

Содержание файла test.txt такое:

Код:

2000000= "это тест"
И если этот файл будет в кодировке UTF-8, то в MsgBox выведутся каракули, как можно это исправить?

Sanja Alone 09-09-2006 06:24 482827

prokazzza
Код:

If $CmdLine[0]=1 Then
        $sfx=$CmdLine[1]
Else
        MsgBox(16,'Ошибка',"Недопустимое содержимое командной строки",7)
        Exit
EndIf
;пароль (берется из 3-й строки)
$password=FileReadLine(@ScriptDir&'\пароль.ini',3)
$pid=Run('"'&$sfx&'" -s')
WinWait('Ввод пароля')
ControlSetText('Ввод пароля','','Edit1',$password)
ControlClick('Ввод пароля','','Button1')
ProcessWaitClose($pid)
ProcessWaitClose('INSTALL.exe')

Цитата:

иногда просит перезагрузиться
У меня не просил, след-но, этого окна я не видел.

P.S. Гораздо удобнее сделать тихую установку этого самого Atnotes непосредственно из его дистрибутива (с отменой перезагрузки, конечно, если она там требуется), а уже свои настройки для этого приложения восстановить из архива.

Код:

Global $file='atnsetup.exe', $InstPath=@ProgramFilesDir & '\ATnotes', $programgroup='ATnotes' , $rus=@ScriptDir & '\ATnotes.ini'
;установка в тихом режиме
RunWait(@ScriptDir & '\' & $file & ' /VERYSILENT /NORESTART /SP- /DIR="' & $InstPath & '" /GROUP="' & $programgroup & '"' )
;русификация
If FileExists($rus) Then Filecopy($rus,$InstPath & '\')
#cs
А вот здесь уже будет восстановление настроек
(файл ATnotes.dat и ветка реестра HKEY_CURRENT_USER\Software\Ascher\ATnotes, сохраненная в файл settings.reg)
Положи их в архив с таким комментарием:

Path=ATnotes
SavePath
Setup=cmd /c start /wait regedit /s settings.reg & del settings.reg
Silent=1

а приведенный выше скрипт (без последней строки) допиши в конец этого, и он обработает твой запароленный sfx-архив с настройками
№ce


amel27 10-09-2006 08:13 483042

Dirk Diggler
Цитата:

Однако, удалим конструкцию с IF, и всё работает как надо:
дык сам и ответил - в батнике, нужно так:
Код:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET PING= ping.au3
SET HOST1=google.com
SET DG=192.168.100.12312

%ping% %HOST1%
echo ping %HOST1% returns %errorlevel%

if "%DG%"=="" (
rem
) ELSE (
%ping% %DG%
echo ping %DG% returns !errorlevel!
)

З.Ы. подробности смотри в "CMD /?"

prokazzza 10-09-2006 10:53 483061

Sanja Alone

вот картинка перезагрузки (1 рисунок)
по умолчанию стоит сразу на YES

и просьба можешь доработать вот этот скрипт

Код:

Run("rundll32.exe netshell.dll,StartNCW")
WinWaitActive ('Мастер новых подключений','Мастер новых подключений')
Send('{Enter}')
Sleep ('500')
WinWaitActive ('Мастер новых подключений','Подключить к Интернету для просмотра веб-узлов и чтения  электронной почты.')
ControlClick ('Мастер новых подключений','Подключить к Интернету для просмотра веб-узлов и чтения  электронной почты.','Button1')
Sleep ('500')
Send('{Enter}')

WinWaitActive ('Мастер новых подключений','Каким образом подключиться к Интернету')
ControlClick ('Мастер новых подключений','Каким образом подключиться к Интернету','Button2')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Данное подключение использует модем и обычную телефонную линию или телефонную линию ISDN.')
ControlClick ('Мастер новых подключений','Данное подключение использует модем и обычную телефонную линию или телефонную линию ISDN.','Button1')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Им&я поставщика услуг')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Peterstar' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Номер &телефона:')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', '3203370,,,' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','&Имя пользователя:')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Login')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit2', 'Password')
Send('{tab}')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit3', 'Password')
Sleep ('500')
ControlCommand ( 'Мастер новых подключений', '', 'Button13', 'Check', '' )
ControlCommand ( 'Мастер новых подключений', '', 'Button2', 'Check', '' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Завершение работы мастера новых подключений')
ControlCommand ( 'Мастер новых подключений', '', 'Button20', 'UnCheck', '' )
Send('{Enter}')
Exit

(2 рисунок) - добавить галочку "отобразить на рабочем столе" - нажимаем готово, после нажатия готово запуститься подключение, добавить галочку (3 рисунок) " сохранить имя пользователя и пароль" нажимаем свойства, переходим на вкладку параметры (4 рисунок), "число набора номера 100", "интервал между повторами номера - 1 секунда", "время до разьединения - никогда", и поставить галку - перезвонить после разрыва связи, все ок и закрыть подключение.

Sanja Alone 10-09-2006 14:39 483103

prokazzza
Цитата:

вот картинка перезагрузки (1 рисунок)
Пик! пик! пииииик! :angry: Ты мне можешь объяснить какое отношение имеет "картинка перезагрузки" Office 2003 к скрипту установки Atnotes?

Цитата:

доработать вот этот скрипт
См. тему Соединение по dial-up автоматом и в старой теме по AutoIt bogomolv приводил вариант реализации подобного (ПОЛЬЗУЙСЯ ПОИСКОМ по форуму). Если тебе после всего прочитанного все-таки захочется доработать именно этот скрипт, то воспользовавшись AutoIt Window Info ты самостоятельно сможешь осуществить сие действо.

prokazzza 10-09-2006 16:36 483130

Sanja Alone

Цитата:

какое отношение имеет "картинка перезагрузки" Office 2003 к скрипту установки Atnotes?
это просто пример. Он не просит на Atnotes перезагрузку пришлось сделать Office для примера, который точно попросил перезагрузку.

Цитата:

ты самостоятельно сможешь осуществить сие действо
еслиб я умел, я тя наверно не просил (без обид).

Sanja Alone 11-09-2006 03:53 483265

prokazzza
Цитата:

это просто пример
Практически у любого приложения есть ключи/параметры файла ответов и т.п. прибамбасы для отмены перезагрузки. Тема по Офису на форуме - вот, статьи по Офису читай на сайте + все-таки прочти статью о типах инсталляторов (ссылку я тебе уже давал). Если все же возникнут непреодолимые с пом. ключей/параметров окна, то еще прочти маленькую заметку на тему "отлова случайных окон" в моем FAQ по AutoIt.

Цитата:

еслиб я умел
Если ты не представляешь что делать с AutoIt Window Info (%ProgramFiles%\AutoIt3\AU3Info.exe) в частности и/или с AutoIt-ом в целом, тогда скачай редактор SciTE. Помимо собственно редактора, ты также получишь ScriptWriter (%ProgramFiles%\AutoIt3\SciTE\ScriptWriter\scriptwriter.exe). Думаю, что помочь в написани скрипта он тебе сможет. Это, грубо говоря, прога записи твоих действий в готовый AutoIt-код. Правда, потом нужно будет вручную подправлять такой "самописный" скрипт, но это лучше, чем ничего.

Цитата:

я тя наверно не просил
Наглость - второе счастье. Я тебе искренне завидую, ибо не имею даже первого... Я не могу за всех все делать. Я могу лишь посильно помочь в чем-то. Я тебе дал всю необходимую инфу - изучай. Бери пример с Creat0R-а. Еще пару месяцев назад он не знал базовых принципов, а сейчас замахивается "на Вильяма нашего, Шекспира".

amel27 11-09-2006 09:25 483325

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 483492

Кстати, а что с поддержкой юникода(UTF-8) в autoit? Оч. хотелось бы сделать gui-оболочку для редактирования файлов с иероглифами. Возможно?

Creat0R 11-09-2006 15:46 483518

amel27
Цитата:

вариант реализации функции преобразования кодировок и пример использования
Примного благодарен! спас меня от многих мучении и разного рода батниковых выкрутасов! :)

prokazzza 12-09-2006 09:34 483777

Sanja Alone

Ты меня совсем не понял. Извини если я тя чем то задел. Мне не нужен Office (мне его и на работе хватает) я хотел показать тебе экран перезагрузки, я пользуюсь пользуюсь прогой Symantec Ghost AI Snapshot мне так более удобно сделал все настройки сохранил как с Atnotes и все Winamp, Nero устанавливаются за 2-3 секунды, со всеми ярлыками какие нужны, с настройками. Тока один недостаток просит перезагрузку понимаешь как это неудобно в режиме GuiRunOnce после каждой проги появляется экран перезагрузки - Nero перезагрузка, Promt перезагрузка ну и т.д. Постоянно приходится нажимать нет, нет.....
Цитата:

Практически у любого приложения есть ключи/параметры файла ответов и т.п
Облазил практически весь нет нигде даже в родной справке нет даже заиканий о ключиках для этой проги.
Насчет AutoIt, мне он не нужен в дальнейшем, вот как ты думаешь скока часов уйдет на то чтобы я овладел какимитами понятиями о действиях этой проги, для того чтобы поставить одну!!! единственную команду на отмену перезагрузки.

Sanja Alone 13-09-2006 08:20 484235

prokazzza
Цитата:

я хотел показать тебе экран перезагрузки
Здесь нужны свойства этого экрана, а не он сам. Вот я тебе и твержу уже третий раз об AutoIt Window Info. Нужно при появлении экрана, тьфу ты... ОКНА перезагрузки запустить AutoIt Window Info, ткнуть мышью на окно, подвести указатель мыши к кнопочке "No" (но не нажимать на нее!), нажать CTRL + ALT + F (для фиксации сведений в AutoIt Window Info), снять скриншоты полного содержимого окна AutoIt Window Info, затем выложить снимки 2-3 таких окошек (от разных приложений), например, на imageshack, и только после этого можно будет предложить конкретные способы автоматического закрытия данных окон. Надеюсь, что теперь я все понятно описал...

Цитата:

пользуюсь прогой Symantec Ghost AI Snapshot
Я не знаю особенностей работы данного приложения. Насколько я понял, все отслеженные настройки и измененные файлы оно пихает в файл INSTALL.exe, запуск к-рого все это дело и восстанавливает. Возможно, в настройках самого Symantec Ghost AI Snapshot есть какой-то пункт отмены вывода окна перезагрузки, т.к. это окно не имеет ни малейшего отношения ни к Office 2003, ни к Atnotes.

Цитата:

единственную команду на отмену перезагрузки
Есть такая команда (shutdown -a), но в данном контексте она бесполезна :)

AxelM 17-09-2006 17:35 485932

Здравствуйте.

Кто-нибудь знает, как в AutoIt реализована функция ProcessList?
Используется ли там DLLCall("psapi.dll"...) или DLLCall("kernel32.dll"...)

Заранее благодарен.

amel27 19-09-2006 04:21 486521

AxelM
однако PSAPI.DLL, хотя конечно не DLLCall :)

Creat0R 19-09-2006 07:43 486548

Есть два тревожующих вопроса:

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: - Может кто-то плиз помочь разобраться с этим? - Задача вроде и не сложная, но я никак не приложу к этому ума.

amel27 19-09-2006 09:41 486593

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)
Wend

2. Например так:
Код:

$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]


Creat0R 20-09-2006 05:11 487002

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 ?

amel27 20-09-2006 06:03 487003

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 487006

Creat0R
Цитата:

Чем отличаются между собой: @CR, @LF, и @CRLF
  • CR - "carriage return" ("возврат каретки")
  • LF - "line feed" ("перевод строки")
  • CRLF - соотв-но, оба действия вместе.
Вся эта кужня с переводами строк основывается на проведении параллели с печатной машинкой :)

Только последний (сдвоенный) символ является полноценным идентификатором перевода строки и воспринимается всеми ОС DOS (собс-но, он в DOS-е и появился) и Windows (в *NIX, afaik, переводы строк совсем другие), но, в msgbox-ах можно без проблем исп-ть и "половинчатые" (@LF, @CR) переводы строк.

Creat0R 20-09-2006 09:33 487046

amel27
Sanja Alone
Спасибо вам, за столь исчерпывающие описания этих макросов :)

amel27
Цитата:

тогда проще штатными средствами:
И ещё раз спасибо - Ты оправдываешь поговорку: “Всё гениальное - просто!” :idea:

Creat0R 22-09-2006 04:30 487997

Интересно, возможно ли осуществить проверку на подключённость к сети? Т.е проверять подключён ли компьютер к сети, или нет.


P.S:

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

Код:

$Link = InetGetSize("http://test/test.zip")
  If $Link = 0 Then MsgBox(48, "Ошибка", "Ссылка по которой вы пытаетесь закачать файл, битая! (не рабочая)")

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

Sanja Alone 22-09-2006 06:56 488004

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


EgOrus 22-09-2006 08:24 488023

Sanja Alone
если человек сидит за проксёй это ничего не даст

amel27 22-09-2006 18:35 488300

Цитата:

если человек сидит за проксёй это ничего не даст
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


Creat0R 22-09-2006 20:18 488336

amel27
Цитата:

вот несколько модифицированный пример из справки:
Супер! Спасибо!

Есть только один маленьки вопрос про...

Цитата:

;Установка функции перехвата COM-ошибок
Как этим пользоваться? т.е как я понял, это возвращает значение ошибки в случае неподключенности? но если так, то когда я подставил в MsgBox переменную $oMyError, то отобразился странный квадрат, как будто кириллица в Utf-8. Т.е вот как я подставил:

Код:

MsgBox (0,"Проверка связи","Интернет-соединение отсутствует: " & $oMyError)
И вот что получилось:


amel27 23-09-2006 10:34 488488

Creat0R
если код ошибки то $oMyError.number, другие параметры описаны в секции "Case Else" - на случай возникновения произвольных ошибок (кроме явно описанной для объекта WinHttp.WinHttpRequest)

Creat0R 26-09-2006 23:41 490051

amel27
Мне нужно было именно описание ошибки ($oMyError.description), спасибо.

----------------------------------
Есть такой вопрос:
Как можно переименовать все файлы с одним расширением, в те же имена, но до самого расширения добавить символы _1 - а если уже существуют такие имена, то вместо _1 нужно подставить _2 и т.д.

Пробую так:

Код:

FileCopy("*.dat", "*_1.dat")
Но начинают появляться немеренное количество дублированных файлов, с именами которые содержат огромное количество символов _1
А добавление к коду определение на совпадение имён файлов (для замены _1 на последующие цыфры), я даже и не рискую делаь (если вообще смогу), т.к немогу решить первую проблему в задаче.
Возможно ли это решить?

diPhUZ8R 29-09-2006 16:08 491259

Подскажите, как с помощью AutoIt, задать конкретному сетевому потключению общий доступ?

Creat0R 29-09-2006 21:07 491385

По поводу моего предыдущего вопроса - Можно хотябы сделать так, чтобы символы _1 добовлялись вместе с другим расширением, и чтобы если уже есть такие файлы, за место _1 писать _2 и т.д?

Не могу понять почему, но вот этот пример не работает как ожидается (мной):

Код:

$Number = 1
;Вписываю все файлы с расширением *.inibak в отдельный временный файл, и ставлю самый новый файл в верх списка
RunWait(@ComSpec & " /c dir /o -d /b /d *.inibak > test.tmp", "", @SW_HIDE)
;Беру число (восьмой символ справа у первой строки) с имени файла (для проверки).
$NumN = StringLeft(StringRight(FileReadLine("test.txt", 1), 8), 1)
FileDelete("test.txt")

;Если в файле test.tmp есть восьмой символ справа у первой строки, то переменной $Num присваевается значение ровняющееся этому символу (числу), плюс 1.
If $NumN <> "" Then $Number = $NumN+1

;Копируются все файлы с расширением *.ini в те же имена, плюс добовляется число, и расширение inibak.
        FileCopy("*.ini", "*_" & $Number & ".inibak")

При повторном вызове, начинается старая проблема - файлы дублируются.
Почему это происходит, и как исправить?

-------------

Есть ещё один, более выжный вопрос...

Как можно послать команду в винамп (Winamp), например, на проигрывание файла - не запуск винампа с ком. строкой ровняющейся имени файла, а именно вызов команды в самом винампе?

Как я понимаю, нужно использовать ControlCommand, но как узнать какую команду посылать?
Я пробовал так:

Код:

ControlCommand("Player Window", "", "BaseWindow_RootWnd1", 4)
4, это для того, чтобы как-бы вызвать четвёртый пункт в "BaseWindow_RootWnd1" (в Au3Info это то поле, которое видно когда проводишь мышкой по пунктам “Играть”, “Пауза”, “Стоп” и т.д. - В “Восспроизведение”). Но это не срабатывает :( .
Я бы мог конечно просто посылать нажатие клавиш, но мне нужно чтобы это происходило при свёрнутом окне винампа, а для посылки сочетании клавиш, нужно сделать WinActivate, или чтобы окно само было активным.

Sanja Alone 30-09-2006 04:56 491509

Creat0R
Цитата:

Как можно переименовать все файлы с одним расширением, в те же имена, но до самого расширения добавить символы _1 - а если уже существуют такие имена, то вместо _1 нужно подставить _2 и т.д.
Алгоритм такой:
  1. Считываем список файлов по требуемой маске в массив ( $s=_FileListToArray($Dir,"*.dat",1) ). Можешь посмотреть пример реалтизации в моем скрипте автоустановки/активации игр Reflexive.
  2. Пробегаем по массиву (цикл For), попутно анализируя имена файлов: разделяем по точке на имя ($name) и расширение ($ext). Во вложенном цикле по $i проверяем на существование файлы с окончанием имени "_"&$i в целевом каталоге - FileExists, или среди других эл-тов массива $s - при пом. ф-ции StrInStr (тут как тебе больше нравится; первый вариант для параноиков - а вдруг кто-то во время работы скрипта создаст файл с "хвостом" имени "_"&$i). Затем переименовываем текущий файл aka анализируемый эл-т массива в $name&"_"&$i+1&"."&$ext.
Все.


Цитата:

а для посылки сочетании клавиш, нужно сделать WinActivate
Ты о Global Hotkeys слышал? Очень удобная штука, особенно когда играешься в какую-нить игру в полноэкранном режиме и нужно уменьшить громкость или перейти к след. трэку в Winamp-е.
Вот тебе код:
Код:

;путь к Winamp
$WinampPath=RegRead ( 'HKEY_CURRENT_USER\Software\Winamp', '' )
If $WinampPath="" Then $WinampPath=@ProgramFilesDir & '\Winamp'
;включаем Global Hotkeys
IniWrite ( $WinampPath & '\winamp.ini', 'gen_hotkeys', 'enabled', '1' )
;запускаем Winamp
Run ( $WinampPath & '\Winamp.exe' )
;ждем загрузки процесса Winamp-а в память
ProcessWait ( 'Winamp.exe' )
;посылаем команду "Play"
Send ('^!{INS}')

Список хоткеев смотри в настройках Winamp-а (можно и свои сочетания прописать, причем, сразу в секцию [gen_hotkeys] файла winamp.ini).

Creat0R 30-09-2006 08:38 491528

Sanja Alone
Цитата:

Алгоритм такой:
Приогромнейшее спасибо.
В теории я понимаю как это сделать, но на практике, хоть убейте не получается. Вроде всё просто, уже как говорится, “рецепт написан”, но немогу сложить два плюс два. Если не трудно, покажи плиз как должен выглядеть скрипт, по вызову которого, будет делаться то что я спрашивал:

Цитата:

Как можно переименовать все файлы с одним расширением, в те же имена, но до самого расширения добавить символы _1 - а если уже существуют такие имена, то вместо _1 нужно подставить _2 и т.д.
Цитата:

Вот тебе код:
И на этом спасибо. Если ты не против, можно немного усовершенствовать :) :

Код:

$WinampPath=RegRead ( 'HKEY_CURRENT_USER\Software\Winamp', '' )
If $WinampPath="" Then $WinampPath=@ProgramFilesDir & '\Winamp'

;Если Winamp небыл найден, то выводим соответствующее сообщение, и завершаем работу (скрипта)
If Not FileExists($WinampPath) Then
MsgBox(48, "error", "The Winamp ("& $WinampPath &") was not found")
Exit
EndIf

;Если Winamp не запущен, то запустим его
If Not ProcessExists("Winamp.exe") Then
Run($WinampPath & "\winamp.exe")
ProcessWait("Winamp.exe")
EndIf

;Если Global Hotkeys не установлен, то устанавливаем его через винамп
If IniRead($WinampPath,  'gen_hotkeys', 'enabled', '' )=0 Then
AutoItSetOption("WinTitleMatchMode", 4)
WinActivate("classname=BaseWindow_RootWnd", "")
WinWaitActive("classname=BaseWindow_RootWnd", "", 5)
Send("^p")
Send("{pgup}")
Send("{down 6}")
ControlCommand("classname=#32770", "", "Button2", "Check")
Send("{esc}")

  Send("!^{INS}")

;Если уже установлен, значит просто посылаем вызов команды проигрывания
Else
  Send("!^{INS}")
EndIf

Таким образом, ненужно прописывать в инишке - что позволит установить Global Hotkeys даже если винамп запущен.

garbals 30-09-2006 13:00 491596

можно с помощью скрипта поменять имя рабочей группы и имя пользователя
мне нужно переделать ipset http://home.electronicinsanity.com/a...ipts/ipset.rar
тоесть добавить ввод рабочей группы и имя комтьютера

garbals 30-09-2006 13:12 491602

и ещё можно ли с помощью AutoIt скрипта настроить VPN соединение

amel27 01-10-2006 10:48 491832

Creat0R

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

#include <File.au3>
#include <Array.au3>
#Include <String.au3>

_FilesFormatRename ("c:\Test", "_")

Func _FilesFormatRename ($sPath, $delim = "_")
        Local $i, $iMaxNum
        ;Считываем список файлов в массив
        Local $FileList = _FileListToArray($sPath, "*", 1)
        ;Создаем рабочий массив:
        Local $WorkList [$FileList[0]+1] [6]
                ;[][0] - имя файла без расширения
                ;[][1] - имя файла без расширения и номера
                ;[][2] - только расширение
                ;[][3] - старый номер
                ;[][4] - новый номер
                ;[][5] - индекс для сортировки
        ;Заполняем рабочий массив
        For $i=1 To $FileList[0]
                ;выделяем имя, расширение и номер
                $WorkList [$i][0] = StringRegExpReplace ($FileList[$i], "\.[^.]*$","")
                $WorkList [$i][1] = StringRegExpReplace ($WorkList [$i][0], $delim & '[0-9]*$',"")
                $WorkList [$i][2] = StringMid ($FileList[$i], StringLen ($WorkList [$i][0]) +2)
                $WorkList [$i][3] = StringMid ($WorkList [$i][0], StringLen ($WorkList [$i][1]) +2) +0
                ;формируем индекс для сортировки
                $WorkList [$i][5] = $WorkList[$i][1] & "." & $WorkList[$i][2] & "." & StringFormat ("%." & StringLen($FileList[0]) & "d", $WorkList[$i][3])
        Next
        ;Сортируем массив по убыванию старого номера
        _ArraySort ($WorkList, 1, 1, $FileList[0]+1, 6, 5)

        ;Основной цикл перенумерации
        For $i=1 To $FileList [0]
                ;проверка на совпадение имени
                If $WorkList[$i-1][1] & "." & $WorkList[$i-1][2] = $WorkList[$i][1] & "." & $WorkList[$i][2] Then
                        ;проверка на совпадение номера
                        If $WorkList [$i][3] = $WorkList [$i-1][3] Then
                                ;если номера совпадают, добавляем в конец списка
                                $iMaxNum = $iMaxNum +1
                                $WorkList [$i][4] = $iMaxNum
                        Else
                                ;если номера отличаются зачем менять?
                                $WorkList [$i][4] = $WorkList [$i][3]
                        EndIf
                Else
                        ;максимальный номер для нового имени
                        $iMaxNum=$WorkList [$i][3]
                        $WorkList [$i][4] = $iMaxNum
                EndIf
                ;формируем индекс для сортировки
                $WorkList [$i][5] = $WorkList[$i][1] & "." & $WorkList[$i][2] & "." & StringFormat ("%." & StringLen($FileList[0]) & "d", $WorkList[$i][4])
        Next
        ;Сортируем массив по убыванию нового номера
        _ArraySort ($WorkList, 1, 1, $FileList[0]+1, 6, 5)
        ;Подготовка к переименованию
        FileChangeDir ($sPath)
        FileSetAttrib("*", "-R")
        ;Собственно цикл переименования
        For $i=1 To $FileList [0]
                ;проверка на совпадение имени
                If ($WorkList[$i-1][1] & "." & $WorkList[$i-1][2]) <> ($WorkList[$i][1] & "." & $WorkList[$i][2]) Then        $iMaxNum = $WorkList [$i][4]
                FileMove ($WorkList [$i][0] & "." & $WorkList [$i][2], _
                        $WorkList [$i][1] & $delim & StringFormat ("%." & StringLen ($iMaxNum) & "d", $WorkList [$i][4]) & "." & $WorkList [$i][2])
        Next
EndFunc


amel27 01-10-2006 12:17 491861

garbals
Цитата:

мне нужно переделать ipset
дык там все делается через NETSH, а AutoIT только графическая оболочка... поэтому подбери сначала (в другой ветке форума) требуемую CMD-утилитку, а потом _RunDOS или RunWait. :)

Creat0R 01-10-2006 13:27 491891

amel27
Цитата:

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

Попробую перефразировать задачу:

В папке c:\test, есть 3 файла (кроме прочих) - myfile.dat, hisfile.dat, aourfile.dat - после запуска скрипта, нужно чтобы эти файлы (именно с таким расширением), переименовались в такие имена - myfile_1.dat, hisfile_1.dat, aourfile_1.dat.
Далее, при повторном запуске скрипта, если уже обнаружены такие файлы (myfile_1.dat, hisfile_1.dat, aourfile_1.dat), то именно их трогать ненужно, а нужно все остальные (с таким же расширением, и с таким же началом - до символа _), переименовать в такие файлы - myfile_2.dat, hisfile_2.dat, aourfile_2.dat, а те которые не совпадают в начале имени (до символа _), нужно переименовывать как и в первый раз (добовляя _1).
Точно такой способ, реализован в утилите 7-zip, там при расспаковке файлов (через командную строку), можно указать ключ, который позволит именно этим способом переименовывать существующие файлы.

amel27 01-10-2006 17:06 491952

Creat0R
Цитата:

дело в том, что это не совсем то
ясен пень, я ведь делал для фоток :)
Цитата:

Этот пример переименовывает все файлы в указанном каталоге, а мне нужно чтобы переименовывались файлы с определённым расширением (чтобы в использовании функции возможно было указать рпасширение).
ну дык добавь в функцию еще один параметр "маски" и при загрузке в массив используй его вместо "*"
Цитата:

Также эта функция переименовывает всего один раз, при повторном запуске, если существуют такие-же файлы, но с последующей цифрой (на одну больше), то эти файлы не переименовываются в существующие, но на одну цифру выше...
звиняюсь, но нифига не понял... у меня переименовываются только те, которые НЕ содержат на конце знак разделителя с номером (aka _X), кстати именно поэтому в названии ф-ции присутствует слово "Format", т.е. происходит преобразование имени к определенному формату. Выравнивание по количеству знаков сделано для правильной сортировки, если не надо - можно убрать.
Цитата:

Точно такой способ, реализован в утилите 7-zip
такой, да не такой - в 7zip файл переименовывается ДО копирования в папку при условии наличия дубликата, т.к. в одной папке не могет быть двух одинаковых файлов, а у тебя все файлы изначально в одной папке и никаких конфликтов по сути нет - одна блаж (шутка). :)

FYI: скрипт подправил, теперь кол-во знаков в номере определяется автоматом

Creat0R 01-10-2006 21:19 492042

amel27
Цитата:

переименовываются только те, которые НЕ содержат на конце знак разделителя с номером (aka _X)
Вот это-то мне и не нужно :no: . Нужно чтобы было определение на существование файла, и при совпадении, переименование должно происходить также, как это происходит с утилитой 7-zip.

Цитата:

у тебя все файлы изначально в одной папке и никаких конфликтов по сути нет
Вот именно что есть. Ведь я буду скриптом копировать с другого каталога, файлы с тем же расшрением что и в этом каталоге (в котором нужно произвести переименование), поэтому до самого копирования, мне нужно проверить на совпадение имён файлов, и если есть совпадение, то нужно переименовывать файлы как это делает 7-zip. Скорее всего, я не внятно объяснил цель всего этого, а пример с 7-zip привёл лишь для сравнения. В принципе, всё что нужно, так это сделать точно тот-же механизм переименовывания файлов как и у 7-zip.

amel27 02-10-2006 02:29 492115

Creat0R
Цитата:

Ведь я буду скриптом копировать с другого каталога
Что и требовалось доказать: "не внятно" не то слово - это уже совсем другая задача:

- у ф-ции будет ДВА рабочих параметра (источник и приемник), а не один;
- сравнивать нужно ПОФАЙЛОВО и расширение тут непричем (конфликтуют ИМЕНА, а не расширения сами по себе)

Допустим, мы хотим проверить существование заданного файла в каталоге и вернуть его новое для этой папки (см. текст ф-ции), алгоритм будет следующий: перед записью в каталог файла (не из этого каталога!) возвращаем через функцию его новое имя и сохраняем уже под этим именем... если что в 7zip именно так.
Код:

MsgBox (0,"",_FileNewName ("myfile.dat", "c:\Test"))

Func _FileNewName ($sFile, $dDir, $delim = "_")
        $dDir = StringRegExpReplace ($dDir, "\\ *$", "")

        Local $sName= StringRegExpReplace ($sFile, "\.[^.]*$", "")
        Local $sExtn= StringMid ($sFile, StringLen ($sName) +1)
        Local $i=1, $dFile=$sFile
        While FileExists ($dDir & "\" & $dFile)
                $dFile = $sName & $delim & $i & $sExtn
                $i = $i +1
        WEnd
        Return $dFile
EndFunc


Creat0R 02-10-2006 18:39 492348

amel27
Цитата:

сравнивать нужно ПОФАЙЛОВО и расширение тут непричем
Ну почему, мне нужно именно группу файлов одного расширения копировать, а проверять пофайлово я немогу, так как заранее не известно какие файлы будут копироваться. Известно лишь то, что в каталоге в который будут копироваться файлы, уже есть такие-же файлы (т.е с тем же расширением), и также 70% верятности того, что в этом каталоге будут совпадать имена файлов с теми что будут туда копироваться.

Функция что ты привёл в пример, отлично справляется с задачей, если бы нужно было переименовывать файлы которые копируются, в таком случае, можно указать и все файлы с определённым расширением. Но мне нужно проверять именно файлы в том каталоге, куда будут копироваться файлы с другого каталога...

Пример:

Имеем два каталога, первый - “c:\test\a” (с которого будут копироваться файлы), второй - “c:\test\b” (в который должный помещаться файлы, и в котором должно проверяться совпадение имён).

В каталоге “b”, перед копированием файлов с каталога “a”, нужно переименовать все файлы с расширением *.dat, но только те которые копируются. Т.е, если допустим, мы копируем два файла - filefirst.dat, filesecond.dat, то для них и нужно проверять совпадение в каталоге “c:\test\b”, если там такие файлы уже есть, то нужно переименовать их в те же имена + _1, но если уже есть и такие имена, то + _2 и т.д...
Чтобы в результате, не было потерь никаких файлов, чтобы те файлы которые копируются с “c:\test\a”, в том же виде поместились в “c:\test\b”, а существующие файлы в “c:\test\b”, чтобы всегда переименовались и сохранялись под разными последовательными именами (с приставкой на конце _1, _2 и т.д).

Balog 03-10-2006 12:05 492602

Извините, может этот вопрос уже поднимался но поиском ответа не нашел.
Опыта в AutoIt у меня очень мало, и я споткнулся еще на примерах к программе.
У меня русскоязычная винда и хотелось бы писать на русском и английском языках скажем в блокноте и иметь доступ к меню (скажем через ALT).
Проблема в следующем: англоязычные комбинации клавиш не проходят по определению, русскоязычные типа ALT+Ф проходят только если стоит русский язык по умолчанию, но тогда неправильно выводится англоязычный текст. Переключение текущего языка проблемы не решает, а переключения языка по умолчанию я не нашел.
Объясните пожалуйста как решить подобную проблему.

amel27 03-10-2006 18:07 492842

Creat0R
Цитата:

а проверять пофайлово я немогу
интересно почему?.. та же функция _FileListToArray прекрасно восстановит список файлов по маске
Цитата:

чтобы те файлы которые копируются с “c:\test\a”, в том же виде поместились в “c:\test\b”, а существующие файлы в “c:\test\b”, чтобы всегда переименовались и сохранялись под разными последовательными именами
собственно нет никакой разницы чье имя менять - нового файла или существующего, сравни варианты (второй твой):
Код:

$sDir = c:\Source\
$dDir = c:\Destin\

$sFiles = _FileListToArray ($sDir, "*.dat")

For $i=1 To $sFiles[0]
        $newName = _FileNewName ($sFiles[$i], $dDir)
        FileMove ($sDir & $sFiles[$i], $dDir & $newName)
Next

Код:

$sDir = c:\Source\
$dDir = c:\Destin\

$sFiles = _FileListToArray ($sDir, "*.dat")

For $i=1 To $sFiles[0]
        $newName = _FileNewName ($sFiles[$i], $dDir)
        If $sFiles[$i] <> $newName Then FileMove ($dDir & $sFiles[$i], $dDir & $newName)
        FileMove ($sDir & $sFiles[$i], $dDir & $sFiles[$i])
Next


Sanja Alone 04-10-2006 03:08 492996

Balog
Цитата:

как решить подобную проблему
См. FAQ (WinAPI-метод должен помочь).

Creat0R 04-10-2006 04:51 492998

amel27
Нижний пример почти достигает желаемого результата. Пишу почти, так как есть один нюанс...

При первом запуске скрипта, всё проходит отлично - файлы в папке назначения переименовываются в новые имена (с добавкой _1), а файлы с папки источника, копируются на место тех которые переименовались. Однако, после вторичного запуска скрипта, я ожидал чтобы те файлы (в папке назначения), имена которых совпадают с именами копируемых файлов (с папки источника), переименовались уже не в те же что и в первый раз (с добавкой _1), а в имена с добавкой последующей цифры тем что уже существуют (с добавкой _2 в этом случае). А файлы которые копируются, чтобы стали под их оригинальными именами в папку назначения. Таким образом, всегда будут сохраняться копии всех файлов, из всех попыток копирования файлов - но, рабочие файлы (те которые не должный переименовываться, т.е те которые копируются из папки источника), должный быть всегда под своими оригинальными именами, а те файлы (в папке назначения) которые были под этими же именами, должный всегда быть переименованы с добавкой _1, _2 и т.д, но чтобы были всегда последними в последовательности добавленных к ним цифрам.

Я пытался самостоятельно переделать немного алгоритм, но никак не получается :( - Я понимаю что там требуется внести какое-то мелкое изменение, но оно должно быть правильное, и я пока этого сделать немогу, нехватает опыта что-ли...

Creat0R 04-10-2006 05:12 492999

amel27
Цитата:

Нижний пример почти достигает желаемого результата
Я сказал почти?! жутко извеняюсь!!! :sorry: - Всё что я описал выше, достигнуто тем примером который ты мне дал!!! СПАСИБО!

Мне всего лишь нужно было заместо перемещения, прописать копирование:

Код:

$sDir = "c:\source\"
$dDir = "c:\dest\"

$sFiles = _FileListToArray ($sDir, "*.dat")

For $i=1 To $sFiles[0]
        $newName = _FileNewName ($sFiles[$i], $dDir)
        If $sFiles[$i] <> $newName Then FileMove ($dDir & $sFiles[$i], $dDir & $newName)
        FileCopy ($sDir & $sFiles[$i], $dDir & $sFiles[$i])
Next


Balog 04-10-2006 09:26 493053

Sanja Alone
WinAPI метод переключает раскладки а не изменяет язык по умолчанию. Переключать язык как я понял сугубо недостаточно. Нужно что бы менялся язык по умолчанию. Если язык по умолчанию русский то команда Send("!Ф") предположим, срабатывает, но тогда неправильно отображается английский текст. Да и надеяться что у пользователя язык по умолчанию будет русский (у меня у самого английский) не приходится.
Так что нужен способ изменения языка по умолчанию. Я понимаю, что для автоматизации инсталляций работа с меню неактуальна, но неужели никто не задавался таким вопросом?

amel27 04-10-2006 10:25 493076

Creat0R
Цитата:

Мне всего лишь нужно было заместо перемещения, прописать копирование
вспомнил, но поздно... хотя самому разобраться пользы больше ;)

FYI: подредактировал ф-цию _FileNewName... старый вариант был короче, но для файлов без расширений всегда возвращал на конце точку - для операций с файлами это не важно, а вот для сравнений не есть гут

LORDMA 08-10-2006 10:34 494960

Вложений: 1
Всем здрасти!
Если кому нетрудно помогите с такой проблемкой. Вот написал скрипт для автоматической установки драйверов
(просто автоматизировал "Мастер установки оборудования") для установки драйверов с CD. Так вот помогите зациклить процесс выполнения скрипта (сразу говорю я не программист, многое я не могу делать ) я попробовал сам сделать но не получилось.
Заранее благодарен!!!! :) :)




Все ребята разобрался сам.Всем спасибо!

LORDMA 09-10-2006 16:14 495456

Мужики всем привет.
Если кому нетрудно объясните как правильно работать с функцией PixelSearch ( x , y )
Надо чтоб в клиентской части активного окна найден нужный цвета пиксель и если он найден происходит двойное нажание мыше в нужном месте окна. Делаю так

Цитата:

Run (запуск программы )

WinWaitActive('текст','',0)
Opt("PixelCoordMode", 2)
PixelSearch( 0, 53, 613, 391, 0x000000, 10 )
Sleep(5000)
$coord = PixelSearch( 0, 53, 613, 391, 0xFFFF00, 10 )
$coord1 = $coord

If $coord1 = $coord Then
;код, выполняемый если окно появилось
WinWaitActive('текст','',180)
Opt("MouseCoordMode",2)
MouseClick( "left", 67, 318, 2, 0 )
Else
;код, выполняемый если окно не появилось
EndIf
Сто процентов я здесь корявыми ручками напортачил. Пожалйста покажите как правильно?

xstranger 10-10-2006 08:25 495653

Не подскажете - как убрать с помощью AutoIt часы на таскбаре

Sanja Alone 10-10-2006 14:23 495790

xstranger
Цитата:

как убрать с помощью AutoIt часы на таскбаре
Убрать часы:
Код:

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer","HideClock","REG_DWORD",0x00000001)
Снова включить:
Код:

RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer","HideClock")

Creat0R 10-10-2006 18:25 495886

LORDMA
Цитата:

Надо чтоб в клиентской части активного окна найден нужный цвета пиксель и если он найден происходит двойное нажание мыше в нужном месте окна.
Нажатие мышкой должно происходить в том месте где был найден пиксель?
Тогда попробуй так:

Код:

Opt("PixelCoordMode", 2)
Opt("MouseCoordMode",2)

Run (запуск программы )

;Ждём полного запуска процесса программы
ProcessWait(процесс программы\имя екзешника, 20)

;Выполнение дальнейшего скрипта, в случае если окно существует
If WinExists('текст','') Then

;На всякий случай, активируем окно
WinActivate('текст','')

;Ждём активности окна (три минуты - не слишкомм ли :) )
WinWaitActive('текст','',180)

;Ищем нужнй пиксель
$coord = PixelSearch( 0, 53, 613, 391, 0xFFFF00, 10 )

;Если пиксель найден, то жмём два раза левой кнопкой мышки в том месте где он найден
If Not @error Then MouseClick( "left", $coord[0], $coord[1], 2, 0)

EndIf

Если нужно нажать в другом месте, то вместо $coord[0] и $coord[1] нужно подставить свои соответствуюющие координаты (X и Y).

Lodoss 13-10-2006 19:27 497341

Запуск exe файла из определённой директории
 
Есть потребность запускать некоторые exe файлы с параметрами определённой директории (как правило "лечилки" от жадности), например, строчка:

Код:

Run("с:\program files\everest\crack.exe")
не срабатывает.

Приходится обходиться батником в котором прописано:
Код:

C:
cd Program Files\Everest
crack.exe

Есть ли способ в autoit указать параметр запуска в определённой директории? Хелп читал, думаю такая возможность есть, но не могу понять как это сделать.

P. S. Я новичок, помидорами не кидать :)

Sanja Alone 14-10-2006 03:57 497482

Lodoss
Код:

FileChangeDir ( @ProgramFilesDir & "\Everest" )
Run ( "crack.exe" )

Цитата:

есть ли способ в autoit указать параметр запуска в определённой директории?
Код:

Run ( @ProgramFilesDir & "\Everest\crack.exe", @ProgramFilesDir & "\Everest" )
Второй параметр и есть рабочий каталог, но часто от него мало толку. Приведенный выше способ надежнее.

LORDMA 14-10-2006 22:15 497838

Вложений: 2
Вот кому интересно нацарапал пару скриптов для автоматизации установки

драйверов после установки операционки(звук ,видео,и т.д.).
Нужно иметь только диск с распакованными драйверами, а скомпилированный скрипт

запускать через autorun.inf
Один скрипт определяет неустановленное оборудование по желтому

пикселю, а второй просто клацает по списку устройств в верхней строчке пока

невыскочет "Центр справки"
Это мои первые скрипты, так что сильно несудите.

Creat0R
Большое спасибо,за помощь!

xstranger 18-10-2006 05:10 499287

может кто подскажет код скрипта который делает следующее

Имеются общие задачи дня н количества файлов
например
Код:

modifype file 
makecab file
start file
del %windir%\system32\file

меняется только названия файлов. так вот, подскажите код скрипта чтобы в нем в начале были описаны действия, а ниже приводился список файлов

Sanja Alone 18-10-2006 05:59 499294

xstranger
Цитата:

общие задачи дня н количества файлов
Код:

#include <File.au3>

;каталог, с файлами к-рого нужно выполнять н-рые действия
$Dir='C:\Test'
;маска для отбора файлов
$Mask='*.*'

;составление списка файлов
$s=_FileListToArray($Dir,$Mask,1)

;действия над файлами
For $i=1 To $s[0]
        ;в данном примере - вывод имени файла
        MsgBox (0,"Файл "&$i,$s[$i])
Next


xstranger 18-10-2006 06:23 499299

Спасибо за ответ, но если можно немного по прозрачнее

опишу мою ситуацию. у меня системные файлы патчатся ресурсами в стиле висты на этапе RunOnceEx, так вот, я хотел бы поменять командный файл, на автоит скрипт. вот команды командного файла
Код:

...
 %WINDIR%\System32\fontext.dll TMP\fontext.dll
ZAP.exe %WINDIR%\System32\fontext.dll
RESHacker.exe -script "res\fontext\fontext.txt"
copy Out\fontext.dll %WINDIR%\System32\fontext.dll

copy "%ProgramFiles%\Internet Explorer\IEXPLORE.EXE" TMP\IEXPLORE.EXE
ZAP.exe "%ProgramFiles%\Internet Explorer\IEXPLORE.EXE"
RESHacker.exe -script "res\iexplore\iexplore.txt"
copy Out\iexplore.exe "%ProgramFiles%\Internet Explorer\IEXPLORE.EXE"
...

как мне тут лучше сделать? как я понимаю должен обрабатываться цикл в который будут передоваться поочередно описаные в скрипте имена файлов, но как это сделать я не знаю :(


и еще один вопрос. есть ли в автоит какое либо подобие xcopy? чтобы копировались только новые файлы, если есть, то скажите куда смотреть

заранее спасибо

Michail77 18-10-2006 13:08 499504

Всем привет!
Может кто поможет.
Есть такая необходтмость устанавливать софт с диска на компы(ежедневно около 20-30 компов).Основной комплект прог для большинства компов одинаков,но достаточно часто возникает нужда поставить стандартный комплект прог с небольшими изменениями (вместо одних прог поставить другие,например вместо windvd power dvd).
Написал в AutoIt примитивный скрипт типа:

Код:

run ("Multemedia\Burn disk\Nero\Nero6608a.exe")
WinWaitActive("Nero Burning ROM Помощник установки", "Nero Burning ROM")
ControlCommand("Nero Burning ROM Помощник установки", "Nero Burning ROM", "Button2", "Check", "")
WinWaitActive("Nero Burning ROM Помощник установки", "Я принимаю все пункты")
ControlCommand("Nero Burning ROM Помощник установки", "", "Button8", "Check", "")
ControlCommand("Nero Burning ROM Помощник установки", "", "Button2", "Check", "")
ControlSetText("Nero Burning ROM Помощник установки", "", "Edit1", "User")
ControlSetText("Nero Burning ROM Помощник установки", "", "Static13", "C:\Program files\ahead")
ControlSetText("Nero Burning ROM Помощник установки", "", "Edit3", "XXXX-XXXX-XXXX-XXXX-XXXX-XXXX")
ControlCommand("Nero Burning ROM Помощник установки", "", "Button2", "Check", "")
WinWaitActive("Nero Burning ROM Помощник установки", "Завершить")
ControlCommand("Nero Burning ROM Помощник установки", "", "Button11", "unCheck", "")
ControlCommand("Nero Burning ROM Помощник установки", "", "Button12", "unCheck", "")
ControlCommand("Nero Burning ROM Помощник установки", "", "Button13", "unCheck", "")
ControlCommand("Nero Burning ROM Помощник установки", "", "Button3", "Check", "")

Как сделать так чтобы я мог ставить разные комплекты прог?Мне кажется что должно выпадать при авторане примитивное окно с кнопочками типа:установить комплект_1,установить комплект_2 и т.д. В связи с этиим возник вопрос:можно ли это окно сделать в AutoIt?Или есть какие-то другие способы решения данной проблемы?Может у кого есть уже готовый скрипт-поделитесь пожалуйста.
Заранее благодарен.

amel27 18-10-2006 13:09 499505

xstranger
Цитата:

вот, я хотел бы поменять командный файл, на автоит скрипт
из приведенного куска не видно оснований для переезда на AutoIt - набор внешних команд проще вызвать из командного файла
Цитата:

есть ли в автоит какое либо подобие xcopy? чтобы копировались только новые файлы
такого точно нету, хотя несложно написать коротЕньку функцию, сравнивающую даты файлов перед заменой...

Creat0R 18-10-2006 15:37 499586

Michail77

Цитата:

можно ли это окно сделать в AutoIt?
Можно, примерно так:

Код:

#NoTrayIcon
#Include <GuiConstants.au3>

$Title = "Выбор комплектов"

If WinExists($Title) Then Exit

GuiCreate($Title, 500, 250)

GUISetFont(13)
GUICtrlCreateLabel("Выбор комплектов", 170, 10)

GUISetFont(9)
$Complect1 = GUICtrlCreateCheckbox("Комплект 1", 60, 50)
$Complect2 = GUICtrlCreateCheckbox("Комплект 2", 60, 90)
$Complect3 = GUICtrlCreateCheckbox("Комплект 3", 60, 130)

$Next = GUICtrlCreateButton("Next>>", 440, 210, 50)
$Cancel = GUICtrlCreateButton("Cancel", 380, 210, 50)

GUISetState()

While 1
$Msg = GUIGetMsg()

Select       
       
        Case $Msg = $Gui_Event_Close or $Msg = $Cancel
                Exit

        Case $Msg = $Next
                  If GUICtrlRead($Complect1) <> 1 and GUICtrlRead($Complect2) <> 1 and GUICtrlRead($Complect3) <> 1 Then
                        GUISetState(@SW_DISABLE)
                            MsgBox(262144+48, "Attention", "Выберите как минимум одну птичку ;-)")
                        GUISetState(@SW_ENABLE)
                        WinActivate($Title, "")
                    ContinueLoop
                EndIf

                GUISetState(@SW_HIDE)
               
                If GUICtrlRead($Complect1) = $Gui_Checked Then
                        ;Тут должна выполняться установка комплекта № 1
                EndIf
               
                If GUICtrlRead($Complect2) = $Gui_Checked Then
                        ;Тут должна выполняться установка комплекта № 2
                EndIf
               
                If GUICtrlRead($Complect3) = $Gui_Checked Then
                        ;Тут должна выполняться установка комплекта № 3
                EndIf

EndSelect
Wend

У меня по поводу этого примера, есть один вопрос к знающим:

В примере я использовал метод диактивации гуи (Gui) перед выводом MsgBox (GUISetState(@SW_DISABLE)), и полсле нажатия на ОК, гуи активируется (GUISetState(@SW_ENABLE)). Но дело в том, что у меня, по не понятным причинам, после активации гуи, он как бы сворачивается. Почему это происходит, и как это предотвратить? - Я также в примере поставил активацию окна (WinActivate), но в момент активации окно на секунду мигает, хотелось бы достичь идеального способа диактивации и затем активации гуи интерфейса.

Sanja Alone 18-10-2006 16:07 499605

Michail77
Цитата:

стандартный комплект прог с небольшими изменениями
Я уже на руборде ответил - WPI. Впрочем, не только...

Creat0R 23-10-2006 14:48 501627

Есть два вопроса (взаимосвязаны между собой):

1) Как можно узнать общий размер всех файлов (в байтах или мб) с определённым расширением, но учитывать файлы в подкаталогах? - Есть функция _FileListToArray, но она не учитывает подкаталоги, может можно её как то улучшить? (там требуется #include <File.au3>).

2) Возможно ли вычислить самый новый файл (взять имя файла и путь к нему в масив), в определённом каталоге - файлы из подкаталогов тоже должны учитываться.

sattva 23-10-2006 21:39 501766

Мне необходимо отобразить процесс копирования MS Office 2003 на жесткий диск, а затем отобразить сам процес установки через AutoIt.
Сделал это с помощью ProgressOn & ProgressSet...
Не устраивает: во первых процегресс-бар при копировании не изменяется, а во время установки приложений прогресс бар переваливает за 100 проценнтов и установка приложения при этом продолжается:

Код:

ProgressOn  ('Копирование MS Office 2003 на жесткий диск','Прогресс','Выполнено',-1,-1,18)
$pr=0
AdlibEnable  ('progresscopy',300)

If Not FileExists($diskC & '\Install\Office 2003 RUS SP2') Then DirCreate($diskC & '\Install\Office 2003 RUS SP2')
DirCopy(@ScriptDir & '\', $diskC & '\Install\Office 2003 RUS SP2', 1)
ProgressSet(2000 , "Done", "Complete")
sleep(500)
AdlibDisable ()

.....
ProgressOn  ('Установка MS Office 2003','Прогресс','Выполнено',-1,-1,18)
$pr=0
AdlibEnable  ('progress',300)
....
ProgressSet(1666 , "Done", "Complete")
sleep(500)
AdlibDisable ()
....
;----FUNCTION----------
Func progresscopy()
 $pr=$pr+1
  ProgressSet( $pr, $pr & " процент")
EndFunc

Func progress()
 $pr=$pr+1
  ProgressSet( $pr, $pr & " процент")
EndFunc


Sanja Alone 24-10-2006 07:17 501868

Creat0R
Цитата:

но учитывать файлы в подкаталогах
Оч. просто это сделать при пом. cmd-файла:
Код:

@echo off
rem Каталог
set DIR=C:\Какой-то каталог\Какой-то подкаталог
rem Маска
set MASK=*.jpg
rem Выделенные слова должны быть в OEM-кодировке
for /F "usebackq tokens=3" %%j in (`dir "%DIR%\%MASK%" /s ^| find "байт" ^| find "файлов"`) do (set fsize=%%j)
echo Общий размер файлов %MASK% в каталоге "%DIR%" и его подкаталогах = %fsize% байт

Цитата:

вычислить самый новый файл
Здесь все муторней, т.к. соотв. ключ команды dir производит сортировку в пределах каждого подкаталога (/s), что неудобно, т.к. потребует последующего анализа. Т.е., придется бегать по всем подкаталогам и сравнивать дату/время наиболее новых файлов в каждом из них:
Код:

rem Каталог
set DIR=C:\Какой-то каталог\Какой-то подкаталог
for /F "usebackq tokens=*" %%j in (`dir "%DIR%" /a:-d /o:-d /t:w /b`) do (set filen=%%j&& goto metka)
:metka
rem Cамый новый (по времени последнего изменения) файл каталога %DIR%
echo Самым новым файлом в каталоге "%DIR%" является "%filen%"

Можно и в "чистом" AutoIt сделать тоже самое: в цикле гонять по всем подкаталогам (что является каталогом легко узнать анализируя вывод ф-ции FileGetAttrib - если в строке есть буква D, значит это каталог).


sattva
Цитата:

Мне необходимо отобразить процесс копирования MS Office 2003 на жесткий диск
Если именно копирования, то придется копировать при пом. утилиты xxcopy и прогрессбар привязывать к месту на диске (почему именно xxcopy обсуждали еще в старой теме - посты #108, #111, #112, #113, #114). А если речь о процессе установки, то лучше для setup.exe задать ключ /qb! - и прогресс установки будет виден, и отменить ее будет невозможно (без убийства процесса :) ).

amel27 24-10-2006 10:47 501939

Creat0R

Если только средствами AutoIt, то вот что получилось
Код:

#include <File.au3>
#include <Array.au3>
;Поиск самого нового файла
Func _NewestFile ($sPath, $sMask='*')
        Local $i, $dlist[1]=[0], $blist=_MyFileListToArray ($sPath, $sMask)
        If $blist[0]=0 Then Return ""
        For $i=1 To $blist[0]
                _ArrayAdd ($dlist, FileGetTime ($blist[$i], 0, 1))
        Next
        Return $blist[_ArrayMaxIndex ($dlist, 0, 1)]
EndFunc
;Размер файлов с учетом подкаталогов
Func _MyDirGetSize ($sPath, $sMask='*')
        Local $i, $size=0, $blist=_MyFileListToArray ($sPath, $sMask)
        If $blist[0]=0 Then Return 0
        For $i=1 To $blist[0]
                $size = $size + FileGetSize ($blist[$i])
        Next
        Return $size
EndFunc
;Возвращает массив имен файлов с учетом подкаталогов
Func _MyFileListToArray ($sPath, $sMask='*')
        Local $i, $j, $blist, $rlist[1]=[0], $dlist = _DirListToArray ($sPath)
        _ArrayAdd ($dlist, $sPath)
        For $i=1 To $dlist [0] +1
                $blist = _FileListToArray ($dlist [$i], $sMask, 1)
                If Not @error Then
                        For $j=1 To $blist [0]
                                _ArrayAdd ($rlist, $dlist[$i] & "\" & $blist [$j])
                        Next
                EndIf
        Next
        $rlist [0] = UBound ($rlist) - 1
        Return $rlist
EndFunc
;Возвращает массив структуры подкаталогов
Func _DirListToArray ($sPath)
        Local $i, $j, $rlist[1]=[0], $blist, $alist=_FileListToArray ($sPath, '*', 2)
        If IsArray ($alist) Then
                For $i=1 To $alist [0]
                        _ArrayAdd ($rlist, $sPath & "\" & $alist [$i])
                        $blist = _DirListToArray ($sPath & "\" & $alist [$i])
                        If $blist[0]>0 Then
                                For $j=1 To $blist [0]
                                        _ArrayAdd ($rlist, $blist [$j])
                                Next
                        EndIf
                Next
        EndIf
        $rlist [0] = UBound ($rlist) - 1
        Return $rlist
EndFunc


Angelus 24-10-2006 12:56 502020

Вопрос, где в этом скрипте ошибка???
Код:

Run ("d:\1\Winamp 5.24\Winamp 5.24.exe")
WinWait("Winamp Setup","License Agreement")
If Not WinActive("Winamp Setup","License Agreement")Then WinActivate("Winamp Setup","License Agreement")
WinWaitActive("Winamp Setup","License Agreement")
Send("{ENTER}")
WinWait("Winamp Setup","Choose Components")
If Not WinActive("Winamp Setup","Choose Components")Then WinActivate("Winamp Setup","Choose Components")
WinWaitActive("Winamp Setup","Choose Components")
Send("{ENTER}")
WinWait("Winamp Setup","Choose Install Options")
If Not WinActive("Winamp Setup","Choose Install Options")Then WinActivate("Winamp Setup","Choose Install Options")
WinWaitActive("Winamp Setup","Choose Install Options")
Send("{ENTER}")
WinWait("Winamp Setup","Choose Install Location")
If Not WinActive("Winamp Setup","Choose Install Location")Then WinActivate("Winamp Setup","Choose Install Location")
WinWaitActive("Winamp Setup","Choose Install Location")
Send("{ENTER}")
WinWait("Winamp Setup","Multi-user Settings")
If Not WinActive("Winamp Setup","Multi-user Settings")Then WinActivate("Winamp Setup","Multi-user Settings")
WinWaitActive("Winamp Setup","Multi-user Settings")
Send("{ENTER}")
WinWait("Winamp Setup","Internet Connection and Language Settings")
If Not WinActive("Winamp Setup","Internet Connection and Language Settings")Then WinActivate("Winamp Setup","Internet Connection and Language Settings")
WinWaitActive("Winamp Setup","Internet Connection and Language Settings")
Send("{DOWN}{DOWN}{TAB}{TAB}{TAB}{TAB}{ENTER}")
WinWait("Winamp Setup","Interface and Skin Selection")
If Not WinActive("Winamp Setup","Interface and Skin Selection")Then WinActivate("Winamp Setup","Interface and Skin Selection")
WinWaitActive("Winamp Setup","Interface and Skin Selection")
Send("{ENTER}")
If ProcessExists('winamp.exe') Then ProcessClose('winamp.exe')
If ProcessExists('winampa.exe') Then ProcessClose('winampa.exe')
If ProcessExists('EmusicClient.exe') Then ProcessClose('EmusicClient.exe')
Run ("d:\1\Winamp 5.24\winamp_5.24_rus.exe")
WinWait("Установка","Новости от")
If Not WinActive("Установка","Новости от")Then WinActivate("Установка","Новости от")
WinWaitActive("Установка","Новости от")
Send("{ENTER}")
WinWait("Установка","Выберите установки програмы")
If Not WinActive("Установка","Выберите установки програмы")Then WinActivate("Установка","Выберите установки програмы")
WinWaitActive("Установка","Выберите установки програмы")
Send("{ENTER}")
WinWait("Установка","Пожалуйста")
If Not WinActive("Установка","Пожалуйста")Then WinActivate("Установка","Пожалуйста")
WinWaitActive("Установка","Пожалуйста")
Send("{ENTER}")
If ProcessExists('winamp.exe') Then ProcessClose('winamp.exe')
If ProcessExists('winampa.exe') Then ProcessClose('winampa.exe')
If ProcessExists('EmusicClient.exe') Then ProcessClose('EmusicClient.exe')

Просто происходит не установка програмы, а бесконечный запуск скрипта......пути правильные....

Creat0R 25-10-2006 01:49 502321

Sanja Alone
Цитата:

Оч. просто это сделать при пом. cmd-файла:
Спасибо, до сих пор, я именно при помощий ком. строки (которую “писал” Аутоит) и реализовал свою цель :) , правда более примитивней чем твой пример - Но хотел узнать как средствами одного лишь аутоита это сделать, т.к требуется увеличение скорости, и уменьшения загрузкий процессора и памяти.

Цитата:

Здесь все муторней
Ну почему, разве такой командой это не решить просто:
Код:

cd "путь\к папке"
dir /b /s /o:-d *.* > test.tmp

А затем, аутоитом проверять первую строку временного файла:

Код:

$NewFile = FileReadLIne("Test.tmp", 1)
amel27
Цитата:

вот что получилось
Получилось идеально!!! Огромное спасибо!


Angelus

Цитата:

где в этом скрипте ошибка?
В начало скрипта, поставь такую строчку:

Код:

Opt("TrayIconDebug", 1)
Если в скрипте есть строка скрывающая иконку скрипта в трее (#NoTrayIcon), то её нужно временно закоментировать (дописать в начале строки символ ; ).
И когда запустишь скрипт, то наведи мышку на иконку скрипта в трее, и посмотри на какой строке “зависает” скрипт.

Как я это вижу, скрипт зависает на одной из строк, содержащей WinWait или WinWaitActive - желательно ставить время, по истичению которого, скрипт больше не будет “ждать” появления окна или его активности...

Код:

WinWaitActive("Заголовок", "Текст", 120) ;Где 120, это секунды, по истичению которых, скрипт “продолжит” дальше, вне зависимости от того, появилось\активировалось ли окно или нет.

Sanja Alone 25-10-2006 03:56 502336

Creat0R
Цитата:

Ну почему, разве такой командой это не решить просто:
Нет. Я же говорю, что эта команда производит сортировку в пределах каждого подкаталога, т.е., первой строкой будет самый новый файл рабочего каталога, а не всего дерева его подкаталогов. А это оч. сильно усложнит решение задачи при пом. cmd-файла.


Angelus
  1. А этот скрипт не подходит?
  2. Отлов ошибок в скриптах описан в FAQ.
  3. Код нужно заключать в тэг code. Прошу не игнорировать ПРАВИЛА ФОРУМА.

Lodoss 29-10-2006 19:11 504086

Есть неплохая идея: написать оболочку (GUI) для авторизации запуска скрипта от имени админа.

начал писать и наткнулся на проблемку - незнаю как реализовать проверку строки RunAsSet на наличие прав администратора
вот код:

Код:

#include <GUIConstants.au3>
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("solo11",  25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")

GUISetState(@SW_SHOW)

While 2
$msg = GUIGetMsg()
;считываем введённые данные
$out1 = GUICtrlRead($in1)
$out2 = GUICtrlRead($in2)

Global $user = $out1, $pass = $out2

Select
Case $msg = $ok
;инициализация запуска от имени админа
RunAsSet($user, "", $pass)

;проверка верны ли введённые записи на право обладания правами админа
;вот здесь незнаю как реализовать проверку. написал но думается неправильно
;---------------------------------------
if        IsAdmin() = -1 Then
MsgBox(16, "Ошибка", "Данная учётная запись не обладает правами Администратора")
EndIf
;---------------------------------------

;запуск программы
Run("setup.exe")
;закрытие окна
        Case $msg = $cancel
          ExitLoop
    Case $msg = $GUI_EVENT_CLOSE
                ExitLoop
        EndSelect
WEnd
;-------------------------------------

в дополнение хотелось бы сделать так чтобы при неправильном вводе имени или пароля GUI не закрывалось а предлагало заново ввести имя и пароль. Ещё , если пользователь обладает правами администратора GUI вобще не появлялось а начинало запуск скрипта с команды Run либо выводило окно без пароля.
Помогайте решать ! :) думаю вещь полезная и пригодиться многим.

Sanja Alone 30-10-2006 08:24 504251

Lodoss
Цитата:

Помогайте решать
Это хотел?
Код:

#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)
;что запускать
$what_to_run="setup.exe"

If IsAdmin() Then
        ;запуск программы
        Run($what_to_run)
Else
        ;если не админ, то "рисуем" GUI
        _GUI()
EndIf

Func _GUI()
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("solo11",  25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")

GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()
;считываем введённые данные
$out1 = GUICtrlRead($in1)
$out2 = GUICtrlRead($in2)

Global $user = $out1, $pass = $out2

Select
        Case $msg = $ok
                ;инициализация запуска от имени админа
                RunAsSet($user, "", $pass)

                ;проверка верны ли введённые записи на право обладания правами админа
                ;---------------------------------------

                if IsAdmin() Then
                        ;запуск программы
                        Run($what_to_run)
                        If @error Then
                                MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
                        EndIf
                Else
                        MsgBox(16, "Ошибка", "Данная учётная запись не обладает правами Администратора",5)
                EndIf
                ;---------------------------------------

                ;закрытие окна
        Case $msg = $cancel
                ExitLoop
    Case $msg = $GUI_EVENT_CLOSE
                ExitLoop
EndSelect
WEnd
;-------------------------------------
EndFunc


Jilted 30-10-2006 11:45 504324

Наваял тут скрипт для FastStone Image Viewer 2.8 с последующей русификацией.
Может, кому пригодится.
Код:

RunWait (@ScriptDir&'\'&'fs.exe /S') ; Тихая установка самой программы
Run (@ScriptDir&'\'&'Rus.exe') ; Установка русификатора
WinWait("Установка русификатора","Вас приветствует мастер")
WinActivate("Установка русификатора","Вас приветствует мастер")
WinWaitActive("Установка русификатора","Вас приветствует мастер")
Send("{ENTER}")
Send("{ENTER}")
WinWait("Установка русификатора","Внимательно ознакомьтесь")
WinActivate("Установка русификатора","Внимательно ознакомьтесь")
WinWaitActive("Установка русификатора","Внимательно ознакомьтесь")
Send("{UP}{UP}{ENTER}")
WinWait("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в следующую папку")
WinActivate("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в следующую папку")
WinWaitActive("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в следующую папку")
Send("{ENTER}")
WinWait("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в папку")
WinActivate("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в папку")
WinWaitActive("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в папку")
Send("{ENTER}")
WinWait("Установка русификатора","Русификатор FastStone Image Viewer 2.8 успешно установлен")
WinActivate("Установка русификатора","Русификатор FastStone Image Viewer 2.8 успешно установлен")
WinWaitActive("Установка русификатора","Русификатор FastStone Image Viewer 2.8 успешно установлен")
Send("{UP}{SPACE}{UP}{ENTER}")

Программа + Русификатор

Lodoss 31-10-2006 17:48 504954

2Sanja Alone

Да это, но наполовину.
проверил:
Если пользователь админ - оболочка не запускается как и хотелось , если GUI запускается проверка учётки на привелегии админа
Код:

Case $msg = $ok
RunAsSet($user, "", $pass)
if IsAdmin() Then
Run($what_to_run)
If @error Then
MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
EndIf
Else
MsgBox(16, "Ошибка", "Данная учётная запись не обладает правами Администратора",5)
EndIf

несрабатывает !!!, т е выдаёт сообщение "Данная учётная запись не обладает правами Администратора" в любом случае, даже если я под пользователем с ограничеными правами правильно ввёл учётные данные администратора. :/

и ещё вопрос можно ли в комбо списке сделать отображение учёток обладающих этими правами администратора :). в макро переменных нашёл только @UserName а можно ли получить список всех учёток зарегестрированых на компе и обладающих администраторскими привелегиями?.

TERMINAL 01-11-2006 12:47 505262

Как сделать закрытие окна (Alt+F4), например окно хелпа?!

Creat0R 01-11-2006 18:03 505438

TERMINAL
Цитата:

Как сделать закрытие окна
Можно так:

Код:

WinClose("Заголовок окна", "Текст окна")
Или так:

Код:

WinActivate("Заголовок окна", "Текст окна")
WinWaitActive("Заголовок окна", "Текст окна", 10)
Send("!{F4}")


Creat0R 02-11-2006 08:08 505643

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

Код:

Первая строчка
Вторая строчка
Просто текст
Ещё текст...
Просто текст

И заранее известно, что именно нужно искать, и это помещенно в переменную - $Var = "Просто текст"...

Нужно в этом файле вычеслить, повторяется ли этот самый текст (тот который в переменной), если есть совпадения, то желательно вернуть номер строчки где есть совпадение, и строку содержащюю найденый дубликат (в Array[1].. [2] и т.п).

Возможно уже есть такая опция в AutoIt, но я что-то затрудняюсь найти в справке подобную функцию :(

TERMINAL 02-11-2006 10:40 505725

Creat0R
Спасибо тебе-(Send("!{F4}")) конкретно помогло.

Вопрос ещё один. У меня в программе ACDSee 8 вводится ключ в поле регистрации,но на совремменых компах он успевает вводится, а на слабых компах скрипт успевает ввести только 4 первых символа (паузы почемуто непомогают). Как сделать чтобы скрипт дождался полного ввода серийника.

Код:

Global $serial='12345-67890-12345-67890'
Run ( @ScriptDir & '\' & 'Setup.exe' )
WinWait("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
WinActivate("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
ControlClick("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous","Button1")
WinWait("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
WinActivate("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button3")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button5")
WinWait("ACDSee 8 - InstallShield Wizard","&Organization:")
WinActivate("ACDSee 8 - InstallShield Wizard","&Organization:")
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","RichEdit20W3")
ControlSetText ( 'ACDSee 8 - InstallShield Wizard', 'Customer Information', 'Edit3', $serial)
;Send($serial)
Sleep(5000)
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","Button8")
WinWait("ACDSee 8 - InstallShield Wizard","&Complete")
WinActivate("ACDSee 8 - InstallShield Wizard","&Complete")

И вот ещё-хотелось бы узнать, как сделать, например, окно под названием ММ, чтобы при установке программы, когда вылазит окно ММ закрыть его и повторить установку заново, а если не вылезет тогда продолжать установку?!

VelDmi 02-11-2006 14:55 505863

Из скрипта запускается консольный nerocmd.exe. Можно ли как то получить данные, показываемые в консоли для отображения их в GUI автоита?

Creat0R 02-11-2006 17:25 505930

TERMINAL
Цитата:

Как сделать чтобы скрипт дождался полного ввода серийника
Попробуй вместо ControlSetText прописать так:

Код:

ControlCommand("ACDSee 8 - InstallShield Wizard", "Customer Information", "Edit3", "EditPaste", $serial)
И ещё, заголовок окна, чувствителен к регистру, поставь в начало скрипта, такую строчку - Opt("WinTitleMatchMode", 4)

Цитата:

когда вылазит окно ММ закрыть его и повторить установку заново
Нужно всё поместить в цикл, и в конце проверять существование окна...

Код:

Opt("WinTitleMatchMode", 4)

While 1
Global $serial='12345-67890-12345-67890'
Run ( @ScriptDir & '\' & 'Setup.exe' )
WinWait("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
WinActivate("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
ControlClick("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous","Button1")
WinWait("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
WinActivate("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button3")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button5")
WinWait("ACDSee 8 - InstallShield Wizard","&Organization:")
WinActivate("ACDSee 8 - InstallShield Wizard","&Organization:")
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","RichEdit20W3")
ControlCommand("ACDSee 8 - InstallShield Wizard", "Customer Information", "Edit3", "EditPaste", $serial)
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","Button8")
WinWait("ACDSee 8 - InstallShield Wizard","&Complete")
WinActivate("ACDSee 8 - InstallShield Wizard","&Complete")

WinWait("MM", "", 10) ; ждём 10 секунд окна с заголовком MM
If WinExists("MM", "") Then ContinueLoop
ExitLoop
Wend


VelDmi
Цитата:

Можно ли как то получить данные, показываемые в консоли
Попрубуй так:

Код:

$NerocmdTxt = WinGetText("Заголовок консоли", "")

TERMINAL 02-11-2006 18:10 505963

Creat0R

<Нужно всё поместить в цикл, и в конце проверять существование окна...>

А примерчик простенький можна?

Creat0R 03-11-2006 02:07 506118

TERMINAL
Цитата:

примерчик простенький можна?
Неужели не видно тот пример который я привёл в своём посте? :blink:

Цикл:

Код:

While 1
....
Wend

Это “заставит” скрипт “ходить” от While 1 до Wend, до тех пор, пока что то не заставит выйти из этого цикла...

Код:

While 1
ExitLoop ; Выход с цикла
Wend

И соответственно строим условие, при существовании которго, что то произойдёт (выход из цикла, или продолжение цикла)...

Код:

While 1
If WinExists("MM", "") Then ContinueLoop ;Если окно существует, то цикл начнётся заного, и скрипт моментально “продолжит” с начала цикла (While 1)
ExitLoop ;Выход из цикла (так как окно небыло найдено)
Wend


amel27 03-11-2006 05:50 506146

Creat0R
Цитата:

Имеется файл, а в нём много разного текста, и нужно перечитать весь текст, и проверить, не содержатся ли в нём дубликаты определённой переменной.
Обычным циклом устроит? Функция выводит сообщения (Select) и возвращает двумерный массив со счетчиком (номер строки и текст) , можно на выбор оставить что-нибудь одно:
Код:

#include <File.au3>

$dups = _TextInFile ("c:\test.txt", "Просто текст")

Func _TextInFile ($file, $text)
        Local $i, $txtLines, $res [1][2] = [[0,0]]
        Local $str='Строки, содержащие "' & $text & '":' & @CRLF & @CRLF
        _FileReadToArray ($file, $txtLines)
        If Not IsArray ($txtLines) Then
                MsgBox (16, 'Ошибка', 'Файл пуст')
        EndIf
        For $i=1 To $txtLines [0]
                If StringInStr ($txtLines [$i], $text) Then
                        ReDim $res [$res [0][0]+2][2]
                        $res [0][0] = $res [0][0] +1
                        $res [$res [0][0]][0] = $i
                        $res [$res [0][0]][1] = $txtLines [$i]
                        $str = $str & $i & ':' & @TAB & $txtLines [$i] & @CRLF
                EndIf
        Next
        Select
                Case $res [0][0] =0
                        MsgBox (16, 'Ошибка', 'Вхождений не обнаружено!')
                Case $res [0][0] =1
                        MsgBox (64, 'Сообщение', 'Дублей нет')
                Case Else
                        MsgBox (48, 'Предупреждение', $str)
        EndSelect
        Return $res
EndFunc


amel27 03-11-2006 07:30 506164

Lodoss
Цитата:

можно ли получить список всех учёток зарегестрированых на компе и обладающих администраторскими привелегиями?.
ну ты горазд задачки задавать... три дня колдовал на DllCall ;) ... самое забавное, что на форуме AutoIt не нашел ни одного рабочего варианта... Зато теперь можно смело замахнуться на всю линейку NetApi32 :)
Код:

;===============================================================================
; Использование:    _NetLocalGroupGetMembers ($s_Group, [$s_Computer, [, $i_ShowDomain [, $i_Filter]]])
; Параметры:        $s_Group - имя локальной группы;
;                    $s_Computer - DNS или NetBIOS имя компьютера, пустая строка или пропущенный
;                      параметр равнозначны локальному компьютеру;
;                    $i_ShowDomain - "1" включить имя домена, "0" не включать;
;                    $i_Filter - набор флагов, задающих фильтр отбираемых записей:
;                        1 - пользователи,
;                        2 - группы,
;                      16 - предопределенные (WellKnown) группы,
;                      32 - удаленные учетные записи,
;                      128 - неизвестный тип.
; Результат:        При успешном завершении возвращает 1-мерный массив учетных записей,
 ;                      1-й элемент массива (индекс 0) содержит количество записей.
;                    При неудаче 1-й элемент содержит "-1" и @error указывает код ошибки
;
;===============================================================================

Func _NetLocalGroupGetMembers ($sGroup, $sServer = "", $iShowDom = 1, $iFilter = 511)
    Local $res [1] = [0], $uPTR= DllStructCreate ("ptr")
    If $iShowDom Then
        $iShowDom=2
    Else
        $iShowDom=1
    EndIf
    Local $ret = DllCall ("netapi32.dll", "int", "NetLocalGroupGetMembers", _
        "wstr", $sServer, _
        "wstr", $sGroup, _
        "int", $iShowDom, _
        "ptr", DllStructGetPtr ($uPTR), _
        "int", -1, _
        "int_ptr", 0, _
        "int_ptr", 0, _
        "int_ptr", 0 )
    If $ret[0] Then
        SetError ($ret [0])
        $res[0] = -1
    Else
        If $ret[6]>0 Then
            Local $i, $string
            Local $uBUF = DllStructCreate ("ptr[" & $ret[6]*3 & "]", DllStructGetData ($uPTR,1) )
            For $i=3 To $ret[6]*3 Step 3
                If BitAnd (BitShift (1, 1 - DllStructGetData ($uBUF, 1, $i-1) ), $iFilter) Then
                    $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
                        "int", 0, _
                        "int", 0, _
                        "ptr", DllStructGetData ($uBUF, 1, $i), _
                        "int", -1, _
                        "str", "", _
                        "int", 0, _
                        "int", 0, _
                        "int", 0 )
                    $string = DllStructCreate ("char[" & $ret[0] & "]")
                    $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
                        "int", 0, _
                        "int", 0, _
                        "ptr", DllStructGetData ($uBUF, 1, $i), _
                        "int", $ret[0], _
                        "ptr", DllStructGetPtr ($string), _
                        "int", $ret[0], _
                        "int", 0, _
                        "int", 0 )
                    ReDim $res [$res[0]+2]
                    $res [0] = $res [0]+1
                    $res [$res[0]] = DllStructGetData ($string,1)
                EndIf
            Next
        EndIf
    EndIf
    DllCall ("netapi32.dll", "int" ,"NetApiBufferFree", _
        "ptr" , DllStructGetData ($uPTR,1) )
    Return $res
EndFunc


TERMINAL 03-11-2006 10:48 506271

Я наверное плохо объяснил...
Суть проблемки с циклами вот в чём-программа имеет сетап и патч. При установки сетапа всё происходит ОК, а при установке патча (если нет видео драйверов) выдаётся ошибка и прекращается установка.Потом опять запускаешь патч до тех пор пока он не начинает сам ставится (это бывает от 1 до 2 раз). Вот я и хочу объяснить скрипту что если ничего не вылезет то можно продолжать установку (а не так как у тебя-ВЫХОД), а если вылезет окно ошибки, то нужно закрыть его и опять устанавливат этот патч пока он не установится.

Creat0R 04-11-2006 01:52 506712

amel27
Цитата:

Функция выводит сообщения (Select) и возвращает двумерный массив со счетчиком (номер строки и текст)
Немного не так :( - Мне нужно чтобы вернулись в массив все номера строк, которые содержат дубляжи (именно дубляжи, без первой находки искомого слова), и желательно, чтобы в массиве эти номера строк, помещались через разделитель (допустим, через | ). В случае неудачи (или если вовсе не найденно вхождении), т.е если дубликатов нет, ненужно выводить сообщения, а просто в массив с нулём ($Array[0]) поместить содержание искомого слова (ну или вообще просто пустату "" - это нужно для проверки содержит ли массив номера строк, т.е дубляжи).

Просто дело в том, что задача у меня примерно такая:
-Проверить файл на дубликаты определённово слова (а точнее ссылки), если есть таковы, то просто удалить все дубликаты, оставив один-“оригинал” - Как удалять я знаю, имея номера строк, я могу восспользоваться функцией _FileWriteToLine...

Код:

#include <File.au3>

$Array = StringSplit("1|4|6|8", "|") ;Вместо цифр будет подставлен тот самый массив с номерами строк

For $i = 1 to $Array[0]
        _FileWriteToLine("File.txt", $Array[$i], "", 1)
Next

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

---------------------------------

TERMINAL

У тебя в примере, нет упоминания о патче, но попробую привести нужны пример на основе воображения :) :

Код:

Opt("WinTitleMatchMode", 4)

Global $serial='12345-67890-12345-67890'
Run ( @ScriptDir & '\' & 'Setup.exe' )
WinWait("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
WinActivate("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
ControlClick("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous","Button1")
WinWait("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
WinActivate("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button3")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button5")
WinWait("ACDSee 8 - InstallShield Wizard","&Organization:")
WinActivate("ACDSee 8 - InstallShield Wizard","&Organization:")
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","RichEdit20W3")
ControlCommand("ACDSee 8 - InstallShield Wizard", "Customer Information", "Edit3", "EditPaste", $serial)
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","Button8")
WinWait("ACDSee 8 - InstallShield Wizard","&Complete")
WinActivate("ACDSee 8 - InstallShield Wizard","&Complete")

While 1
Run( @ScriptDir & '\' & 'Path.exe' )

WinWait("MM", "", 10) ; ждём 10 секунд окна с заголовком MM

;В случае появления окна с заголовком “MM”, Закрываем его, и запускаем патч снова
If WinExists("MM", "") Then
WinClose("MM", "")
ContinueLoop
EndIf
ExitLoop
Wend


XXXler 04-11-2006 03:08 506728

Нижеприведенная функция убивает все возможные окна от запущенного ей процесса и если какие-либо окна появлялись - перезапускает прогу заново (убиваются окна также дочерних процессов, просто одноименные окна\процессы не затрагиваются)

Код:

;~ Пример запускает+закрывает setup.exe:
RunKillWin(@SystemDir&"\setup.exe")

;~ Использование:
;~ RunKillWin("Путь и имя файла"[, таймаут ожидания завершения выполнения exe(сек)][,количество попыток "тихого" выполнения])
;~ Возвращает количесто выполненых попыток

Func RunKillWin($Exe,$MaxTimeOutForProcess=300,$MaxCountToReRun=10)
Local $i,$PID,$Timer,$WinArr,$y,$z=0

For $i=1 To $MaxCountToReRun

        ;~ Корявая поверка необходимости перезапуска
        If $z=1 Then ExitLoop
        $z=1
       
        $PID=Run($Exe)
        ;~ Запуск таймера таймаута выполнения
        $Timer=TimerInit()
               
        While ProcessExists($PID)

                ;~ Сверка таймера
                If TimerDiff($Timer)>$MaxTimeOutForProcess*1000 Then
                        ProcessClose($PID)
                        If Not(ProcessWaitClose($PID,30)) Then Return -1
                        $z=0
                        ContinueLoop 2
                EndIf
               
                $WinArr=WinList()
                For $y=1 To $WinArr[0][0]
                        If Not(WinGetProcess($WinArr[$y][1])=$PID) Then ContinueLoop
                        ;~ Собственно действие над окном\доп. проверку его титла можно поменять здесь
                        WinKill($WinArr[$y][1])
                        $z=0
                Next
               
        WEnd
       
Next
Return $i-1
EndFunc


Sanja Alone 04-11-2006 03:55 506736

TERMINAL
Цитата:

Как сделать чтобы скрипт дождался полного ввода серийника
Код:

$serial="серийник"
WinWait ("Заголовок", "Текст")
Do
        ControlSetText ( "Заголовок", "Текст", "Edit1", $serial )
Until ControlGetText ( "Заголовок", "Текст", "Edit1" )=$serial

Думаю, что идея ясна.

VelDmi 04-11-2006 13:10 506847

Creat0R
Цитата:

Попрубуй так:
Код:
$NerocmdTxt = WinGetText("Заголовок консоли", "")
Не работает. Более того, AutoItInfo тоже не видит никакого текста в окне консоли. Еще есть идеи?

amel27 05-11-2006 09:42 507157

Creat0R
Цитата:

$Array = StringSplit("1|4|6|8", "|")
ну ты умеешь озадачить... зачем делать сплит строки если предложенная функция возвращает уже готовый массив с номерами строк?
Цитата:

если дубликатов нет, ненужно выводить сообщения, а просто в массив с нулём ($Array[0])
именно такой массив ф-ция и возвращает, только не одномерный, а двумерный - ты же вроде заказывал не только номера строк ($Array[$i][0]), но и их содержимое ($Array[$i][1])? Счетчик $Array[0][0] содержит число возвращенных строк - если он равен 0, то вхождений соответственно нет. SELECT добавлен для наглядности, я же вроде сказал что его можно убрать.
Цитата:

Но и тут есть проблема, после удаления строки под первым номером присутствующем в массиве, все остальные теряют своё значения, и удаляются уже не те строки
эта проблема решается просто - нужно проходить массив в обратном направлении: от конца файла к его началу:
Код:

#include <File.au3>

$File = "c:\test.txt"
$Array = _TextInFile ($File, "Просто текст")
If $Array[0][0]>1 Then
        For $i = $Array[0][0] to 2 Step -1
                _FileWriteToLine($File, $Array[$i][0], "", 1)
        Next
EndIf

Func _TextInFile ($file, $text)
        Local $i, $txtLines, $res [1][2] = [[0,0]]
        _FileReadToArray ($file, $txtLines)
        If IsArray ($txtLines) Then
                For $i=1 To $txtLines [0]
                        If StringInStr ($txtLines [$i], $text) Then
                                ReDim $res [$res [0][0]+2][2]
                                $res [0][0] = $res [0][0] +1
                                $res [$res [0][0]][0] = $i
                                $res [$res [0][0]][1] = $txtLines [$i]
                        EndIf
                Next
        EndIf
        Return $res
EndFunc


Creat0R 05-11-2006 23:47 507423

amel27
Приогромное спасибо! Я думал что функция для моей задумки, будет выглядеть намного длинее :)

В связи с тем, что эта функция относительно быстро срабатывает (я проверял на большом файле с текстом), у меня появился вопрос...

У меня есть функция (от Sanja Alone), которая делает поиск по файлу, и если текст найден, то возвращается в Array[0] номер строки где был найден текст, а в Array[1] возвращается состав этой строки. Так вот, та функция, визуально большая, и большие файлы обрабатывает довольно долго (доходит до 5-ти секунд). И ещё, возвращается только первое-найденное вхождение, а хотелось бы точно также как и с твоей функцией, чтобы в массив возвращались все номера строк, и все содержания этих строк.

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

amel27 06-11-2006 04:20 507468

Creat0R
Цитата:

та функция, визуально большая, и большие файлы обрабатывает довольно долго (доходит до 5-ти секунд).
Смотри текст скрипта - у Sanja Alone дополнительно реализована нечувствительность к регистру для русского текста (для английского это выполняется автоматически), возможно поэтому он и работает медленнее...

Цитата:

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

For $i = $Array[0][0] to 2 Step -1
...
Next


Creat0R 06-11-2006 09:55 507512

amel27
Ещё раз спасибо. В данном случае, нет необходимости в поиске текста содержащий кириллицу (разве что бывают ссылки с кириллицей :) ).

TERMINAL 06-11-2006 16:32 507647

1. Creat0R спасибо за скрипт, но он всеравно не подходит. В твоём скрипте постоянно, бесконечно стартует Setup.exe

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

=======================================================

2. ПОМОГИТЕ НАЙТИ ОШИБКУ !!!
Мне нужно убрать галочки при инсталяции (именно мышкой <ControlClick>)-написал такой скрипт, но он не убират галочки:

HTML код:

WinWait("InstallShield Wizard","InstallShield Wizard Complete")
WinActivate("InstallShield Wizard","InstallShield Wizard Complete")
ControlClick("InstallShield Wizard","InstallShield Wizard Complete","Static1")
ControlClick("InstallShield Wizard","InstallShield Wizard Complete","Static1")


Creat0R 06-11-2006 16:53 507662

TERMINAL

Цитата:

постоянно, бесконечно стартует Setup.exe
Присмотрись в скрипт, там указанно окно при пресутствии которого, скрипт опять запустит Setup.exe

Цитата:

вылезет окно ERROR
Кажется это было окно "MM" ;) ...

Код:

If WinExists("ERROR", "") Then ;Если окно с заголовком ERROR существует, то....
WinClose("ERROR", "")  ;Закрываем это окно
ContinueLoop ;продолжаем (начинаем) скрипт сначала (запустив Setup.exe опять)
EndIf ;Конец условия (“Если окно с заголовком ERROR существует, то....”)
ExitLoop ;Выход из цикла (без запуска Setup.exe)

Цитата:

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

Код:

ControlClick("InstallShield Wizard","InstallShield Wizard Complete","Static1")
ControlClick("InstallShield Wizard","InstallShield Wizard Complete","Static1")

Убери (или измени) один, и будет ставить галку (если все параметры верные).

Creat0R 06-11-2006 20:17 507725

amel27
Есть ещё небольшой вопрос, также немного затрагивающий функцию поиска дубликатов...

Возможно ли сделать поиск по файлу на дубликаты, но заранее не знаяя вхождения? т.е нужно проверить все существующие строки в файле, и если хоть какая то из них имеет дубликат (именно по строке), то удалить все точно такие же строки, но оставив оригинал (для каждой такой найденной строки, произвести данную операцию - т.е удаление дубликатов найденных строк). Но, подвог (для меня) в том, что нужно удалить не именно те строки (их дубликаты), а те которые располагаются на три строчки выше.

Вот пример файла:

Код:

Первая строка
Ещё строка - > вот это и нужно чтобы удалилось (так как на три строки ниже, есть дубль той строки, которая на одну ниже этой (но её положение не фажно))
и ещё строка
просто текст
и ещё строка
и ещё больше текста
строка номер 7 - > и вот это нужно чтобы удалилось
строка 8
и текст строки номер 9
И ещё больше текста


P.S.
В данном случае, скорость обработки, не очень уж важно, да и визуализация тоже :) - Главное функционал!

amel27 07-11-2006 11:21 507983

Creat0R
Цитата:

ещё небольшой вопрос
примерно так... Пара замечаний - во-первых, оператор "=" (для целых строк) в отличие от StringInStr (для вхождений) дружит с русским языком и это хорошо... во-вторых, строки с дополнительными пробелами в конце/начале строк будут рассматриваться как различные, если это не устраивает нужно применить функцию StringStripWS.
Код:

#include <File.au3>

$File = "c:\test.txt"

Dim $FileLines
_FileReadToArray ($file, $FileLines)
; Возвращаем массив из дублирующихся записей
$DupLines = _DupsInArray ($FileLines)
; Страховка от пустого массива если дублей нет
If $DupLines [0][0] >0 Then
        ; Рабочий массив для отметок удаляемых записей
        Local $DelFlags [$FileLines [0] +1]
        For $i=1 To $DupLines [0][0]
                ; расчитываем номер строки для удаления
                $delNum = $DupLines [$i][0] - 3
                ; отмечаем кандидата на удаление в массиве
                $DelFlags [$delNum] = 1
        Next
        ; Собственно цикл удаления
        For $i = $FileLines [0] To 1 Step -1
                If $DelFlags [$i] = 1 Then
                        _FileWriteToLine ($File, $i, "", 1)
                EndIf
        Next
EndIf

; Возвращает двумерный массив со счетчиком, содержащий только дубли
Func _DupsInArray (ByRef $array)
        Local $i, $i, $res [1][2] = [[0,0]]
        ; рабочий массив для отметки обработанных дублей
        Local $flags [$array [0] +1]
        For $i=1 To $array [0]
                For $j=$i+1 To $array [0]
                        If $flags [$j] <> 1 Then
                                If $array [$i] = $array [$j] Then
                                        ReDim $res [$res [0][0]+2][2]
                                        $res [0][0] = $res [0][0] +1
                                        $res [$res [0][0]][0] = $j
                                        $res [$res [0][0]][1] = $array [$j]
                                        $flags [$j] = 1
                                EndIf
                        EndIf
                Next
        Next
        Return $res
EndFunc


Creat0R 07-11-2006 12:01 508017

amel27
Я извеняюсь, я не обращал внимания, но в том файле, для которго это будет делаться, есть дубли которые не должны быть тронуты. Т.е я даже заранее знаю начало строки - URL= но перед этим идёт таб (@Tab)... в общем, вот часть этого файла (это закладки от браузера Opera):

Код:

#URL
        ID=16
        NAME=ICQ2Go!
        URL=http://www.icq.com/icq2go/flicq.html
        ICONFILE=www.icq.com.ico
        IN PANEL=YES
        PANEL_POS=10

#URL
        ID=17
        NAME=Сетевые инструменты
        URL=file://C:/Program Files/Opera/help/tools/tools.htm
        ICONFILE=tools.ico
        IN PANEL=YES
        PANEL_POS=13

#URL
        ID=18
        NAME=Просмотр Кеша
        URL=file://C:/Program Files/Opera/help/Opera_Cache_Viewer76/viewer.htm
        ICONFILE=cash.ico
        IN PANEL=YES
        PANEL_POS=14

#URL
        ID=19
        NAME=ICQ2Go!
        URL=http://www.icq.com/icq2go/flicq.html
        ICONFILE=www.icq.com.ico
        IN PANEL=YES
        PANEL_POS=10

#URL
        ID=20
        NAME=Просмотр Кеша
        URL=file://C:/Program Files/Opera/help/Opera_Cache_Viewer76/viewer.htm
        ICONFILE=cash.ico
        IN PANEL=YES
        PANEL_POS=14

Так вот, тут видно, что есть много дублей, но не все нужно трогать, а именно те, которые имеют начало URL= (ссылка потом может быть любая). И нужно чтобы удалилась строчка, содержащая это - #URL (т.е она расположена на три строки выше чем совпавший дубль). Я пометил красным те строки, которые именно в этом куске, и должны будут быть удалены в конце обработки.

amel27 07-11-2006 13:02 508043

Creat0R
просто добавь еще один IF:
Код:

...
For $i=1 To $DupLines [0][0]
        If StringLeft ($DupLines [$i][1], 5) = @TAB & "URL=" Then
                ; расчитываем номер строки для удаления
                $delNum = $DupLines [$i][0] - 3
                ; отмечаем кандидата на удаление в массиве
                $DelFlags [$delNum] = 1
        EndIf
Next
...

... судя по файлу это больше смахивает на работу с блоками текста, чем просто со строками

Creat0R 07-11-2006 16:39 508177

amel27
Цитата:

просто добавь еще один IF:
Огромное THENX! - Как всё оказывается просто :)

Цитата:

судя по файлу это больше смахивает на работу с блоками текста, чем просто со строками
Ну да, просто содержимое этого файла, может доходить до 5-ти, а то и 10-ти ТЫСЯЧЬ! строк (иногда и больше) - и это всё закладки в браузере Opera (как избранное у IE), данная функция, позволит удалить в этом файле все дублирующиеся закладки. Просто если удалить у любого такого блока, строчку содержащюю #URL, то после запуска браузера, эта закладка не будет отображаться, и даже более этого, браузер сам всё “поправит” в файле, и “затрёт” оставшиеся строчки, которые для него, как бы являются “мусором”.

amel27 08-11-2006 02:04 508424

Creat0R
Цитата:

если удалить у любого такого блока, строчку содержащюю #URL, то после запуска браузера, эта закладка не будет отображаться, и даже более этого, браузер сам всё “поправит” в файле, и “затрёт” оставшиеся строчки
все это замечательно... но представь, что в блоке поменялись местами две строчки (подправит ли это браузер, это ведь не ошибка?), или в новой версии добавили новый реквизит... работа скрипта будет нарушена. Поэтому более "правильным" представляется следующий алгоритм:
- читаем файл и сразу нумеруем записи по блокам (а не по строкам);
- один из реквизитов (URL) оформляем как ключевой для блока;
- формируем новый файл ссылок (поверх старого), но уже без дублей.

З.Ы. обычно чем "правильней" алгоритм, тем он медленней

Creat0R 08-11-2006 04:46 508438

amel27
Цитата:

представь, что в блоке поменялись местами две строчки (подправит ли это браузер, это ведь не ошибка?)
Именно те строчки, которые в промежутке #URL и URL=ссылка, меняться местами не могут, и вообще, все строчки всегда присутствуют так, как это задуманно браузером, я пробовал убирать строки по разному, но браузер ставил так как ему нужно.

Цитата:

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

Цитата:

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

amel27 08-11-2006 12:28 508591

Creat0R
Цитата:

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

применительно к твоему скрипту код можно еще укоротить:
Код:

#include <File.au3>

$File = "c:\test.txt"

Dim $FileLines
_FileReadToArray ($file, $FileLines)
; Возвращаем массив из дублирующихся записей
$DupLines = _DupsInArray ($FileLines)
; Страховка от пустого массива если дублей нет
If $DupLines [0][0] >0 Then
        For $i=$DupLines [0][0] To 1 Step -1
                If StringLeft ($DupLines [$i][1],5) = @TAB & "URL=" Then _FileWriteToLine ($File, $DupLines [$i][0] - 3, "", 1)
        Next
EndIf

З.Ы. я ваще нудный... =)

Creat0R 08-11-2006 13:35 508634

amel27
Цитата:

лучше постановку задачи сделать совместными усилиями.
Ок, буду далее только с открытыми картами появляться :) - просто по какой то причине, мне всё время кажется, что этими самыми “сочинениями”, мне удастса лучше объяснить цель моей задачи.

Цитата:

применительно к твоему скрипту код можно еще укоротить:
Спасибо, но как оказалось, ты в каком то смысле был прав :( ...

Дело вот в чём, браузер не всегда затирает нужные закладки, иногда, если были удалены заглавы (#URL) двух закладок (блоков) идущих подряд, то он удаляет иногда и ту закладку которая идёт выше этих двух. Может всё же как то можно чтобы уже сразу весь блок удалять? :blush2:

Цитата:

я ваще нудный
Желаю чтобы все пользователи этого форума были такими нудными, я бы тогда здесь по жизннно зависал :) - и вообще, нет ли такой возможности (может тоже скрипт написать?), чтобы за каждое твоё оставленное сообщение (пусть даже по всему форуму), автоматом оно обозначалось бы как “Полезное сообщение” - оно так и есть :)

amel27 09-11-2006 03:54 508967

Creat0R
Цитата:

Дело вот в чём, браузер не всегда затирает нужные закладки, иногда, если были удалены заглавы (#URL) двух закладок (блоков) идущих подряд, то он удаляет иногда и ту закладку которая идёт выше этих двух. Может всё же как то можно чтобы уже сразу весь блок удалять?
Сказал же, другого не будет :) ... Лучше воспользоваться твоим утверждением о фиксированном формате блока и чуть переделать существующий:
1. перенес IF в код функции - это необязательно, но оптимизирует поиск дублей,
2. добавил удаление остальных строк блока (в обратном порядке!).
Код:

#include <File.au3>

$File = "c:\test.txt"

Dim $FileLines
_FileReadToArray ($file, $FileLines)
; Возвращаем массив из дублирующихся записей
$DupLines = _DupURLsInArray ($FileLines)
; Страховка от пустого массива если дублей нет
If $DupLines [0][0] >0 Then
        For $i=$DupLines [0][0] To 1 Step -1
                _FileWriteToLine ($File, $DupLines [$i][0] +3, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +2, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +1, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0]  , "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -1, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -2, "", 1)

                _FileWriteToLine ($File, $DupLines [$i][0] -3, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -4, "", 1)
        Next
EndIf

; Возвращает двумерный массив со счетчиком, содержащий только дубли
Func _DupURLsInArray (ByRef $array)
        Local $i, $i, $res [1][2] = [[0,0]]
        ; рабочий массив для отметки обработанных дублей
        Local $flags [$array [0] +1]
        For $i=1 To $array [0]
                If StringLeft ($array [$i],5) = @TAB & "URL=" Then
                        For $j=$i+1 To $array [0]
                                If $flags [$j] <> 1 Then
                                        If $array [$i] = $array [$j] Then
                                                ReDim $res [$res [0][0]+2][2]
                                                $res [0][0] = $res [0][0] +1
                                                $res [$res [0][0]][0] = $j
                                                $res [$res [0][0]][1] = $array [$j]
                                                $flags [$j] = 1
                                        EndIf
                                EndIf
                        Next
                EndIf
        Next
        Return $res
        _ArraySort ($res, 0, 1, 0, 2)
EndFunc

Цитата:

чтобы за каждое твоё оставленное сообщение (пусть даже по всему форуму), автоматом оно обозначалось бы как “Полезное сообщение” - оно так и есть
не переживай - это пройдет... :)

Creat0R 09-11-2006 09:20 509014

Вложений: 1
amel27
Тоже есть трабла :( .

Оказывается :) , иногда некоторых пунктов в этом блоке нету\есть, они не присутствует\присутствуют в том случае, либо, если у закладки нет\есть описании (DESCRIPTION), либо нет\есть код посещения (VISITED=), либо нет\есть код активвности (ACTIVE=). Вот как выглядит самый полный блок (т.е больше этих пунктов нет) :

Код:

#URL
        ID=1
        NAME=AutoIt скрипты .:[общие вопросы]:.
        URL=http://forum.oszone.net/post-508967.html
        CREATED=1163050009
        VISITED=1163050722
        DESCRIPTION=AutoIt скрипты .:[общие вопросы]:.
        ICONFILE=forum.oszone.net.gif
        ACTIVE=YES

А вот как будет выглядеть блок с минимальными пунктами (меньше чем это не может быть) :


Код:

#URL
        ID=21
        NAME=Yahoo!
        URL=http://www.yahoo.com/
        CREATED=1163050735
        ICONFILE=www.yahoo.com.ico

Я бы конечно мог просчитать все варианты, т.е если есть допустим пункт DESCRIPTION=, и нету пункта VISITED=, то делаем одно действие, а если есть первое и нет второго, то делаем другое, и т.д... но это получится слишком громоздко, вот начало этого...

Код:

For $i=$DupLines [0][0] To 1 Step -1
        If StringLeft(FileReadLine($File, $DupLines [$i][0] +3), 13) = @TAB & "DESCRIPTION=" and StringLeft(FileReadLine($File, $DupLines [$i][0] +2), 9) = @TAB & "VISITED=" Then
                _FileWriteToLine ($File, $DupLines [$i][0] +4, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +3, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +2, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +1, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0]  , "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -1, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -2, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -3, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -4, "", 1)
        ElseIf StringLeft(FileReadLine($File, $DupLines [$i][0] +2), 13) = @TAB & "DESCRIPTION=" and StringLeft(FileReadLine($File, $DupLines [$i][0] +5), 8) = @TAB & "ACTIVE="
                _FileWriteToLine ($File, $DupLines [$i][0] +5, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +4 "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +3, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +2, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] +1, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0]  , "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -1, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -2, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -3, "", 1)
                _FileWriteToLine ($File, $DupLines [$i][0] -4, "", 1)
        EndIf
Next

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

amel27 09-11-2006 11:57 509103

Creat0R
Цитата:

Тоже есть трабла
на то и вышло... :) чтобы удалить блок нужно определить его конец и начало:
Код:

#include <File.au3>
#include <Array.au3>

$File = "c:\test.txt"

Dim $FileLines
_FileReadToArray ($file, $FileLines)
; Возвращаем массив из дублирующихся записей
$DupLines = _DupURLsInArray ($FileLines)
; Страховка от пустого массива если дублей нет
If $DupLines [0][0] >0 Then
    For $i=$DupLines [0][0] To 1 Step -1
        ; ищем начало следующего блока
        $iNext = _ArraySearch ($FileLines, "#URL", $DupLines [$i][0])
        ; если не нашли, то конец файла
        If @Error=6 Then $iNext=_FileCountLines ($File) +1
        Do
            $iNext=$iNext-1
            _FileWriteToLine ($File, $iNext, "", 1)
        Until $FileLines [$iNext] = "#URL"
    Next
EndIf

EDIT: исправил ошибку с уловием (выделено красным), спутал с функцией _ArrayBinarySearch

Creat0R 09-11-2006 23:21 509433

amel27
Удаляются не все дублирующиеся блоки :( - и как ни странно, не удалился дубль именно закладки этого поста :) (эксперементировал на прикреплённом мной раньше файле).

amel27 10-11-2006 08:32 509499

Creat0R
Цитата:

Удаляются не все дублирующиеся блоки
ёлы-палы, такую грубую ошибку прозевал!... :blush: функция _DupURLsInArray возвращала неотсортированные данные, а это как известно перепутывает индексы при удалении, профиксил.

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

#include <File.au3>
#include <Array.au3>

$File = "c:\test.txt"

Dim $FileLines
_FileReadToArray ($file, $FileLines)
; Возвращаем данные о дублирующихся блоках
$DupLines = _DupBLKsInArray ($FileLines, '#URL', @TAB & 'URL=')
; Страховка от пустого массива если дублей нет
If $DupLines [0][0] >0 Then
    For $i=$DupLines [0][0] To 1 Step -1
        For $j=$DupLines [$i][1] To $DupLines [$i][0] Step -1
            _ArrayDelete ($FileLines, $j)
        Next
    Next
    _FileWriteFromArray($File, $FileLines, 1)
EndIf

; Возвращает отсортированный двумерный массив со счетчиком, содержащий
; начало и конец продублированных блоков, в качестве параметров принимаются
; строки, отмечающие начало блока и начало ключевой строки
Func _DupBLKsInArray (ByRef $array, $BlkStartLine, $BlkKeyLine)
    Local $i, $i, $BlkStart, $res [1][2] = [[0,0]]
    Local $BlkStartLen= StringLen ($BlkStartLine)
    Local $BlkKeytLen = StringLen ($BlkKeyLine)
    ; рабочий массив для отметки обработанных дублей
    Local $flags [$array [0] +1]
    For $i=1 To $array [0]
        If StringLeft ($array [$i], $BlkKeytLen) = $BlkKeyLine Then
            For $j=$i+1 To $array [0]
                If StringLeft ($array [$j], $BlkStartLen) = $BlkStartLine Then
                    ; отмечаем начало текущего блока
                    $BlkStart = $j
                    ; если у текущего дубля нет конца, значит это он и есть
                    If $res [$res [0][0]][1] =0 Then $res [$res [0][0]][1] = $BlkStart -1
                EndIf
                If $flags [$j] <> 1 Then
                    If $array [$i] = $array [$j] Then
                        ReDim $res [$res [0][0]+2][2]
                        $res [0][0] = $res [0][0] +1
                        ; вспоминаем начало текущего блока
                        $res [$res [0][0]][0] = $BlkStart
                        $res [$res [0][0]][1] = 0
                        $flags [$j] = 1
                    EndIf
                EndIf
            Next
            ; если конца до сих пор не нашли, значит этот блок последний
            If $res [$res [0][0]][1] =0 Then $res [$res [0][0]][1] = $j-1
        EndIf
    Next
    ; сортировка массива по возрастанию
    _ArraySort ($res, 0, 1, 0, 2)
    Return $res
EndFunc


TERMINAL 10-11-2006 11:20 509550

:help: :help: :help: H E L P ! ! ! :help: :help: :help:
Написал кучу скриптов с помощью AutoIt и тут вдруг обновляется Dr.WEB и начинает запрещать работать с этим прекрасным редактором.
Начал проверять свои рабочие скрипты-на половину все заражённые вирусом BackDoor.Hengto :vampire:.Скачал с оф.сайта опять эту прогу-проверил (в ней вирусы зашиты). Так почему же тогда раньше ВЕБ не кричал и почему не все тогда скрипты заражены??!! или у меня на компе просто глюк???

XXXler 10-11-2006 13:52 509670

TERMINAL, у меня Nod32 одно время обзывал скрипт для генерации Inf как Trojan.Autoit.A - потом прошло... Хотя хз, мож ты чего-то и хватанул

Sanja Alone 10-11-2006 13:58 509674

TERMINAL
Цитата:

в ней вирусы зашиты
Нет в AutoIt вируса (для очистки совести проверил Dr.Web-ом, обновленным сегодня). Это у тебя на компе зараза поселилась и уже расползается...

Цитата:

почему не все тогда скрипты заражены
Ну, наверное здоровые скрипты ты компилировал до заражения компа вирусягой.

TERMINAL 10-11-2006 14:02 509676

Да не должен подхватить-2 антивирусника стоят...
Облазил весь инет, попровирял разными антивирусниками-все отвечают что файл ОК - незаражон...,а ВЕБ орёт и блокирует.
Может это у него такая реакция на скрипт??????,правда он не может сказать что файл якобы ВОЗМОЖНЫЙ ВИРУС-просто берёт и блокирует....У кого то такое было????????просто хочется быть уверенным что это из-за скрипта, а не вирус...

TERMINAL 10-11-2006 14:41 509695

Sanja Alone Я скачиваю повторно файл установки AutoIt с оф.сайта-начинаю устанавливать и ВЕБ начинает орать опять на установочные файлы.
НАРОД ПЛЗ !
Пришлите мне какой нибудь скрипт "ехе" упакованый с "au3" на trm6@mail.ru , а я его проверю....

Creat0R 11-11-2006 01:02 509983

amel27
Всё работает как по маслу! Огромное Мерсий! :pray:

TERMINAL
У меня тоже на несколько закомпилированных скриптов, Dr.Web ругается на вирус BackDoor.Hengto - Наверно это из за структуры самого скрипта. Но это не значит что там есть вирус, это значит что Dr.Web (и ему подобные) не достаточно “умный” (при всё уважении к нему :) ), чтобы определить является ли это действительно вирусром, и просто напросто перестроаховывается. У меня стоит последний Kaspersky, он молчит, также молчат проверки online, так что это глюк в этой базе данных доктора ;) (имхо).

Creat0R 12-11-2006 22:58 510672

amel27
Есть небольшая пролблема с функцией, которую ты написал для проверки подключённости к интернету :( ...

При проверке синтаксиса в SciTE, выдаётся ошибка, а именно, эта строка подчёркнута как ошибочная:

Код:

SetError(err.number)
Мне нужно чтобы в случае не подключения, функция лишь возвращала уровень ошибочности (@Error = 1), и чтобы также можно былло проверть, если @error = 1, значит вывожу сообщение (не в функции, а в теле скрипта), и в нём сообщаю о том какая ошибка произошла (значение ошибки должно тоже возвращаться из функции).

amel27 13-11-2006 12:26 510912

Creat0R
опечатку исправил... только почему-то на моем компе она перестала работать - вываливает ошибку таймаута и все тут, хотя точно знаю что все работало!... уже и PROXYCFG проверил - ничего не помогает... ладно, сейчас некогда ковыряться может позже разберусь в чем причина.
Цитата:

если @error = 1, значит вывожу сообщение (не в функции, а в теле скрипта), и в нём сообщаю о том какая ошибка произошла (значение ошибки должно тоже возвращаться из функции)
Обычно делается так: в норме функция возвращает "0" или там еще что по контексту, если ошибка то "-1" или типа того, при необходимости номер ошибки можно восстановить через @error. Это особенно удобно если функция по задумке должна возвращать полезную информацию - в этом случае возможности передать тип ошибки весьма ограничены...

Creat0R 14-11-2006 02:22 511296

amel27
Если я сделаю так (см. ниже), будет ли это являться корректной проверкой подключения?

Код:

;Установка функции перехвата COM-ошибок
 $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")

 If IsNotConnect() Then MsgBox (48,"Проверка связи","Интернет-соединение отсутствует по причине:" & @CRLF & $oMyError.description)

;Функция проверки на отсутствие соединения
 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
            Return $oMyError.description
    EndSelect
Endfunc


P.S:

Просто интересно, как ты разукрасил код скрипта? :) неужели каждую команду (и разделители) обрамлял тегом цветов и выделения?

amel27 14-11-2006 06:21 511327

Creat0R
Если речь про функцию MyErrFunc () то она построена некорректно, посуди сам что выходит: если ошибку вызвал модуль "WinHttp.WinHttpRequest" - устанавливаем только код ошибки и ничего не возвращаем, а если любой другой - только возвращаем текст ошибки... Если скрипт не отслеживает другие возможные ошибки кроме HTTP и тебе нужен не только номер, но и текст ошибки лучше сделать иначе
Код:

;Установка функции перехвата COM-ошибок
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
; ...

;Обработчик COM-ошибок
Func MyErrFunc()
    SetError($oMyError.number)
    Return $oMyError.description
Endfunc

... Хотя учитывая, что с одной стороны эта функция единственная для всех возможных событий, а с другой - коды ошибок для любого модуля вполне известны, ключевой информацией является не текст ошибки, а ее номер и источник. Исходя из этой инфы и строятся обработчики ошибок - внутри самой функции MyErrFunc () или в других местах...

P.S. шалость удалась (c) :) ... конечно скриптом - больше ради прикола чем по необходимости,
заодно разобрался с тегами форума и погонял функции StringRegExp*, если есть интерес то могу запостить...
на самом деле все гораздо проще чем кажется. ;)

Creat0R 14-11-2006 08:25 511354

amel27
В принципе, мне не нужен код ошибки, нужно только описание, т.е если и была ошибка (не важно какая), то нужно сообщать что она была, и по возможности выводить описание этой самой ошибки. И как я понял, используя пример из кода твоего поста (последнего), это оптимальное решение.
Если честно, я смутно понимаю всю работу этой функции, для меня вообще много что связанно с интернетом, пока не очень ясно, я в сети не более полу года нахожусь, и тем более что тут не только о самих понятиях интернета идёт речь, но ещё и о модулях, о которых я только начинаю что то узнавать.

Цитата:

если есть интерес то могу запостить
Конечно есть - Я открыл соответствующий раздел в справке, но мне сразу захотелось её (справку) закрыть. Очень там всё страшно для меня (пока?). Буду благодарен если направиш меня на путь верный :) - У меня получилось корректировать только скобки, точки, запятые, и знаки разделителей и ровно...


Код:

$File = @ScriptFullPath
$FileContent = FileRead($File, FileGetSize($File))

$Result = StringRegExpReplace($FileContent, "[=]", "[color=red]=[/color]")
$Result = StringRegExpReplace($Result, "[(]", "[color=red]([/color]")
$Result = StringRegExpReplace($Result, "[)]", "[color=red])[/color]")
$Result = StringRegExpReplace($Result, "[.]", "[color=red].[/color]")
$Result = StringRegExpReplace($Result, "[,]", "[color=red],[/color]")
$Result = StringRegExpReplace($Result, "[&]", "[color=red]&[/color]")


MsgBox(0, "", $Result)

FileWrite($File & ".res", $Result)


amel27 14-11-2006 10:31 511410

Вложений: 1
Creat0R
По поводу раскраски кода (поскольку это решение на AutoIT то имхо не оффтоп) ... Замечу, что лобовое решение требует последовательного разбора всего текста кода по словарю, а это слишком большой объем работ... Но зачем изобретать велосипед, если SciTE4 уже делает это и весьма успешно? Одна из его возможностей - экспорт кода в HTML/XML-формат с сохранением всех стилей, осталось только определить соответствия между стилями XML и форума и произвести замену. Поэтому обработка проходит в два шага: экспорт кода в XML-файл и последующая обработка его скриптом - содержимое полученного TXT-файла (уже с тегами кода) можно публиковать в форуме. Поскольку текст скрипта напичкан всевозможными тегами вынужден прикрепить его отдельным файлом...

P.S. Как видно из текста скрипта я определил еще не все стили (например пропущены 2, 10, 12, 13) и наверняка не все спецсимволы... они мне просто еще не попадались, на этот случай я оставил проверку на полноту замены... если кто обнаружит их раньше просьба сообщить в личку.

линк: http://www.sendspace.com/file/wjwk9r
--------
нормальные герои всегда идут в обход (c) :)

Creat0R 15-11-2006 00:25 511810

amel27
Файл не скачивается :( - т.е скачивается, но архиватор ругается на то что архив повреждён... может зальёшь на http://www.sendspace.com/ - и\или мне на мыло?

Sanja Alone 15-11-2006 01:48 511833

Отвечаю на повторяющийся по мылу вопрос. Итак, "Как же определить букву дисковода по маркерному файлу?"
  1. Способ "В лоб":
    Код:

    $TagFile="маркерный файл"
    $i = 67
    While FileExists( Chr($i) & ":\" & $TagFile )=0 AND $i<=90
        $i = $i + 1
    WEnd
    ;искомый дисковод (буква с двоеточием)
    $drive=$i & ":"

  2. Способ "В лоб, но с размышлением :)":
    Код:

    $TagFile="маркерный файл"
    ;на какого типа дисководах искать маркерный файл
    ;возможные варианты: "ALL", "CDROM", "REMOVABLE", "FIXED", "NETWORK", "RAMDISK", или "UNKNOWN"

    $type="CDROM"
    $drvlst=DriveGetDrive ( $type )
    If not @error Then
        For $i = 1 to $drvlst[0]
            If FileExists( $drvlst[$i] & "\" & $TagFile ) Then
                ;искомый дисковод (буква с двоеточием)
                $drive=$drvlst[$i]
                ExitLoop
            EndIf
        Next
    EndIf

Ес-но, это далеко не все возможные варианты. В зависимости от исходных данных, для решения подобной задачи, весьма полезными могут оказаться ф-ции DriveGetLabel, DriveGetFileSystem, DriveGetSerial, DriveGetType, DriveStatus.

Lodoss 16-11-2006 18:05 512798

2amel27
Цитата:

Зато теперь можно смело замахнуться на всю линейку NetApi32
(страница 44)
весь сыр бор был из-за GUI авторизации запуска от имени админа.

повторю задачу:
1.Требуется запустить какой либо setup.exe, если пользователь не админ - нарисовать GUI с полем имени и пароля для авторизации запуска (конечно можно воспользоваться стандартным запуском нажав shift но хочется реализовать задачу при помощи AutoIt)
2.В комбо боксе приводим список учёток обладающими правами для установки т. е. админов
3.При неправильном вводе пароля - выдать сообщение об ошибке НЕ закрыв GUI
повторю код

Код:

#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)
;что запускать
$what_to_run="setup.exe"
If IsAdmin() Then
        ;запуск программы
        Run($what_to_run)
Else
        ;если не админ, то "рисуем" GUI
        _GUI()
EndIf
Func _GUI()
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("solo11",  25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
;считываем введённые данные
$out1 = GUICtrlRead($in1)
$out2 = GUICtrlRead($in2)
Global $user = $out1, $pass = $out2
Select
        Case $msg = $ok
                ;инициализация запуска от имени админа
                RunAsSet($user, "", $pass)
                ;проверка верны ли введённые записи на право обладания правами админа
                if IsAdmin() Then
                        ;запуск программы
                        Run($what_to_run)
                        If @error Then
                                MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
                        EndIf
EndIf
                ;закрытие окна
        Case $msg = $cancel
                ExitLoop
    Case $msg = $GUI_EVENT_CLOSE
                ExitLoop
EndSelect
WEnd
EndFunc

третий пункт не выполняется :(
PS с оболочками только только начал разбираться, многое не понимаю. Помогите PLS

Creat0R 16-11-2006 19:57 512852

Lodoss
Цитата:

третий пункт не выполняется
Что значит не выполняется? не выводится сообщение?

Вот немного изменил - добавил проверку (отдельную) на проавильность ввода пароля (это при условии что пароль заранее известен):

Код:

#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)
;что запускать
$what_to_run="setup.exe"

If Not IsAdmin() Then
    ;запуск программы
    Run($what_to_run)
Else
    ;если не админ, то "рисуем" GUI
    _GUI()
EndIf

Func _GUI()
    GUICreate("Авторизация", 198, 125)
    ;фон окна
    GUISetBkColor (0x00E0FFFF)
    ;лейблы
    GUICtrlCreateLabel("Имя администратора", 25, 5)
    GUICtrlCreateLabel("Пароль администратора", 25, 50)
    ;запуск и отмена скрипта
    $ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
    $cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
    ;ввод имени
    $us = @UserName
    $in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
    GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
    GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
    ;ввод пароля
    $in2 = GUICtrlCreateInput ("solo11",  25, 70, 150, 20, 0x20)
    GUICtrlSetTip(-1,"введите пароль")
    GUISetState(@SW_SHOW)

    While 1
        $msg = GUIGetMsg()
        ;считываем введённые данные
        $out1 = GUICtrlRead($in1)
        $out2 = GUICtrlRead($in2)
        Global $user = $out1, $pass = $out2

                Select
            Case $msg = $ok
                ;инициализация запуска от имени админа
                RunAsSet($user, "", $pass)
                ;проверка верны ли введённые записи на право обладания правами админа
                If IsAdmin() Then
                    ;проверка правильноти пароля
                    If $pass <> "solo11" Then
                        MsgBox(16, "Ошибка", "Введен неправильный пароль"&@LF&@LF&"Попробуйте еще раз.",5)
                        ContinueLoop
                    EndIf
                    ;запуск программы
                    Run($what_to_run)
                    If @error Then
                        MsgBox(16, "Ошибка", "Отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
                        ContinueLoop
                    EndIf
                EndIf
            ;закрытие окна
            Case $msg = $cancel or $msg = $GUI_EVENT_CLOSE
            ExitLoop
        EndSelect
    WEnd
EndFunc


Creat0R 17-11-2006 00:20 512989

amel27
Класный скрипт, как видно в посте чуть выше, я его уже приминил :) - Я тут немного повазился, и немного автоматизировал этот процесс, так что вот, залил ;)



ПРИМЕЧАНИЕ: После завершения обработки, в первую и вторую строку самого скрипта, прописываются пути к файлу обработки (*.xml) и к выходному файлу (*.txt), и при повторном запуске скрипта, эти значения будут подставляться в соответствующие поля, так что эти строки лучше не трогать (для удобства).

Можно было бы ещё лучше автоматизировать этот процесс, если бы можно было автоматичкский экспортировать указанный скрипт в *.xml формат - может можно как то задать параметры для SciTE, чтобы там в тихом режиме указанный файл экспортировался в нужный формат? Тогда можно было бы сразу указывать скрипт (*.au3), и всё бы происходило автоматом - минимальное вмешательство юзера ;)

Lodoss 17-11-2006 06:17 513033

Цитата:

Вот немного изменил - добавил проверку (отдельную) на проавильность ввода пароля (это при условии что пароль заранее известен):
Ни учётка администратора ни его пароль НЕ ДОЛЖНЫ быть прописаны в скрипте.
Это я тут в комбо списке написал "Администратор,admin.....так не должно быть. решение КАК выдать список учёток обладающими правами админа есть от amel27 (осталось только разобраться как это привинтить к комбо списку пользователей %) ) а пароль должен ввести только админ.

Цитата:

Что значит не выполняется? не выводится сообщение?
итак снова
1.заходим под обычным пользователем в систему если вводим правильные данные (админа)- запускается сценарий run("setup.exe")....
2.если вводим неправильный пароль то выдаётся сообщение "ошибка" и предлагается ввести пароль заново

в существующем сценарии ошибка выдаётся даже если правильно ввёл пароль и файл setup.exe существует
либо вообще ничего не происходит по нажатии кнопки ОК

Creat0R 17-11-2006 09:34 513094

Lodoss
Вот рабочий (у меня) вариант (в нём уже включено помещение списка юзеров в combo) :

Код:

#include <Array.au3>
#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)

;Узнаём список пользователей
$admins = _AdminUsers()

Dim $AdminList
;Подготавливаем список пользователей для использования в combo
If IsArray($admins) Then
  For $i = 1 to $admins[0]
          Do
                  $AdminList = $admins[$i] & "|" & $AdminList
          Until $admins[$i] <> $admins[0]
  Next
EndIf

;что запускать
$what_to_run="setup.exe"

If IsAdmin() Then
  ;запуск программы
    Run($what_to_run)
Else
    ;если не админ, то "рисуем" GUI
    _GUI()
EndIf

Func _GUI()
    GUICreate("Авторизация", 198, 125)
    ;фон окна
    GUISetBkColor (0x00E0FFFF)
    ;лейблы
    GUICtrlCreateLabel("Имя администратора", 25, 5)
    GUICtrlCreateLabel("Пароль администратора", 25, 50)
    ;запуск и отмена скрипта
    $ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
    $cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
    ;ввод имени
    $us = @UserName
    $in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
    GUICtrlSetData($in1, $AdminList)
    GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
    ;ввод пароля
    $in2 = GUICtrlCreateInput ("",  25, 70, 150, 20, 0x20)
    GUICtrlSetTip(-1,"введите пароль")
    GUISetState(@SW_SHOW)

    While 1
        $msg = GUIGetMsg()
        ;считываем введённые данные
        $User = GUICtrlRead($in1)
        $Password = GUICtrlRead($in2)

                Select
                        Case $msg = $ok
                                ;Проверка был ли введён пароль вообще
                                If $Password = "" Then
                                        MsgBox(48, "Ошибка", "Не был введён пароль")
                                        ContinueLoop
                                EndIf
                               
                                ;инициализация запуска от имени админа
                                RunAsSet($User, "", $Password)
                                ;проверка верны ли введённые записи на право обладания правами админа
                                If IsAdmin() Then
                                        ;запуск программы
                                        Run($what_to_run)
                                       
                                        If @error Then
                                                MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
                                                ContinueLoop
                                        EndIf
                                        Exit
                                EndIf
            ;закрытие окна
            Case $msg = $cancel or $msg = $GUI_EVENT_CLOSE
                                ExitLoop
        EndSelect
    WEnd
EndFunc

; Возвращает массив со счетчиком - состав локальной группы "Администраторы"
Func _AdminUsers()
        Local $i, $res [1] = [0]
        ; читаем состав группы
        Local $members = _NetLocalGroupGetMembers (@ComputerName, 'Администраторы')
        ; проверка на ошибки
        If @error Then
                MsgBox (16, 'Ошибка выполнения', 'Код ошибки:' & @error)
                Exit
        EndIf
        If $members [0] >0 Then
                ; фильтруем только локальные учетные записи
                For $i=1 To $members [0]
                        If StringRegExp ($members [$i], '^' & @ComputerName & '\\') Then
                                ReDim $res [$res[0]+2]
                                $res [0] = $res [0]+1
                                $res [$res[0]] = StringRegExpReplace ($members [$i], '^' & @ComputerName & '\\', '')
                        EndIf
                Next
        EndIf
        Return $res
EndFunc

; Возвращает массив со счетчиком- состав локальной группы произвольного компьютера
Func _NetLocalGroupGetMembers($server, $group)
        Local $i, $string, $res [1] = [0], $pointer= DllStructCreate ("ptr")
        ; Выполняем запрос к базе SAM
        Local $ret = DllCall ("netapi32.dll", "int", "NetLocalGroupGetMembers", _
                "wstr", "\\" & StringRegExpReplace ($server, '^\\+', ''), _
                "wstr", $group, _
                "int", 3, _
                "ptr", DllStructGetPtr ($pointer), _
                "int", -1, _
                "int_ptr", 0, _
                "int_ptr", 0, _
                "int_ptr", 0 )
        ; Если произошла ошибка, то выход с кодом ошибки
        If $ret[0]>0 Then
                SetError ($ret)
                Exit
        EndIf
        ; Если есть результат, то обрабатываем каждый отдельно
        If $ret[6]>0 Then
                Local $buffer = DllStructCreate ("ptr[" & $ret[6] & "]", DllStructGetData ($pointer,1) )
                For $i=1 To $ret[6]
                        $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
                                "int", 0, _
                                "int", 0, _
                                "ptr", DllStructGetData ($buffer, 1, $i), _
                                "int", -1, _
                                "str", "", _
                                "int", 0, _
                                "int", 0, _
                                "int", 0 )
                        $string = DllStructCreate("char[" & $ret[0] & "]")
                        $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
                                "int", 0, _
                                "int", 0, _
                                "ptr", DllStructGetData ($buffer, 1, $i), _
                                "int", -1, _
                                "ptr", DllStructGetPtr ($string), _
                                "int", $ret[0], _
                                "int", 0, _
                                "int", 0 )
                        ReDim $res [$res[0]+2]
                        $res [0] = $res [0]+1
                        $res [$res[0]] = DllStructGetData ($string,1)
                Next
        EndIf
        ; Чистим временные системные структуры
        DllCall ("netapi32.dll", "int" ,"NetApiBufferFree", _
                "ptr" , DllStructGetData ($pointer,1) )
        Return $res
EndFunc


amel27 17-11-2006 11:28 513167

Цитата:

решение КАК выдать список учёток обладающими правами админа есть от amel27
существенно обновил функцию _NetLocalGroupGetMembers, теперь если группа не включает доменных учеток достаточно вызвать функцию с параметрами:

_NetLocalGroupGetMembers ("Администраторы", "", 0, 1)

...справедливости ради приведу еще один вариант функции через COM (взял с форума AutoIT):
Код:

Func _NetLocalGroup ($HOST, $LocalGroup)
    Global $Members[1]
    $Administrators = ObjGet("WinNT://" & $HOST & "/" & $LocalGroup)
    $MemberList=$Administrators.Members
    for $Account in $MemberList
        $FullName=StringUpper(StringRight($Account.Parent, StringLen($Account.Parent)-8))
        if (StringRight($FullName, StringLen($HOST)+1))=("/" & StringUpper($HOST)) then
            $FullName=$Account.Name
        else
            $FullName=$FullName & "\" & $Account.Name
        EndIf
        ReDim $Members[UBound($Members) + 1]
        $Members[UBound($Members) - 1]=$FullName
    next
    $Members[0]=UBound($Members)-1
    Return $Members
EndFunc

P.S. предупреждаю, что через COM работает намного медленней!

Creat0R 18-11-2006 05:29 513614

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

Код:

#include <File.au3>

_ReplaceTextInFiles(@ScriptDir & "\Test", "123", "321", "*.txt")

Func _ReplaceTextInFiles($Path, $OldText, $NewText, $Mask="*.*")
    $FileList = _FileListToArray($Path, $Mask)
    If IsArray($FileList) Then
        For $i = 1 to $FileList[0]
            _ReplaceStringInFile($Path & "\" & $FileList[$i], $OldText, $NewText)
        Next
    EndIf
EndFunc


Всё, нашёл свою ошибку :) - См. подчёркнуты текст в коде - Там было $NewText.

Craager 18-11-2006 14:22 513731

Sanja Alone, а можешь обновить свой скрипт для CuteFTP 8.0.3 с новым патчем (165 кб который)! Очень надо )))

Sanja Alone 18-11-2006 18:43 513816

Craager
Цитата:

можешь обновить свой скрипт
Скрипт работает и с этой версией и с упомянутым патчем. Нужно было просто попробовать произвести установку (и прочитать комментарии в "шапке" скрипта, по ум. патчем считается файл Crack.exe - это именно тот, 165Кб-товый).

Yozhegg 21-11-2006 17:21 515075

в AutoIt как лучше захватить системную дату? Есть ли вообще такая возможность (не прибегая к хитростным изворотам и изворотливым ухищрениям?)

в идеале интересует дата в опр. формате (напр. YYYYMMDD или MMDDYY), для дальнейшего использования в качестве переменной.

Michail77 21-11-2006 22:45 515203

Нужна помощь.
Вот скрипт.Автор его Creat0R за что ему ОГРОМНАЯ БЛАГОДАРНОСТЬ.
Нужно чтобы при отметке установки нескольких программ они запускались поочерёдно. Как это сделать?

Код:

#NoTrayIcon
#Include <GuiConstants.au3>
Opt("RunErrorsFatal", 0)

$Title = "Menu"

If WinExists($Title) Then Exit

GuiCreate($Title, 148, 300)

GUISetFont(13)
GUICtrlCreateLabel("Выбор комплектов",2, 5)

GUISetFont(9)
$Complect1 = GUICtrlCreateCheckbox("AcrReader 4.0.5", 35, 25)
$Complect2 = GUICtrlCreateCheckbox("Office 2003", 35, 50)
$Complect3 = GUICtrlCreateCheckbox("WinRar 3.61", 35, 75)
$Complect4 = GUICtrlCreateCheckbox("DIVX 5.11", 35, 100)
$Complect5 = GUICtrlCreateCheckbox("LightAlloy 4.0", 35, 125)
$Complect6 = GUICtrlCreateCheckbox("WINDVD 7", 35, 150)
$Complect7 = GUICtrlCreateCheckbox("WinAmp 5.08", 35, 175)
$Complect8 = GUICtrlCreateCheckbox("Nero 6.6.0.8", 35, 200)
$Complect9 = GUICtrlCreateCheckbox("DrWeb 4.33", 35, 225)
$Complect10 = GUICtrlCreateCheckbox("Kav 5.338", 35, 250)

$Next = GUICtrlCreateButton("Next>>", 0, 276, 50)
$Cancel = GUICtrlCreateButton("Cancel", 99, 276, 50)

GUISetState()

While 1
$Msg = GUIGetMsg()

Select
 
  Case $Msg = $Gui_Event_Close or $Msg = $Cancel
    Exit

  Case $Msg = $Next
        If GUICtrlRead($Complect1) <> 1 and GUICtrlRead($Complect2) <> 1 and GUICtrlRead($Complect3) <> 1 and GUICtrlRead($Complect4) <> 1 and GUICtrlRead($Complect5) <> 1 and GUICtrlRead($Complect6) <> 1 and GUICtrlRead($Complect7) <> 1 and GUICtrlRead($Complect8) <> 1 and GUICtrlRead($Complect9) <> 1 and GUICtrlRead($Complect10) <> 1 Then
                GUISetState(@SW_DISABLE)
                MsgBox(262144+48, "Attention", "Выберите как минимум одну птичку ;-)")
                GUISetState(@SW_ENABLE)
                WinActivate($Title, "")
                ContinueLoop
        EndIf

    If GUICtrlRead($Complect1) = $Gui_Checked Then
                Run ("AcrReader\Acrobat.exe")
                If @error Then
                  MsgBox(48, "error", "Не могу запустить <Acrobat.exe>")
                  ContinueLoop
                EndIf
  ;Тут должна выполняться установка комплекта № 1
    EndIf
   
    If GUICtrlRead($Complect2) = $Gui_Checked Then
                Run ("Office\AutoOffice.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <AutoOffice.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 2
    EndIf
   
    If GUICtrlRead($Complect3) = $Gui_Checked Then
                Run ("WinRar\Autowinrar.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <AutoWinRar.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 3
    EndIf

    If GUICtrlRead($Complect4) = $Gui_Checked Then
                Run ("DIVX\DivX511.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <DivX.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 4
    EndIf

    If GUICtrlRead($Complect5) = $Gui_Checked Then
                Run ("LightAlloy\LA.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <LA.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 5
    EndIf

    If GUICtrlRead($Complect6) = $Gui_Checked Then
                Run ("WINDVD\AutoWINDVD7.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <AutoWinDVD.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 6
    EndIf

    If GUICtrlRead($Complect7) = $Gui_Checked Then
                Run ("WinAmp\AutoWinAmp.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <AutoWinAmp.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 7
    EndIf

    If GUICtrlRead($Complect8) = $Gui_Checked Then
                Run ("Nero\Nero6608a.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <Nero.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 8
    EndIf

    If GUICtrlRead($Complect9) = $Gui_Checked Then
                Run ("DrWebAut\AutoDrWeb.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <AutoDrWeb.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 9
    EndIf

    If GUICtrlRead($Complect10) = $Gui_Checked Then
                Run ("kav\AutoKav.exe")
                If @error Then
                        MsgBox(48, "error", "Не могу запустить <AutoKav.exe>")
                        ContinueLoop
                EndIf
        ;Тут должна выполняться установка комплекта № 10
    EndIf

        GUISetState(@SW_HIDE)

ExitLoop

EndSelect

Wend


Sanja Alone 22-11-2006 00:21 515244

Yozhegg
Цитата:

дата в опр. формате (напр. YYYYMMDD или MMDDYY)
Просто возьми макросы даты/времени и поставь в нужной тебе последовательности:
Код:

@SEC        - Значение секунд на часах. От 00 до 59
@MIN        - Значение минут на часах. От 00 до 59
@HOUR        - Значение часов на часах в 24-часовом формате. От 00 до 23
@MDAY        - Текущий день месяца. От 01 до 31
@MON        - Текущий месяц. От 01 до 12
@YEAR        - Текущий год в четырехзначном формате
@WDAY        - День недели в числовом представлении. От 1 до 7 - от воскресенья до субботы
@YDAY        - Текущий день года. От 1 до 366 (или 365 для невисокосного года)

Вот тебе пример - дата в виде YYYYMMDD:
Код:

MsgBox (0,"Текущая дата",@YEAR & @MON & @MDAY)

Yozhegg 22-11-2006 16:14 515543

To Sanja Alone: Благодарю за ответ. Спустя 24 часа оценил некоторую поспешность вопроса. Покопавшись в хелпе нашёл эти макросы, но меня смущало отсутствие
возможности форматирования.. мне нужно было (ГГММДД)...

Код:

Global $y = @YEAR
Global $mon = @MON
Global $mday = @MDAY 
Global $e_year = @YEAR - 2000 
Global $_Total = (0 & $e_year & $mon & $mday )

- коряво, но в моём случае работает.

Yozhegg 22-11-2006 16:30 515550

А как в AutoIt снять показание с RadioButton(OptionButton)?

Ischecked -это параметр, или макрос, которым можно проверить отмечена радиокнопка 1 или радиокнопка 2?

Sanja Alone 22-11-2006 23:54 515690

Yozhegg
Цитата:

смущало отсутствие возможности форматирования
См. в сторону ф-ции StringFormat ( "format control", var1 [, ... var32] ).

Цитата:

как в AutoIt снять показание с RadioButton
Код:

If BitAnd(GUICtrlRead($Radio_1),$GUI_CHECKED) Then
        msgbox(0,"","Отмечена кнопка 1")
Else
        msgbox(0,"","Кнопка 1 НЕ отмечена")
EndIf

Цитата:

Ischecked -это параметр, или макрос
Это переменная, описывающая состояние н-рого эл-та управления.

Creat0R 24-11-2006 11:39 516357

Michail77
Цитата:

чтобы при отметке установки нескольких программ они запускались поочерёдно. Как это сделать?
Очень просто :) ... нужно вместо Run (запуска приложения), прописать RunWait (Запуск приложения с ожиданием его завершения). Т.е просто везде где у тебя в скрипте есть Run(....) Замени на RunWait(...).

И ещё, если установка того или иного приложения, “запускает” внешние модули\приложения, то нужно определить какие именно, т.е какие процессы, или окна появляются, и в соответствии с этим делать проверку на окончание процесса установки. Если же всё обходится (заканчивается) одним процессом (не запуская внешние\дополнительные процессы\окна), то досаточно того метода который я упомянул чуть выше.

----------------------
2 ALL

Есть такая проблема - Я хочу сделать проверку на нажатие определённой клавиши, кнопки мышки, или любого другого действия со стороны пользователя. Известно что есть функция _IsPressed - Но она проверяет каждый раз ввод\нажатие одной клавиши\кнопки, а мне нужно чтобы проверялось любое вхождение при одной (или даже нескольких) проверке... я сделал это для нескольких вхождении, но предусмотреть все, мне не удалось...

Код:

For $i = 01 to 91
    If _IsPressed($i, $dll) Then
        ........
    EndIf
Next

Хотелось чтобы были предусмотрены все нажатия на клавиатуре и на мышке, но, кроме одного - SHIFT (с обоих сторон).

----------------------
P.S

Переделал полностью (кроме самой главной функции от amel27) скрипт для перекодировки скриптов в целях помещения их в форуме (в разукрашенном виде :) )... получилось полностью автоматизировать весь процессс - теперь не нужно самому экспортировать скрипт au3 в xml формат, это сделает автоматический сам скрипт, нужно всего лишь указать файл скрипта (*.au3), и в процессе (до процесса) обработки, он будет экспортирован в xml формат - Для этого редактор SciTE должен быть в дефолтной папке AutoIt'а, т.е путь берётся относительно @AutoItExe:
Код:

$SciTEPath = StringTrimRight(FileGetShortName(@AutoItExe), StringLen(StringRegExpReplace(@AutoItExe, "^.*\\", ""))) & "SciTE\SciTE.exe"
Также вместо того, чтобы открывать файл с результатом, результат выводится в гуи (в Edit поле), а также есть возможность очистить результат (не закрывая гуи), и выбрать другой скрипт для обработки... имхо, получилось довольно оригинально!

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

Скачать архив со скриптом можно тут

Michail77 24-11-2006 20:51 516605

2 Creat0R
БИГ СЕНКС.
И ещё вопросик.как запустить на установку файл *msi. речь идёт про касперского антивирус 6.0.300
с 5х проблем не было. run-ом всё нормально ставилось а тут....

Sanja Alone 25-11-2006 00:13 516703

Michail77
Цитата:

как запустить на установку файл *msi
В начале темы это уже обсуждалось - посты #79, #80, #82, #89, #90. Если запуск будет производиться в тихом режиме, то нужно исп-ть RunWait вместо Run.

P.S. Не забываем юзать поиск по теме...

Michail77 26-11-2006 12:41 517111

2 Creat0R
Спасибо.
Приведи пожалуйста пример с “запускает” внешние модули\приложения...

2 Sanja Alone
Спасибо,помогло.

Creat0R 27-11-2006 16:30 517546

Michail77
Цитата:

пример с “запускает” внешние модули\приложения...
Просто имел в виду, что нужно убедиться, что запущенный тобой процесс (екзешник к примеру), не запускает другие процессы. Т.е например, ты запускаешь Setup.exe, запустил допустим так - RunWait("Setup.exe", "", @SW_HIDE), но этот установщик построен так, что на каком то этапе, он запускает какой то внутренний его процесс (заранее распоковав файлы во временный каталог), а сам закрывается, и тогда скрипт будет “считать” что запущены им процесс окончен, и не будет “ждать”, ведь ему не известно что запустился другой процесс... поэтому желательно проверить так ли это (просто запусти нужный установщик, и смотри в менеджере процессов какие дополнительные процессы запускаются), и если да, то нужно соответственно прописать определение в скрипте...

Код:

RunWait("Setup.exe", "", @SW_HIDE) ;Запуск главного установщика
ProcessWait("Имя_допол._процесса", 120) ;Ожидание дополнительного процесса (120 секунд) - это если мы определили что он запускается
If ProcessExists("Имя_допол._процесса") Then ProcessWaitClose("Имя_допол._процесса") ;Если процесс запустился, то ждём его окончания (закрытия)


Sanja Alone 27-11-2006 21:47 517662

Michail77
Creat0R
Цитата:

запускает другие процессы
В тему - посмотрите, как пришлось извратиться в скрипте установки Photoshop CS2 по причине подобных выкрутасов.

Michail77 28-11-2006 11:03 517895

Вопрос.Можно ли сделать так чтобы в Msgbox была фоновая картинка,т.е есть примитивный код:
Msgbox (0, ".........................." &@CRLF& "............................." и т.д
Нужно чтобы была фоновая картинка а поверх неё писался бы текст как в обычом Msgbox-е
Как это сделать?

И ещё такой вопрос.Как запустить *.bat? Сделал компактный Office 2003. занимает 105мб места.
Если пишу так Run(RunWait) ("office/setup.bat") то появляется и сразу исчезает окно Dos-эмулятора.
Как сделать правильно чтобы всё работало?
Заранее спасибо.

Creat0R 28-11-2006 12:46 517938

Michail77
Цитата:

Можно ли сделать так чтобы в Msgbox была фоновая картинка
Не думаю что это возможно... для таких задачь есть гуи, в котором довольно просто можно построить тот же MsgBox, и гараздо функциональнее.

Цитата:

Как запустить *.bat?
Как обычное приложение...

Цитата:

Если пишу так Run(RunWait) ("office/setup.bat") то появляется и сразу исчезает окно Dos-эмулятора
Попробуй писать полный путь, и\или изменить рабочий каталог (FileChangeDir("Папка_батника")), ну или писать рабочий каталог во втором параметре команды Run ("Setup.bat", "путь_к_папке_батника").

Я обычно запускаю батник (хотя стараюсь выполнять его функции в самом скрипте) таким образом:

Код:

RunWait(@ScriptDir & "\Batnik.bat", "", @SW_HIDE)
Или можно просто выполнить нужные команды сразу используя переменную ком. строки (cmd.exe)...

Код:

Run(@ComSpec & " /c start .....", "", @SW_HIDE)
------------------------

По поводу MsgBox'ов (и не только), у меня тоже есть один вопрос...

-Возможно ли привязать MsgBox, или любое из окон вызываемое для выбора/сохранения файла/папки (FileSelectFolder к примеру), к окну гуи? т.е чтобы при вызове одного их этих окон, оно было уже как бы дочерним окном гуи, и чтобы не было доступа к родительскому окну (гуи) до тех пор пока не закроется это-дочернее окно. Знаю что для обычных, гуивских дочерних окон, можно прописать как последний параметр переменную определяющую относительность к родительскому гуи, и также нужно неитрализовать родительский гуи макросом @SW_DISABLE, но как такое же сделать с окнами вызыванными по FileSelectFolder, FileOpenDialog, FileSaveDialog или даже тот же MsgBox? для этих окон вроде нет такого параметра, который определял бы их относительность к гуи.

Dentel 30-11-2006 15:26 518971

Всем добрый день!

Господа, вопрос, возможно, глупый, но может ли скрипт написаный с помощью AutoIt работать на компьютере к которому не подключен монитор?

qeraser 30-11-2006 16:14 518981

Dentel
Будет.

Dentel 30-11-2006 16:42 518996

qeraser

Не работает. У меня есть сервер, к которому не подключен монитор. На сервере установлена WinXP. Захожу на этот сервер с помощью "Подключение к удаленному рабочему столу" через локальную сеть. На сервере вылажен скрипт. Если "подключение" активно, то скрипт работает и делает то, что надо. Если "подключение" закрыто, скрипт глохнет в самом начале, а именно: началом работы скрипта является запуск программы (вылезает окно авторизации), далее с помощью WinWaitActive определяем, что это окно активно и дальше понеслась (ввод пароля, логина ну т.д. и т.п.). В случае если "подключение" не активно, то скрипт "не видит" это окно авторизации и оно просто висит и ничего не происходит.

amel27 01-12-2006 05:17 519185

Creat0R
А чем не устраивает простое отключение/включение родительского окна?
Код:

#include <GUIConstants.au3>

GUICreate("My GUI")

Opt("GUICoordMode",2)
$Button_1 = GUICtrlCreateButton ("Open File",  10, 30, 100)
GUISetState ()

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $Button_1
            WinSetState ("My GUI", "", @SW_DISABLE)
            $a = FileOpenDialog ( "FileOpenDialog", "c:\", "All (*.*)")

            WinSetState ("My GUI", "", @SW_ENABLE)
            WinActivate ("My GUI")
    EndSelect
Wend


Creat0R 01-12-2006 09:06 519227

amel27
Цитата:

чем не устраивает простое отключение/включение родительского окна?
Ну например, в панели задачь появляется дополнительная вкладка :) , или если сделать поверх всех окон гуи, то вызываемое окно буде за ним... можно конечно выкрутится функцией WinSetOnTop, но это, имхо, не удобно...
В идеале, хочется чтобы можно было вызвать окно сохранения (к примеру), и нажимая на окно гуи, чтобы вызванное окно мигало, точно также как это происходит если вызвать дочернее окно гуи... вот пример:

Код:

#include <GUIConstants.au3>

$ParentWin = GUICreate("Parent GUI", 250, 250)
$Button = GUICtrlCreateButton("Child", 20, 50)

GUISetState()

$ChildWin = GUICreate("Child GUI", 200, 200, -1, -1, -1, -1, $ParentWin)

While 1
    $msg1 = GUIGetMsg()

        Select
        Case $msg1 = $GUI_EVENT_CLOSE
            Exit
        Case $msg1 = $Button
            GUISetState(@SW_DISABLE, $ParentWin)
            GUISetState(@SW_SHOW, $ChildWin)
            While 1
                $msg2 = GUIGetMsg()
                Select
                    Case $msg2 = $GUI_EVENT_CLOSE
                        GUISetState(@SW_RESTORE, $ParentWin)
                        GUISetState(@SW_ENABLE, $ParentWin)
                        GUISetState(@SW_HIDE, $ChildWin)
                        ExitLoop
                EndSelect
            Wend
    EndSelect
WEnd

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

P.S
Вместо WinSetState лучше GuiSetState, и порядок таких объявлении очень важен... если именно для дочернего гуи, то так как я привёл в посте (@SW_HIDE в конце), это идеальный способ (таким образом не мигает окно родительского гуи в момент его активации).
И ещё, вместо WinActivate("Title") лучше WinSetState("Title", "", @SW_RESTORE), это если для гуи, оно быстрее срабатывает.

P.S.S.
А ты не знаешь случам как решить задачку про проверку на нажатие определённой клавиши, кнопки мышки, или любого другого действия со стороны пользователя? (Которую я тоже привёл в посте со скриптом для разукрашивания).

amel27 01-12-2006 09:43 519241

Dentel
Цитата:

У меня есть сервер, к которому не подключен монитор. На сервере установлена WinXP. Захожу на этот сервер с помощью "Подключение к удаленному рабочему столу" через локальную сеть. На сервере вылажен скрипт. Если "подключение" активно, то скрипт работает и делает то, что надо. Если "подключение" закрыто, скрипт глохнет
При отключении рабочий стол блокируется, для нормальной работы его нужно разблокировать удаленно или с локальной консоли... Поэтому связка AutoLogon+VNC удобней для администрирования серверов нежели RDP. ИМХО.

amel27 02-12-2006 10:23 519711

Creat0R
Цитата:

В идеале, хочется чтобы можно было вызвать окно сохранения (к примеру), и нажимая на окно гуи, чтобы вызванное окно мигало, точно также как это происходит если вызвать дочернее окно гуи
Можно самому написать аналогичные функции, пример:
Код:

#include <GUIConstants.au3>
#include <Constants.au3>

$GUIParent = GUICreate("My GUI", 290, 70)

Opt("GUICoordMode",2)
$Button_1 = GUICtrlCreateButton ("Message Box",  30, 25, 100)
$Button_2 = GUICtrlCreateButton ("File Open",  30, -1)
GUISetState ()

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $Button_1
            _MsgBox ($GUIParent, "Сообщение", "Текст сообщения", $MB_OK + $MB_ICONASTERISK)
        Case $msg = $Button_2
            $file = _FileOpenDialog ($GUIParent, "Выбор файла", "C:\WINDOWS", "Документы (*.DOC)|Все (*.*)")
            _MsgBox ($GUIParent, "Сообщение", "Выбран файл: " & $file, $MB_OK + $MB_ICONASTERISK)
    EndSelect
Wend

Func _MsgBox ($mainGUI, $MsgBoxTitle, $MsgBoxText, $MsgBoxType)
    $ret = DllCall ("user32.dll", "int", "MessageBox", _
            "hwnd", $mainGUI, _
            "str", $MsgBoxText , _
            "str", $MsgBoxTitle, _
            "int", $MsgBoxType)
    Return $ret [0]
EndFunc

Func _FileOpenDialog ($mainGUI, $sTitle, $sInitDir, $sFilter = 'All (*.*)')
    Local $aFilter = StringSplit ( $sFilter, '|')
    Local $aCSTR [$aFilter [0] *2+1]
    Local $i, $iStart, $iFinal, $sCStruct = '', $sWStruct = ''
    $aCSTR [0] = $aFilter [0] *2
    For $i=1 To $aFilter [0]
        $iStart = StringInStr ($aFilter [$i], '(', 0, 1)
        $iFinal = StringInStr ($aFilter [$i], ')', 0,-1)
        $aCSTR [$i*2-1] = StringStripWS (StringLeft ($aFilter [$i], $iStart-1), 3)
        $aCSTR [$i*2] = StringStripWS (StringTrimRight (StringTrimLeft ($aFilter [$i], $iStart), StringLen ($aFilter [$i]) -$iFinal+1), 3)
        $sCStruct = $sCStruct & 'byte[' & StringLen ($aCSTR [$i*2-1])+1 & '];byte[' & StringLen ($aCSTR [$i*2])+1 & '];'
        $sWStruct = $sWStruct & 'byte[' & StringLen ($aCSTR [$i*2-1])*2+2 & '];byte[' & StringLen ($aCSTR [$i*2])*2+2 & '];'
    Next
    Local $uCSTR = DllStructCreate ($sCStruct & 'byte[1]')
    Local $uWSTR = DllStructCreate ($sWStruct & 'byte[2]')
    For $i=1 To $aCSTR [0]
        DllStructSetData ($uCSTR, $i, $aCSTR [$i])
    Next
    $ret = DllCall ("kernel32.dll", "int", "MultiByteToWideChar", _
        "int", 0, _
        "int", 0, _
        "ptr", DllStructGetPtr ($uCSTR), _
        "int", DllStructGetSize ($uCSTR), _
        "ptr", DllStructGetPtr ($uWSTR), _
        "int", DllStructGetSize ($uWSTR) )
    $ret = DllCall("Shell32.dll", "int", 'GetFileNameFromBrowse', _
            'hwnd', $mainGUI, _
            'wstr', '', _
            'int', 255, _
            'wstr', $sInitDir, _
            'wstr', '', _
            'ptr', DllStructGetPtr ($uWSTR), _
            'wstr', $sTitle )
    Return $ret [2]
EndFunc


amel27 02-12-2006 11:00 519721

Creat0R
Цитата:

А ты не знаешь случам как решить задачку про проверку на нажатие определённой клавиши, кнопки мышки, или любого другого действия со стороны пользователя? (Которую я тоже привёл в посте со скриптом для разукрашивания).
- AutoIT не годится для программ типа "клавиатурных шпионов" - такие программы работают на уровне ядра, а не в пользовательском режиме;
- нет надежных средств для снятия состояния клавиатуры, пользовательские программы работают с виртуальной, а не реальной клавиатурой;
- существуют API-функции, позволяющие снимать состояние всех клавиш виртуальной клавиатуры за один вызов, т.е. возможно отслеживать все действия пользователя, но пока активно окно приложения.


Время: 20:13.

Время: 20:13.
© OSzone.net 2001-