Что нового

Цикл чтения из файла txt построчно и заполнение полей стороннего окна c условием

Absolutelight

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

Описание:

Привет, уважаемые форумчане. Нужна ваша помощь.
Нужно, чтобы скрипт читал текстовый файл reader.txt и вписывал данные в диалоговое окно приложения autotelnet.exe (приложил). Есть исходник autotelnet на vb.net (по запросу). Так же приложил пример файл откуда читать - reader.txt
На vb.net я так и не понял как использовать правильно библиотеку user23.dll для работы с хендалами и классами полей в консольном приложении. Как их ловить и вписывать значения... Решил запускать скрипт отдельно на AutoIt.
Вот описание программы для autoit:



Цикл:

1. Чтение из reader.txt построчно (массив?), создание двух токенов.
- Токен (0) = ip компьютера
- Токен (1) = номер компьютера

2. Запуск стороннего приложения (целевое окно) autotelnet.exe .

3. Определелить:

-Hendle окна с помощью window info
-Class поля(0)
-instance(0)
-Class поля(1)
-instance(1)



-заполнить поле(0) = Токен(0)
-заполнить поле(1) = send "q"
send "copy command-output 'show tech all' tftp Токен(0) ""SWITCH" + Токен(1) + ".txt"" "
-нажать ctrl+r (пуск)
-ожидание вывода сообщения в control id 1052122 окна: "Execution script completed"

3. Если строки кончились, то завершить.

Далее повтор цикла.

Вопрос, как правильно оформить while вместе с построением массива данных и передать 2 токена в окно autotelnet из этого массива ?
Вот код autoit:

Код:
#include <file.au3>
#include <Array.au3>

local $localip = FileRead("localip.txt", 1)
; 'тут эксперементировал с ini
; 'local $getip = IniRead( $file,"1 code","ip","default" )
; 'local $getname = IniRead( $file,"1 code","value1", "default" )
local $telcode = ("q")
local $telcode2 = ("command-output 'show tech all' tftp")
local $telcode3 = ("SWITCH")
local $telcode4 = (".txt")


; вопрос как читать построчно и передавать в окно autotelnet.  Записал ниже просто строки, которые помогут наверняка составить правильный код.

Global $records
If Not _FileReadToArray(@ScriptDir&'\reader.txt', $records) Then
   MsgBox(4096,"Ошибка", "Невозможно прочитать массив" & @error)
   Exit
EndIf


While True
    
    ; здесь нужно сделать массив, но не хватает опыта сделать правильно чтения файла и подставлять переменные в цикл.
    ; For $i = 1 to $token0[0] , $token1(1)
    

    $telnet = WinWait ("AutoTelnet 1.3.0 - Telnet automation tool", "", 1)
      if not ($telnet = 0) then
	  WinActivate ("AutoTelnet 1.3.0 - Telnet automation tool")
	  ControlSetText("AutoTelnet 1.3.0 - Telnet automation tool", "", "[CLASS:WindowsForms10.EDIT.app.0.141b42a_r14_ad1; INSTANCE:3]", $localip )
	  ControlSetText("AutoTelnet 1.3.0 - Telnet automation tool", "", "[CLASS:WindowsForms10.RichEdit20W.app.0.141b42a_r14_ad1; INSTANCE:1]", $telcode )
	  ControlSetText("AutoTelnet 1.3.0 - Telnet automation tool", "", "[CLASS:WindowsForms10.RichEdit20W.app.0.141b42a_r14_ad1; INSTANCE:1]", "{ENTER}")
	  ControlSetText("AutoTelnet 1.3.0 - Telnet automation tool", "", "[CLASS:WindowsForms10.RichEdit20W.app.0.141b42a_r14_ad1; INSTANCE:1]", $telcode2+$token0+$telcode3+$token1+$telcode4 )
      send ("{CTRLDOWN}")
      send ("{r}")
      send ("{CTRLUP}")
      Sleep(5000)
          ControlGetText("AutoTelnet 1.3.0 - Telnet automation tool", "Execution script completed", 1052122 )
     

Next

Endif
   Wend


Примечания:

Прикрепил autotelnet.exe
Прикрепил reader.txt

Я пытался написать эту часть на vb.net, но ничего не получилось.
Вот начало программы на vb.net:

Module Module 1

Function Main() As Integer
'читаем reader.txt
Using InStream As StreamReader = New StreamReader("reader.txt", System.Text.Encoding.GetEncoding(1251))
' Read first line.
txtLine2 = InStream.ReadLine
Do While (Not txtLine2 Is Nothing)
'OutStream.WriteLine(txtLine)
'Console.WriteLine(txtLine2)

' 0 1
'1234|10.160.43.128
'2345|10.160.43.129
'6666|10.160.43.145

tokens = Split(txtLine2, "|")

Dim StoreID As String = tokens(0)
Dim IP_SW As String = tokens(1)

'вот здесь проблемы
'Using OutStream As StreamWriter = ???
'OutStream.WriteLine("q")
'OutStream.WriteLine("copy command-output 'show tech all' tftp " + IP_SW + " SWITCH" + StoreID + ".txt")

'после этого автотелнет должен конфиг вида SWITCH1234.txt


'читаем SWITCH1234.txt, ищем Serial Number : CN62DRW0BC, запиываем значение в reader_out.txt

Using InStream2 As StreamReader = New StreamReader(".\configs\SWITCH" + StoreID + ".txt", System.Text.Encoding.GetEncoding(1251))
' Read first line.
txtLine3 = InStream2.ReadLine
Do While (Not txtLine3 Is Nothing)

' 0 1 2
' ROM Version : RA.15.11 Serial Number : CN62DRW0BC

If txtLine3.Contains("Serial Number") Then

tokens2 = Split(txtLine3, ": ")
Dim SN As String = tokens2(2)

tokens2 = Split(SN, " ")
SN = tokens2(1)

Using OutStream As StreamWriter = New StreamWriter("reader_out.txt", True, System.Text.Encoding.GetEncoding(1251))
OutStream.WriteLine(txtLine2 + "|" + SN)
End Using

End If

txtLine3 = InStream2.ReadLine
Loop
End Using


txtLine2 = InStream.ReadLine
Loop

End Using

'txtLine = InStream.ReadLine
'loop
Next
'End Using

'===================

Catch ex As Exception
Console.WriteLine("Error: Insert is not success." + " " + ex.Message)
Console.WriteLine("It's seems that all configs are downloaded.")
Console.WriteLine("Press any key to continiue...")
Console.ReadKey()

Return 2
End Try


End Function
End Module
 

Вложения

  • autotelnet.rar
    67.7 КБ · Просмотры: 7
  • reader.txt
    3.1 КБ · Просмотры: 7

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
Absolutelight
ожидание вывода сообщения в control id 1052122 окна: "Execution script completed"
Получить текст "панели статуса" без спецсредств не получится. Поэтому, будем ждать подключение по тексту в синем поле. Замените в скрипте строку "Execution script completed" на часть сообщения при успешном соединении
Код:
#include <File.au3>

Global $aTokens
_FileReadToArray("reader.txt", $aTokens, 0, "|")
If @error Then Exit MsgBox(4096, "Ошибка", "Ошибка чтения файла : " & @error)

If Not WinExists("AutoTelnet") Then Run("autotelnet.exe")

$telcode  = "q"
$telcode2 = "copy command-output 'show tech all' tftp"
$telcode3 = "SWITCH"
$telcode4 = ".txt"

For $i = 0 To UBound($aTokens) - 1
  $telnet = WinWait("AutoTelnet", "", 1)
  If Not $telnet Then Exit MsgBox(4096, "Ошибка", "Окно AutoTelnet не найдено")
  ControlSetText("AutoTelnet", "", "[RegExpClass:WindowsForms10.EDIT; INSTANCE:3]", $aTokens[$i][1])
  $str = $telcode & @CRLF & $telcode2 & " " & $aTokens[$i][1] & " " & $telcode3 & " " & $aTokens[$i][0] & $telcode4
  ControlSetText("AutoTelnet", "", "[RegExpClass:WindowsForms10.RichEdit20W; INSTANCE:1]", $str)
  ControlSend("AutoTelnet", "", "", "^r")
  While Sleep(100)
    $text = ControlGetText("AutoTelnet", "", "[RegExpClass:WindowsForms10.RichEdit20W; INSTANCE:2]")
    If @error Or StringInStr($text, "Execution script completed") Then ExitLoop
    If StringInStr($text, "Error during Connection") Then
      ConsoleWrite($text & @CRLF)
      ExitLoop
    EndIf
  WEnd
Next
 
Автор
Absolutelight

Absolutelight

Новичок
Сообщения
4
Репутация
0
InnI сказал(а):
Absolutelight
ожидание вывода сообщения в control id 1052122 окна: "Execution script completed"
Получить текст "панели статуса" без спецсредств не получится. Поэтому, будем ждать подключение по тексту в синем поле. Замените в скрипте строку "Execution script completed" на часть сообщения при успешном соединении
Код:
#include <File.au3>

Global $aTokens
_FileReadToArray("reader.txt", $aTokens, 0, "|")
If @error Then Exit MsgBox(4096, "Ошибка", "Ошибка чтения файла : " & @error)

If Not WinExists("AutoTelnet") Then Run("autotelnet.exe")

$telcode  = "q"
$telcode2 = "copy command-output 'show tech all' tftp"
$telcode3 = "SWITCH"
$telcode4 = ".txt"

For $i = 0 To UBound($aTokens) - 1
  $telnet = WinWait("AutoTelnet", "", 1)
  If Not $telnet Then Exit MsgBox(4096, "Ошибка", "Окно AutoTelnet не найдено")
  ControlSetText("AutoTelnet", "", "[RegExpClass:WindowsForms10.EDIT; INSTANCE:3]", $aTokens[$i][1])
  $str = $telcode & @CRLF & $telcode2 & " " & $aTokens[$i][1] & " " & $telcode3 & " " & $aTokens[$i][0] & $telcode4
  ControlSetText("AutoTelnet", "", "[RegExpClass:WindowsForms10.RichEdit20W; INSTANCE:1]", $str)
  ControlSend("AutoTelnet", "", "", "^r")
  While Sleep(100)
    $text = ControlGetText("AutoTelnet", "", "[RegExpClass:WindowsForms10.RichEdit20W; INSTANCE:2]")
    If @error Or StringInStr($text, "Execution script completed") Then ExitLoop
    If StringInStr($text, "Error during Connection") Then
      ConsoleWrite($text & @CRLF)
      ExitLoop
    EndIf
  WEnd
Next

Спасибо большое за помощь. Я составил код скрипта.
Но последняя задача такая (все в эту же тему):

Считать два массива и посылать две разных переменных одной строкой в окно. При этом переменных: $aTokens может быть 0 и 1 (как Вы правильно сделали).
А переменных $aComm может быть сколько угодно 0, 1, 2, 3, 4... + (они вводятся пользователем и сохраняются в файл commands.txt, затем файл commands.txt и считывается в массив.)
Нужно обойти ошибку количества команд и правильно оформить функцию for $i

Код:
Func _grabManual()

_FileReadToArray("IN\reader.txt", $aTokens, 0, "|")
_FileReadToArray("command\commands.txt", $aComm, 0, ",")

; вот здесь выдает ошибку, если в commands.txt,  например, 6 команд через запятую:


For $i = 0 To UBound($aTokens) - 1
For $i = 0 To UBound($aShow) - 1
    WinWait("Telnet", "", 1)
    WinActivate("Telnet")
	$str = $aComm[$i][0] & @CRLF & $aComm[$i][1] & "$aComm[$i][сколько угодно]" & $aTokens[$i][1] & $aTokens[$i][0] 
	ControlSetText("Telnet", "", "[RegExpClass:WindowsForms10.RichEdit20W; INSTANCE:1]", $str)
	sleep(400)
	ControlSend ("Telnet", "", "", "^r")
   next
   next
EndFunc
 
Верх