Что нового

Как поделиться скриптом автоматизации окон

le1to

Новичок
Сообщения
14
Репутация
0
Версия AutoIt: 3.3.3.12.0

Описание:
Существует скрипт, которым пользуюсь на работе, запускает окошко с кнопками для запуска рабочих прог или разворачивает при их наличии. Если появляется окно входа, то через send вводятся логин и пароль. Таких прог немало, да и логины с паролями разные почти везде, к тому же "конфиденциальны".
Идея такая - у юзера установлен autoit, далее он запусает скрипт, появляется GUICreate, в нем что-то вроде окошек для ввода с заголовком, например:
Введите логин и пароль от "Программа1" (2 отдельных строки)
Введите логин и пароль от "Программа2" (тжсамое)
В окне будет кнопка, при нажатии которой, подставит введенные значения в скрипт, который выложил, и сохранит его (если ещё и скомпилирует, то вообще супер).

Код:
#include <GuiConstantsEx.au3>

GUICreate ("", 130, 35)
GUISetState(@SW_SHOW)
$iBtn = GUICtrlCreateButton ("Start", 0, 0, 130, 35)

Local $iMsg
While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case $iBtn
            If WinExists ("Программа1") Then
			   WinActivate ("Программа1")
			Else
			   Run ("\\Уляля\опачки.exe", "\\Уляля\")
			   EndIf

        Case $GUI_EVENT_CLOSE
		   ExitLoop
		EndSwitch

		If WinExists ("Вход в эту самую программу1") Then
		   WinActivate ("Вход в эту самую программу1")
		   Send ("LOGIN{TAB}PASSWORD{Enter}")
		   EndIf
WEnd

Примечания: Я в autoit новичок, если можно, то с комментами, где считаете необходимым.
 
Автор
L

le1to

Новичок
Сообщения
14
Репутация
0
Есть некоторые идеи, пока решил готовый скрипт просто выводить в GUICtrlCreateEdit только не могу понять, можно ли в него через GUICtrlSetData вставить скрипт, проблема в том, что он состоит из нескольких строк. Enter?
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
le1to
К чему такие сложности? У вас есть скрипт. Сделайте его копию, удалите свои логины-пароли и отдайте другому. Другой введёт в нужных местах свои данные - и всё. Скрипты можно редактировать в любом текстовом редакторе - хоть в блокноте, хоть в WordPad'е.
 
Автор
L

le1to

Новичок
Сообщения
14
Репутация
0
Хотелось бы сделать максимально просто для других людей, autoit все таки.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
le1to [?]
решил готовый скрипт просто выводить в GUICtrlCreateEdit
И чем это будет отличаться от блокнота?


Добавлено:
Сообщение автоматически объединено:

Если у вас логины-пароли разбросаны по всему скрипту и подставляются напрямую в Send(), то можно их все вынести в начало в виде переменных, а в Send() подставлять соответствующую переменную
Код:
; логины и пароли вводить между кавычками

; введите логин для программы 1
$Program1_Login = ""
; введите пароль для программы 1
$Program1_Password = ""

; введите логин для программы 2
$Program2_Login = ""
; введите пароль для программы 2
$Program2_Password = ""

; введите логин для программы 3
$Program3_Login = ""
; введите пароль для программы 3
$Program3_Password = ""
; и т.д.

; здесь идёт скрипт
; ...
; и где-то в дебрях скрипта
Send($Program1_Login)
Send($Program1_Password)
; ...
Send($Program2_Login)
Send($Program2_Password)
; ...
Send($Program3_Login)
Send($Program3_Password)
; ...
Думаю, такой скрипт любой бухгалтер в состоянии отредактировать.
 
Автор
L

le1to

Новичок
Сообщения
14
Репутация
0
Ну ещё хотелось бы чтоб красиво было, решил так, будут появляться InputBox'ы, в которые вводятся логины/пароли, потом появляется GUICtrlCreateEdit со скриптом и подставленными значениями, откуда можно его скопировать. Может все таки есть способ через GUICtrlSetData подставить целый скрипт, а не одну строку?
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
le1to [?]
через GUICtrlSetData подставить целый скрипт
Код:
GUICreate("")
$edit = GUICtrlCreateEdit("", 5, 5, 390, 390)
GUISetState()

$text = FileRead(@ScriptFullPath)
GUICtrlSetData($edit, $text)

Do
Until GUIGetMsg() = -3


Добавлено:
Сообщение автоматически объединено:

Такой вариант
Код:
; путь к скрипту
$ScriptPath = @ScriptDir & "\test.au3"
; массив названий программ
Global $ProgNames[] = ["Программа 1","Программа 2","Программа 3","Программа 4","Программа 5"]
; массив логинов-паролей
Global $Data[UBound($ProgNames)][2]
; счётчик
Global $Counter = 0

; создание окна
$GUI = GUICreate("Ввод данных", 210, 130)
$LblInfo = GUICtrlCreateLabel("", 5, 5, 200, 20)
$LblLogin = GUICtrlCreateLabel("Логин: ", 5, 30, 50, 20)
$InpLogin = GUICtrlCreateInput("", 55, 30, 150, 20)
$LblPassword = GUICtrlCreateLabel("Пароль: ", 5, 55, 50, 20)
$InpPassword = GUICtrlCreateInput("", 55, 55, 150, 20)
$BtnNext = GUICtrlCreateButton("Далее", 120, 90, 85, 30)
GUISetState()
; ввод начальных данных
GUICtrlSetData($LblInfo, "Введите данные для " & $ProgNames[0])

Do
  Switch GUIGetMsg()
    Case -3 ; выход
      Exit
    Case $BtnNext ; нажатие "Далее"
      ; получаем данные, заполняем массив
      $Data[$Counter][0] = GUICtrlRead($InpLogin)
      $Data[$Counter][1] = GUICtrlRead($InpPassword)
      ; увеличиваем счётчик
      $Counter += 1
      ; проверяем количество обработанных программ
      If $Counter = UBound($ProgNames) Then
        ; вызываем функцию изменения скрипта
        ChangeScript()
        Exit
      EndIf
      ; обновляем данные окна
      GUICtrlSetData($LblInfo, "Введите данные для " & $ProgNames[$Counter])
      GUICtrlSetData($InpLogin, "")
      GUICtrlSetData($InpPassword, "")
      ControlFocus($GUI, "", $InpLogin)
  EndSwitch
Until 0

Func ChangeScript()
  ; читаем скрипт
  Local $Text = FileRead($ScriptPath)
  If @error Then
    MsgBox(0, "Ошибка", "Ошибка чтения скрипта")
    Exit
  EndIf
  ; здесь работаем с переменной $Text, содержащей текст скрипта,
  ; и подменяем логины-пароли, используя массив $Data
  ; ...

  ; этот цикл для теста
  For $i = 0 To UBound($Data) - 1
    $Text &= $Data[$i][0] & ":" & $Data[$i][1] & @CRLF
  Next

  ; сохраняем скрипт
  Local $File = FileOpen($ScriptPath, 2)
  FileWrite($File, $Text)
  FileClose($File)
EndFunc
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
InnI сказал(а):
Код:
$text = FileRead(@ScriptFullPath)
Проверить бы ещё на
Код:
If @Compiled then





Добавлено:
Сообщение автоматически объединено:

le1to
А почему бы вам не хранить логины с паролями в ini файле?
 
Автор
L

le1to

Новичок
Сообщения
14
Репутация
0
Такой вариант
Код:
; путь к скрипту
$ScriptPath = @ScriptDir & "\test.au3"
; массив названий программ
Global $ProgNames[] = ["Программа 1","Программа 2","Программа 3","Программа 4","Программа 5"]
; массив логинов-паролей
Global $Data[UBound($ProgNames)][2]
; счётчик
Global $Counter = 0

; создание окна
$GUI = GUICreate("Ввод данных", 210, 130)
$LblInfo = GUICtrlCreateLabel("", 5, 5, 200, 20)
$LblLogin = GUICtrlCreateLabel("Логин: ", 5, 30, 50, 20)
$InpLogin = GUICtrlCreateInput("", 55, 30, 150, 20)
$LblPassword = GUICtrlCreateLabel("Пароль: ", 5, 55, 50, 20)
$InpPassword = GUICtrlCreateInput("", 55, 55, 150, 20)
$BtnNext = GUICtrlCreateButton("Далее", 120, 90, 85, 30)
GUISetState()
; ввод начальных данных
GUICtrlSetData($LblInfo, "Введите данные для " & $ProgNames[0])

Do
  Switch GUIGetMsg()
    Case -3 ; выход
      Exit
    Case $BtnNext ; нажатие "Далее"
      ; получаем данные, заполняем массив
      $Data[$Counter][0] = GUICtrlRead($InpLogin)
      $Data[$Counter][1] = GUICtrlRead($InpPassword)
      ; увеличиваем счётчик
      $Counter += 1
      ; проверяем количество обработанных программ
      If $Counter = UBound($ProgNames) Then
        ; вызываем функцию изменения скрипта
        ChangeScript()
        Exit
      EndIf
      ; обновляем данные окна
      GUICtrlSetData($LblInfo, "Введите данные для " & $ProgNames[$Counter])
      GUICtrlSetData($InpLogin, "")
      GUICtrlSetData($InpPassword, "")
      ControlFocus($GUI, "", $InpLogin)
  EndSwitch
Until 0

Func ChangeScript()
  ; читаем скрипт
  Local $Text = FileRead($ScriptPath)
  If @error Then
    MsgBox(0, "Ошибка", "Ошибка чтения скрипта")
    Exit
  EndIf
  ; здесь работаем с переменной $Text, содержащей текст скрипта,
  ; и подменяем логины-пароли, используя массив $Data
  ; ...

  ; этот цикл для теста
  For $i = 0 To UBound($Data) - 1
    $Text &= $Data[$i][0] & ":" & $Data[$i][1] & @CRLF
Next

  ; сохраняем скрипт
  Local $File = FileOpen($ScriptPath, 2)
  FileWrite($File, $Text)
  FileClose($File)
EndFunc

Спасибо, очень помогло! Появился ещё вопрос, полностью объяснять не буду, но у меня получилось так, что скрипт сначала использует, потом в итоге записывается в пустой .au3, который должен быть создан заранее. Можно ли сделать, чтобы скрипт создавал некий пустой файл .au3?

Подумал, если нет такой возможности, как вариант, могу на работе выложить на шару пустой .au3, а скрипт будет - If FileExists Then FileDelete, FileCopy. Это все потому, что если скрипт запускать больше одного раза, в этом .au3 создаются копии.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
le1to [?]
чтобы скрипт создавал некий пустой файл
Код:
Local $File = FileOpen($ScriptPath, 2)
В моём примере файл скрипта перезаписывается. Если вам нужно сохранить изменения в другой файл, то замените в этой строке $ScriptPath на свой путь к файлу. Если этот ваш файл не существует, он будет создан автоматически. Т.е. создавать отдельно пустой файл для записи нет необходимости.
 
Верх