Что нового

[Ошибки] Ошибка при выполнении скрипта ошибка переменной в массиве

Yriy_07

Новичок
Сообщения
37
Репутация
0
Уважаемые гуру и продвинутые пользователи, прошу помочь в поиске ошибке при выполнении скрипта. Ошибка следующая: error array variable has incorrect number of subscripts or subscript dimension range exceeded, Line 18024 (File "F:\icmp_mash_2.0"): Прошу простить за грубое написание скрипта.. я начинающий
Заранне благодорю вас за помощь!
Код:
;#RequireAdmin
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <Date.au3>
#include <TreeViewConstants.au3>
#NoTrayIcon
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <INet.au3>
#include <Word.au3>
#include <GUIConstants.au3>
#include <File.au3>
;#Include <Log.au3>

if(1+1=2) Then; variable++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Переменные

$name = @ComputerName
$DT = @MDAY&'-'&@MON&'-'&@YEAR& ' ' &@HOUR& ':'&@MIN& ':'&@SEC& ' :'
$sys_time = @HOUR&@MIN
$POFF = ' POWER OFF | '
$PON = ' POWER ON'
$DOWN = ' LINK DOWN | '
$UP = ' LINK  UP'
$ip_res = "10.1.1.1";  Server1
$ip_res2 = "10.1.1.2"; Server2
$hour = "00"
$min = "05"
$timeset = '0010'
EndIf

if(1+1=2) Then; dir+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Каталоги

$D00 = (@ScriptDir & '\SYS\')
$D01 = (@ScriptDir & '\Log ICMP\')
$D02 = (@ScriptDir & '\')
$D03 = '\\10.11.13.12\Logs'
DirCreate($D00)
DirCreate($D01)

EndIf

if(1+1=2) Then; file+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Файлы

$mash = $D00&'mash.txt'
$mash_report = $D00&'mash_report.txt'
$next = $D00&'next.txt'
$startup = $D00&'startup.txt'
$log = $D01&$name& '_log_icmp_mash.txt'
$log1 = $D01&'log1_mash.txt'
$log2 = $D01&'log2_next.txt'
$IP = $D02&'IP.txt'
$move = $D00&'move.txt'

EndIf

if(1+1=2) Then; read+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Чтение и запись

$read_next = FileReadLine($next,1)

$read_mash = FileReadLine($mash,1)

$read_mash_report = FileReadLine($mash_report,1)

$IP_read_host_A = FileReadLine($IP,1)
$IP_read_host_B = FileReadLine($IP,2)
EndIf

if(1+1=2) Then; time+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Ожидание времени начала

$sec  = '30'
		$i = 0
		Do
		if @SEC <> $sec then Sleep(500)
		$i = $i + 1
	   Until @SEC = $sec
EndIf

if(1+1=2) Then; time control+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Файлы контроля времени
;---------------------------------Записываем ситемное время в mash для тригера--------
$file_a = FileOpen($mash, 2)
FileWriteLine($file_a,$sys_time)
FileClose($file_a)
;---------------------------------Записываем ситемное время в mash_report для отчета--------
$file_r = FileOpen($mash_report, 2)
FileWriteLine($file_r,$DT)
FileClose($file_r)


FileClose($log)
EndIf

if(1+1=2) Then; power check triger 5min+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Проверка на отключение по питанию

if $read_mash = $sys_time or $read_mash = $sys_time-1 or $read_mash = $sys_time-2 or $read_mash = $sys_time-3 or $read_mash = $sys_time-4 or $read_mash = $sys_time-5 or $read_mash = 0059 or $read_mash = 0159 or $read_mash = 0259 or $read_mash = 0359 or $read_mash = 0459 or $read_mash = 0559  or $read_mash = 0659 or $read_mash = 0759 or $read_mash = 0859 or $read_mash = 0959 or $read_mash = 1059 or $read_mash = 1159 or $read_mash = 1259 or $read_mash = 1359 or $read_mash = 1459 or $read_mash = 1559 or $read_mash = 1659 or $read_mash = 1759 or $read_mash = 1859 or $read_mash = 1959 or $read_mash = 2059 or $read_mash = 2159 or $read_mash = 2259 or $read_mash = 2359 Then; Тригер- Системное время равно времени  в mash? если да то

	;MsgBox(6,'','ok  ' & $DT); msg

Else ; Если нет то---------------------------




	If FileExists($startup) Then;----------------------------- Есть стартовый файл? если есть то произвести расчеты




    FileWriteLine($log1,$read_mash_report&$POFF&$DT&$PON); ----------------Запись во временный файл время отключения из файла mash_report, системное время и событие



	$RER = FileReadLine($log1,1); -----------------------------читаем из временного файла строку для обработки тримером и последущего вычесления общего времени простоя

; -----------------------Тримирование и вычисление

$str = $RER
$str = StringReplace($str, " : POWER OFF | ", ";")
$str = StringReplace($str, " : POWER ON | ", ";")
$str = StringSplit($str, ";")

$date_start = StringSplit($str[1], " ")
$time_start = $date_start[2]
$date_start = StringSplit($date_start[1], "-")
$date_start = $date_start[3] & "/" & $date_start[2] & "/" & $date_start[1]

$date_stop = StringSplit($str[2], " ")
$time_stop = $date_stop[2]
$date_stop = StringSplit($date_stop[1], "-")
$date_stop = $date_stop[3] & "/" & $date_stop[2] & "/" & $date_stop[1]


$diff = _DateDiff('n', $date_start & " " & $time_start, $date_stop & " " & $time_stop)

;-------------------------------------------------

FileWriteLine($log,$name&' | '&$RER&' | Disconnected by power = '&$diff&" min"); -------------------------Запись информации в лог файл
FileWriteLine($log,'------------------------------------------------------------------------------------------------------------------------------------')







Else; Если нет то создать файл startup вписать время активации программы+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

If Not _FileCreate($startup) Then
   MsgBox(4096,"Error", " Error Creating/Resetting log.      error:" & @error)
EndIf
$NS = ' Running the program *****************'
FileWriteLine($log,$name&' | '&$DT&$NS); -------------------------Запись информации в лог файл
FileWriteLine($log,'------------------------------------------------------------------------------------------------------------------------------------')







EndIf


















EndIf



FileDelete($log1); Удаление временного файла



EndIf

if(1+1=2) Then; power check triger 5min+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Проверка на отсутствие связи



	if FileExists($IP) Then;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Проверка доступности файла с  IP адресами ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Если доступен то
;MsgBox(6,'Питание','ip ok  ' & $DT); msg
	      if Ping($IP_read_host_A) Then;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Проверка доступности хоста А++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Если доступен то
;MsgBox(6,'Питание','host a ok  ' & $DT); msg
			     if FileExists($next) Then;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Проверка наличия файла NEXT+++++++++++++++++++++++++++++++++++++++++++++++++++++++++Если файл есть то


;MsgBox(6,'Питание','$next ok000000000000000  ' & $DT); msg



FileWriteLine($log2,$read_next&$DOWN&$DT&$UP); ----------------Запись во временный файл время отключения из файла mash_report, системное время и событие



	$ROR = FileReadLine($log2,1); -----------------------------читаем из временного файла строку для обработки тримером и последущего вычесления общего времени простоя

; -----------------------Тримирование и вычисление

$st = $ROR
$st = StringReplace($st, " : LINK DOWN | ", ";")
$st = StringReplace($st, " : LINK UP | ", ";")
$st = StringSplit($st, ";")

$date_star = StringSplit($st[1], " ")
$time_star = $date_star[2]
$date_star = StringSplit($date_star[1], "-")
$date_star = $date_star[3] & "/" & $date_star[2] & "/" & $date_star[1]

$date_sto = StringSplit($st[2], " ")
$time_sto = $date_sto[2]
$date_sto = StringSplit($date_sto[1], "-")
$date_sto = $date_sto[3] & "/" & $date_sto[2] & "/" & $date_sto[1]


$dif = _DateDiff('n', $date_star & " " & $time_star, $date_sto & " " & $time_sto)

;-------------------------------------------------

FileWriteLine($log,$name&' | '&$ROR&' | Jack of communication = '&$dif&" min"); -------------------------Запись информации в лог файл
FileWriteLine($log,'------------------------------------------------------------------------------------------------------------------------------------')








FileDelete($log2); Удаление временного файла
FileDelete($next); Удаление файла NEXT




































				 Else
;MsgBox(6,'Питание','$next no  ' & $DT); msg
				 EndIf


		  Else;++++++++++++++++++Если хост А не доступен то

				 if Ping($IP_read_host_B) Then;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Проверка доступности хоста В++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Если доступен то

;MsgBox(6,'Питание','host B ok  ' & $DT); msg

                    if FileExists($next) Then


FileWriteLine($log2,$read_next&$DOWN&$DT&$UP); ----------------Запись во временный файл время отключения из файла mash_report, системное время и событие



	$ROR = FileReadLine($log2,1); -----------------------------читаем из временного файла строку для обработки тримером и последущего вычесления общего времени простоя

; -----------------------Тримирование и вычисление

$str = $ROR
$str = StringReplace($str, " : LINK DOWN | ", ";")
$str = StringReplace($str, " : LINK UP | ", ";")
$str = StringSplit($str, ";")

$date_start = StringSplit($str[1], " ")
$time_start = $date_start[2]
$date_start = StringSplit($date_start[1], "-")
$date_start = $date_start[3] & "/" & $date_start[2] & "/" & $date_start[1]

$date_stop = StringSplit($str[2], " ")
$time_stop = $date_stop[2]
$date_stop = StringSplit($date_stop[1], "-")
$date_stop = $date_stop[3] & "/" & $date_stop[2] & "/" & $date_stop[1]


$diff = _DateDiff('n', $date_start & " " & $time_start, $date_stop & " " & $time_stop)

;-------------------------------------------------

FileWriteLine($log,$name&' | '&$ROR&' | Jack of communication = '&$diff&" min"); -------------------------Запись информации в лог файл
FileWriteLine($log,'------------------------------------------------------------------------------------------------------------------------------------')








FileDelete($log2); Удаление временного файла
FileDelete($next); Удаление временного файла


					Else

;MsgBox(6,'Питание','$next no  ' & $DT); msg
					EndIf


		         Else;++++++++++++++++++Если хост В не доступен то

                    if FileExists($next) Then











					Else;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Если нет файла next то ++++++++++


						;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Создать файл next+++++++++++++++++++++++++++++++++++++++++++
                            $file_l = FileOpen($next, 2)
                           FileWriteLine($file_l,$read_mash_report )
                            FileClose($file_l)



;MsgBox(6,'Питание','create $next   ' & $DT); msg

					EndIf



		         EndIf



		  EndIf


	Else;++++++++++++++++++Если файл с  IP адресами не доступен то


   FileWriteLine($log,$name&' | '&$DT&" | No file with ip addresses !!! I'll create the file and use the built-in addresses - "&$ip_res); -------------------------Запись информации в лог файл
   FileWriteLine($log,'------------------------------------------------------------------------------------------------------------------------------------')

   $file_cr = FileOpen($IP, 2)
	FileWriteLine($file_cr,$ip_res& @CRLF& $ip_res2)
	FileClose($file_cr)


    EndIf























EndIf

if(1+1=2) Then; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Копирование логов и перезапуск

;if @HOUR&@MIN <> $timeset Then

;FileDelete($move)

;EndIf

;if FileExists($move) Then

	;Else


;if @HOUR&@MIN <> $hour&$min Then

	;If FileExists($log) Then
         ;FileMove($log,$D02)
		 ;$file_m = FileOpen($move, 2)
         ;FileWriteLine($file_m,$sys_time)
         ;FileClose($file_m)

    ;EndIf

	;EndIf
;EndIf


$sec  = '35'
		$i = 0
		Do
		if @SEC <> $sec then Sleep(500)
		$i = $i + 1
	   Until @SEC = $sec



Run('icmp_mash_2.0.exe')
Exit


EndIf
 
Автор
Y

Yriy_07

Новичок
Сообщения
37
Репутация
0
Прошу прощения но я не по прежнему не могу понять из-за чего возникает данная ошибка :(
 

joiner

Модератор
Локальный модератор
Сообщения
3,470
Репутация
609
При работе с массивом такая ошибка. Запусти в редакторе код и найдешь строку ошибки. Смотри массивы в коде. Делай проверку на наличие массива, прежде чем его использовать


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

заметил
Код:
StringSplit

эта функция возвращает массив
читай в справке инфу по этой функции
 
Автор
Y

Yriy_07

Новичок
Сообщения
37
Репутация
0
Втом то и дело что в редакторе ошибку не показывает. у меня на компе с 10-ой крутится отлично а ставлю на хрюшу ругается. Как именно проверить массив? Будьте другами плиз проект стоит, а его запустить нужно срочно. Тримирование мне aloha подсказывал я сказать честно не доконца вижу что к чему..Или выкинуть уже трим((( Но без расчета времени печально.. :stars:
 

joiner

Модератор
Локальный модератор
Сообщения
3,470
Репутация
609
Yriy_07 сказал(а):
Втом то и дело что в редакторе ошибку не показывает. у меня на компе с 10-ой крутится отлично а ставлю на хрюшу ругается. Как именно проверить массив? Будьте другами плиз проект стоит, а его запустить нужно срочно. Тримирование мне aloha подсказывал я сказать честно не доконца вижу что к чему..Или выкинуть уже трим((( Но без расчета времени печально.. :stars:
я ж написал, запускаешь в редакторе, и при появлении ошибки редактор укажет на строку
читай справку по функции, возвращающей массив. делай проверку на ошибки.
 
Автор
Y

Yriy_07

Новичок
Сообщения
37
Репутация
0
SciTE
Version 3.7.3
Feb 16 2017 21:41:17 у меня не показывает ошибку в этой версии. В какой покажет?


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

xXx сказал(а):
Yriy_07 сказал(а):
Код:
Run('icmp_mash_2.0.exe')
Файл "icmp_mash_2.0.exe" - что это?
Это как раз и есть этот скрипт. Он перезапускается


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

joiner сказал(а):
Yriy_07 сказал(а):
Втом то и дело что в редакторе ошибку не показывает. у меня на компе с 10-ой крутится отлично а ставлю на хрюшу ругается. Как именно проверить массив? Будьте другами плиз проект стоит, а его запустить нужно срочно. Тримирование мне aloha подсказывал я сказать честно не доконца вижу что к чему..Или выкинуть уже трим((( Но без расчета времени печально.. :stars:
я ж написал, запускаешь в редакторе, и при появлении ошибки редактор укажет на строку
читай справку по функции, возвращающей массив. делай проверку на ошибки.
Какая у вас версия редактора? Обновил редактор - ошибку не показывает
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Yriy_07 сказал(а):
Это как раз и есть этот скрипт. Он перезапускается
Это такой своеобразный цикл? Как способ "изнасиловать" винду с анивиром?

Yriy_07 сказал(а):
ошибку не показывает
Потому что не работает - вы запускаете несуществующий (надеюсь) файл
Код:
; Замените эту строку:
; Run('icmp_mash_2.0.exe')

; На Это:
If @Compiled Then
	Run(@AutoItExe)
Else
	Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptFullPath & '"')
EndIf



А вообще, если хотите вычислить ошибочную строку при отладке, то:

Уберите все директивы AutoIt3Wrapper из скрипта
Пропишите в самом начале следующее:
Код:
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/MO

и скомпилируйте скрипт. Рядом с EXE будет лежать скрипт с названием вида: "..._stripped.au3" вот по ниму и вычисляйте значение строки по номеру.

Уберите все директивы AutoIt3Wrapper из скрипта
Пропишите в самом начале следующее:
Код:
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/rsln

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

Еще почитайте про Au3Stripper.
 
Автор
Y

Yriy_07

Новичок
Сообщения
37
Репутация
0
xXx сказал(а):
Yriy_07 сказал(а):
Это как раз и есть этот скрипт. Он перезапускается
Это такой своеобразный цикл? Как способ "изнасиловать" винду с анивиром?

Yriy_07 сказал(а):
ошибку не показывает
Потому что не работает - вы запускаете несуществующий (надеюсь) файл
Код:
; Замените эту строку:
; Run('icmp_mash_2.0.exe')

; На Это:
If @Compiled Then
	Run(@AutoItExe)
Else
	Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptFullPath & '"')
EndIf



А вообще, если хотите вычислить ошибочную строку при отладке, то:

Уберите все директивы AutoIt3Wrapper из скрипта
Пропишите в самом начале следующее:
Код:
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/MO

и скомпилируйте скрипт. Рядом с EXE будет лежать скрипт с названием вида: "..._stripped.au3" вот по ниму и вычисляйте значение строки по номеру.

Уберите все директивы AutoIt3Wrapper из скрипта
Пропишите в самом начале следующее:
Код:
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/rsln

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

Для справки:
Код:
https://www.autoitscript.com/autoit3/scite/docs/SciTE4AutoIt3/Au3Stripper.html
Решил проблему убрав массивы и тримирование. вычисление времени сделал на _DateDiff используя другой формат даты\время. Скрипт при запуске ожидает значение системного времени равное 30 сек после чего пробегает и при завершении сам себя перезапускает. можно было использовать и обычный цикл но не стал этого делать просто потому чтобы небыло проблем с увеличением ресурсов в оперативной памяти и чтобы исключить падение приложения.. Анивир действительно в ужасе Нод. А в целом прога стабильна и функциональна с минимальными запросами. В любом случаее спасибо за советы!
 
Верх