Что нового

Убрать кратное увеличение (прибавление предыдущих) результатов функции

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Почему-то увеличиваются (прибавляются предыдущие) результаты выполнения функции.
Если делаю так, то результаты получаются не увеличенными, тоесть выдаются подряд.
Код:
#include<Array.au3>

Const $wbemFlagReturnImmediately = 0x10
Const $wbemFlagForwardOnly = 0x20
Global $strVendorSpecific[0], $strVendorSpecificA[0], $vendor[3]

$objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\WMI")
$colItems = $objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_ATAPISmartData", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
For $diskVendor In $colItems
                 _ArrayAdd($diskVendors, $diskVendor.InstanceName &'|'&StringReplace($diskVendor.InstanceName, '\','\\'))
Next
;_ArrayDisplay($diskVendors, 'массив вендоров')

For $zzz=0 To UBound($diskVendors)-1
_Smart($diskVendors[$zzz][1])
Next

Func _Smart($zzz)
   ConsoleWrite($zzz & @CR)
EndFunc

Но если подставляю в функцию получения смарта, то вместо того, чтобы показывать смарт-инфу по очереди по каждому винту, показывает сперва по первому, затем в одном массиве первый и второй, затем первый, второй, третий. Думаю и дальше так суммировало бы. Делаю так:
Код:
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUITab.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <String.au3>
#include <Array.au3>
#include <Math.au3>

Global    $sSMARTCodeTxt = "1*1*Raw Read Error Rate*Частота ошибок при чтении данных с диска;" & _
                        "2*2*Throughput Performance*Общая производительность диска.;" & _
                        "3*3*Spin-Up Time*Время раскрутки пакета дисков из состояния покоя до рабочей скорости.;" & _
                        "4*4*Start/Stop Count*Полное число циклов запуск-остановка шпинделя. В поле raw value хранится общее количество запусков/остановок диска;" & _
                        "5*5*Reallocated Sectors Count*Число операций переназначения секторов.;" & _
                        "6*6*Read Channel Margin*Запас канала чтения. Назначение этого атрибута не документировано. В современных накопителях не используется.;" & _
                        "7*7*Seek Error Rate*Частота ошибок при позиционировании блока магнитных головок.;" & _
                        "8*8*Seek Time Performance*Средняя производительность операции позиционирования магнитными головками.;" & _
                        "9*9*Power-on Time Count (Power-On Hours)*Число часов (POH)(минут секунд — в зависимости от производителя) проведённых во включенном состоянии.;" & _
                        "10*0A*Spin-Up Retry Count*Число повторных попыток раскрутки дисков до рабочей скорости в случае если первая попытка была неудачной"

Const $wbemFlagReturnImmediately = 0x10
Const $wbemFlagForwardOnly = 0x20
Global $Index[0], $Smart[0][10]
Global $strVendorSpecific[0], $strVendorSpecificA[0], $k[0], $diskVendors[0][2]
Global $STR1[0][4]


$TTT = _StringExplode($sSMARTCodeTxt, ";")
ConsoleWrite('TTT  ' & UBound($TTT) & @CR)


For $s = 0 To UBound($TTT)-1
   _ArrayAdd($STR1, $TTT[$s], 0, "*")
Next


$objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\WMI")
$colItems = $objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_ATAPISmartData", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

For $diskVendor In $colItems
             _ArrayAdd($diskVendors, $diskVendor.InstanceName &'|'&StringReplace($diskVendor.InstanceName, '\','\\'))
Next

;_ArrayDisplay($diskVendors, 'массив вендоров')

ConsoleWrite('STR1  ' & UBound($STR1) & @CR)

For $zzz=0 To UBound($diskVendors)-1
_Smart($diskVendors[$zzz][1])
Next

Func _Smart($zzz)
$objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\WMI")
$colItems = $objWMIService.ExecQuery('SELECT * FROM MSStorageDriver_ATAPISmartData Where InstanceName="' & $zzz &'"', "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
       For $Item In $colItems
            $strVendorSpecific = $Item.VendorSpecific
            _ArrayDisplay($strVendorSpecific,"Спецификация")
Next
   For $z = 2 to UBound($strVendorSpecific) - 1 Step 12
      _ArrayAdd($k, $strVendorSpecific[$z])
   Next
For $j = 0 To UBound($STR1)-1
For $i = 2 to UBound($strVendorSpecific) - 1 Step 12
Select
  Case $strVendorSpecific[$i] = $STR1[$j][0]
     $sPark = $strVendorSpecific[$i]& '|' & $STR1[$j][2] & '|' & '1' & '|' & $strVendorSpecific[$i + 1] & '|' & $strVendorSpecific[$i + 2] & '|' & $strVendorSpecific[$i + 3] & '|' & $strVendorSpecific[$i + 4] & '|' & $strVendorSpecific[$i + 5] & '|' & $strVendorSpecific[$i + 6]
   If StringStripWS($sPark, 8) <> 0 Then _ArrayAdd($Smart, $sPark)
  Case Else
     $sPark=''
EndSelect
   Next
   Next
_ArrayDisplay($Smart, 'Smart', Default, '', Default, "ID|Attribute|Type|Flag|Threshold(Порог)|Текущее|Worst(Наихудший)|Значение||Status")

EndFunc
Что не так делаю и как это убрать?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Массив $Smart[0][10] объявлен глобально. Либо объявите его локально внутри функции, либо очищайте перед выходом из функции.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Чтобы очистить массив достаточно заново его объявить
Код:
Func _Smart($zzz)
  ...
  _ArrayDisplay($Smart, 'Smart', ...
  Global $Smart[0][10] ; очистка массива
EndFunc
 
Верх