Что нового

Формирование команд из таблиц и их отправка консольной программе

listeria

Новичок
Сообщения
2
Репутация
0
Захотелось автоматизировать выполнение некоторых задач. Через поисковик искал, как автоматизировать действия и узнал про AutoIt...
Если кратко, мне приходят данные в двух файлах, нужно немного над ними поколдовать, а потом отправлять команды ко внутренней служебной программе, которая работает в командной строке. Последнее я решил попробовать автоматизировать. Но дальше рисования интерфейса дело особо не пошло.

Итак, суть. Есть две таблицы (ListView) по две колонки в каждой. В них я загружаю данные из двух разных текстовых файлов с помощью 2 кнопок (Button1 и Button2). По нажатию на третью кнопку (Button3) должно происходить следующее: берем одно значение из первой таблицы и проходимся по всем значениям второй таблицы сверху вниз три раза (выполнять одну и ту же команду к командной строке три раза подряд нельзя, поэтому нужно именно пройтись сверху вниз три раза), отправляя команды в командную строку с задержкой между каждой отправкой, чтобы предыдущий запрос успел успешно отработать. Затем берём второй ряд значений из первой таблицы и снова три раза проходимся по всем значениям второй таблицы. И так, пока все операции не будут выполнены.

И ещё... RunWait на роль паузы не подойдёт, консоль после ввода команды не закрывается.

Вот так примерно это можно представить (на примере тестовых данных, которые я поместил ниже, в спойлерах):

Код:
Начало работы

sdmprof.exe -zapros1 -10000 -index1 -data1 ; Команда 1
Пауза 50 секунд
sdmprof.exe -zapros1 -10000 -index2 -data2 ; Команда 2
Пауза 50 секунд
...
sdmprof.exe -zapros1 -10000 -index1 -data1 ; Команда N (идентична первой). 3 проход
Пауза 50 секунд
sdmprof.exe -zapros1 -10000 -index2 -data2 ; Команда N (идентичная второй). 3 проход
Пауза 50 секунд
...
sdmprof.exe -zapros8 -8000 -index10 -data10 ; Предпоследняя команда
Пауза 50 секунд
sdmprof.exe -zapros8 -8000 -index11 -data11 ; Последняя команда
Пауза 50 секунд

Завершение работы

Надеюсь смысл понятен. Однако я так и не смог подступиться к этой задаче.

AutoIt код
Код:
#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <File.au3>

; Загружаем данные в первую таблицу
Func Load1()
	Dim $array
	$fo1 = FileOpenDialog("Выбери файл 1", @ScriptDir, "Текстовый документ (*.txt)")
	_FileReadToArray($fo1, $array)
	For $i = 1 To $array[0]
		GUICtrlCreateListViewItem($array[$i], $ListView1)
	Next
EndFunc

; Загружаем данные во вторую таблицу
Func Load2()
	Dim $arr
	$fo2 = FileOpenDialog("Выбери файл 2", @ScriptDir, "Текстовый документ (*.txt)")
	_FileReadToArray($fo2, $arr)
	For $j = 1 To $arr[0]
		GUICtrlCreateListViewItem($arr[$j], $ListView2)
	Next
EndFunc

$Form1 = GUICreate("Автоматические расчёты данных", 569, 536, 238, 128)
$Group1 = GUICtrlCreateGroup("", 10, 8, 265, 441)
$Button1 = GUICtrlCreateButton("Загрузить Данные 1...", 16, 24, 250, 33)
$ListView1 = GUICtrlCreateListView("||", 16, 72, 250, 358)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 123)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 123)
$Group2 = GUICtrlCreateGroup("", 288, 8, 266, 441, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
$Button2 = GUICtrlCreateButton("Загрузить Данные 2...", 296, 24, 250, 33)
$ListView2 = GUICtrlCreateListView("||", 296, 72, 250, 360)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 123)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 123)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button3 = GUICtrlCreateButton("Запустить отправку запросов в программу", 8, 456, 545, 65)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button1
			Load1()

		Case $Button2
			Load2()

	EndSwitch
WEnd
Пример данных 1 файла (тестовые данные):
Код:
zapros1|10000
zapros2|20000
zapros3|300
zapros4|4000
zapros5|50
zapros6|60000
zapros7|700
zapros8|8000

Пример данных 2 файла (тестовые данные):
Код:
index1|data1
index2|data2
index3|data3
index4|data4
index5|data5
index6|data6
index7|data7
index8|data8
index9|data9
index10|data10
index11|data11

Просите за столь сумбурное и спутанное описание. Если несложно, помогите чайнику, пожалуйста.
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Для удобства лучше разбить на двумерный массив
Код:
Dim $ar[$array[0]][2]
   For $i = 1 To $array[0]
	   For $j = 0 To 1
		 $array1 = StringSplit($array[$i], "|", 1)
		 $ar[$i - 1][$j] = $array1[$j + 1]		 
	  Next
   Next
Далее в цикле
Код:
For $k = 0 To UBound($ar)
   For $m To UBound($ar1)
	  For $x =1 To 3  ; я так понял что 3 раза надо
		 Run(@ComSpec & ' /C sdmprof.exe ' & $ar[$k][0] & ' ' & $ar[$k][1] & ' ' & $ar1[$m][0] & ' ' & $ar1[$m][1] , '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)	
		 Sleep(50000)
	  Next
   Next
Next
Все на скорую руку, прикрутишь сам.
 
Автор
L

listeria

Новичок
Сообщения
2
Репутация
0
Спасибо вам, но я так и не смог добиться работы скрипта.

Запустил, получил ошибку: Variable used without being declared. Попробовал просмотреть массив через _ArrayDisplay, не получилось. Попробовал на своих массивах, там работает. Объявил переменные из-за которых сыпались ошибки. Ничего. Получил другую ошибку:

Код:
For $m To UBound($ar1)
For $m ^ ERROR

"For" statement is badly formatted.

Код:
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <File.au3>

Dim $array
; Загружаем данные в первую таблицу
Func Load1()
    $fo1 = FileOpenDialog("Выбери файл 1", @ScriptDir, "Текстовый документ (*.txt)")
    _FileReadToArray($fo1, $array)
    For $i = 1 To $array[0]
        GUICtrlCreateListViewItem($array[$i], $ListView1)
    Next
EndFunc

; Загружаем данные во вторую таблицу
Func Load2()
    Dim $arr
    $fo2 = FileOpenDialog("Выбери файл 2", @ScriptDir, "Текстовый документ (*.txt)")
    _FileReadToArray($fo2, $arr)
    For $j = 1 To $arr[0]
        GUICtrlCreateListViewItem($arr[$j], $ListView2)
    Next
EndFunc

Func Sending()
    Dim $ar[$array[0]][2]
    For $i = 1 To $array[0]
        For $j = 0 To 1
            $array1 = StringSplit($array[$i], "|", 1)
            $ar[$i - 1][$j] = $array1[$j + 1]       
        Next
    Next
    For $k = 0 To UBound($ar)
        For $m To UBound($ar1)
            For $x =1 To 3  ; я так понял что 3 раза надо
                Run(@ComSpec & ' /C sdmprof.exe ' & $ar[$k][0] & ' ' & $ar[$k][1] & ' ' & $ar1[$m][0] & ' ' & $ar1[$m][1] , '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)    
                Sleep(50000)
            Next
        Next
    Next
EndFunc


$Form1 = GUICreate("Автоматические расчёты данных", 569, 536, 238, 128)
$Group1 = GUICtrlCreateGroup("", 10, 8, 265, 441)
$Button1 = GUICtrlCreateButton("Загрузить Данные 1...", 16, 24, 250, 33)
$ListView1 = GUICtrlCreateListView("||", 16, 72, 250, 358)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 123)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 123)
$Group2 = GUICtrlCreateGroup("", 288, 8, 266, 441, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
$Button2 = GUICtrlCreateButton("Загрузить Данные 2...", 296, 24, 250, 33)
$ListView2 = GUICtrlCreateListView("||", 296, 72, 250, 360)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 123)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 123)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button3 = GUICtrlCreateButton("Запустить отправку запросов в программу", 8, 456, 545, 65)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button1
            Load1()

        Case $Button2
            Load2()

        Case $Button3
            Sending()

    EndSwitch
WEnd
 
A

Alofa

Гость
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>

Local $aArray_1, $aArray_2, $sCommands, $iPID
Local $fo1 = @ScriptDir & '\File_1.txt'
Local $fo2 = @ScriptDir & '\File_2.txt'

$Form1 = GUICreate('Автоматические расчёты данных', 569, 536)
$Group1 = GUICtrlCreateGroup('', 10, 8, 265, 441)
$Button1 = GUICtrlCreateButton('Загрузить Данные 1...', 16, 24, 250, 33)
$ListView1 = GUICtrlCreateListView('||', 16, 72, 250, 358)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 123)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 123)
$Group2 = GUICtrlCreateGroup('', 288, 8, 266, 441, BitOR($GUI_SS_DEFAULT_GROUP, $BS_CENTER))
$Button2 = GUICtrlCreateButton('Загрузить Данные 2...', 296, 24, 250, 33)
$ListView2 = GUICtrlCreateListView('||', 296, 72, 250, 360)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 123)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 123)
GUICtrlCreateGroup('', -99, -99, 1, 1)
$Button3 = GUICtrlCreateButton('Запустить отправку запросов в программу', 8, 481, 545, 40)
$iCkbox = GUICtrlCreateCheckbox('Сохранить список запросов в .BAT файл', 10, 455, 240, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$aArray_1 = _Load($fo1, $ListView1) ; Загружаем данные в первый ListView
		Case $Button2
			$aArray_2 = _Load($fo2, $ListView2) ; Загружаем данные во второй ListView
		Case $Button3
			If $iPID Then
				ProcessClose('sleep.exe')
				ProcessClose($iPID)
				If Not ProcessWaitClose($iPID, 4) Then MsgBox(16, 'Внимание!', 'Не удалось завершить отправку запросов в программу.' & @LF & 'Закройте консоль вручную.')
			Else
				$sCommands = _GenerateCommands() ; Формируем список команд для CMD
				If Not $sCommands Then
					MsgBox(64, 'Внимание!', 'Загрузите данные в оба списка.')
					ContinueLoop
				EndIf
				If GUICtrlRead($iCkbox, 0) = $GUI_CHECKED Then _WritingBatFile() ; Вызов пользовательской функции для записи строк в 'GenerateCommand.bat' (Если не надо - удалите)
				_ControlSetState($GUI_DISABLE, 'Отменить отправку запросов')
				$iPID = Run(@ComSpec & ' /k ' & $sCommands)
			EndIf
	EndSwitch
	
	If $iPID And Not ProcessExists($iPID) Then
		_ControlSetState($GUI_ENABLE, 'Запустить отправку запросов в программу')
		$iPID = ''
	EndIf
WEnd

;================= ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ ======================================
Func _Load($fo, $ListView)
	Local $aArray
;~ 	$fo = FileOpenDialog('Выбери файл', @ScriptDir, 'Текстовый документ (*.txt)');	| Эти 2 строки для 
;~ 	If Not $fo Then Return 0;														| варианта с OpenDialog
	$aArray = StringRegExp(FileRead($fo), '\S+', 3) ; Пришлось использовать Эту функцию вместо '_FileReadToArray()' чтобы в массив (возможно) не попали пустые строки
	If @error Then Return MsgBox(16, 'Ошибка!', 'Ошибка чтения файла:' & @LF & $fo & @LF & 'Или файл пуст.')
	For $i = 0 To UBound($aArray) - 1
		GUICtrlCreateListViewItem($aArray[$i], $ListView)
	Next
	Return $aArray
EndFunc   ;==>_Load

Func _GenerateCommands()
	Local $sText_1, $sText_2, $sText_Total
	If Not IsArray($aArray_1) Or Not IsArray($aArray_2) Then Return 0
	For $i = 0 To UBound($aArray_1) - 1
		$sText_1 = 'sdmprof.exe -' & StringReplace($aArray_1[$i], '|', ' -')
		For $j = 0 To UBound($aArray_2) - 1
			$sText_2 &= $sText_1 & ' -' & StringReplace($aArray_2[$j], '|', ' -') & '&&Sleep 50&&'
		Next
		$sText_Total &= $sText_2 & $sText_2 & $sText_2
		$sText_2 = ''
	Next
	$sText_Total &= 'Exit'
	Return $sText_Total
EndFunc   ;==>_GenerateCommands

Func _ControlSetState($iState, $sTxt)
	GUICtrlSetState($ListView1, $iState) ; Меняем состояние элемента
	GUICtrlSetState($ListView2, $iState) ; Меняем состояние элемента
	GUICtrlSetData($Button3, $sTxt) ; Меняем текст кнопки
EndFunc   ;==>_ControlSetState

; Запись строк в 'GenerateCommand.bat' (Если не надо - удалите функцию)
Func _WritingBatFile()
	$hFile = FileOpen(@ScriptDir & '\GenerateCommand.bat', 2)
	If $hFile = -1 Then Return 0
	FileWrite($hFile, StringReplace($sCommands, '&&', @CRLF))
	FileClose($hFile)
EndFunc   ;==>_WritingBatFile


Подправил, с учетом этого:
listeria сказал(а):
... и проходимся по всем значениям второй таблицы сверху вниз три раза...
 

ildar

Осваивающий
Сообщения
252
Репутация
30
listeria
Для удобства лучше разбить на двумерный массив
Там был пример только для одного массива. Нужно было дописать и для второго.Поэтому
Запустил, получил ошибку: Variable used without being declared.
Его не существует в вашем случае.
 
Верх