Что нового

[Массивы] Выполнение задания пока есть строки в массиве

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
Здравствуйте!
Нужна помощь в работе с массивами.
Имееться массив с неизвестным количеством строк. (генериться каждый раз новый)
Необходимо выполнять одинаковые операции подставляя данные из массива до тех пор пока массив не закончиться.
Вот что наваял сейчас:

Код:
$aResult = StringRegExp ($sString, $sText, 3)
If $aResult = 1 Then
	MsgBox (48, "LOGOFF", "Не зайдено активных подключений!")
Else
	For $i = 0 To $aResult[0]
		Run("logoff " & $aResult[$i] & " /SERVER:" & $host, '', @SW_HIDE)
	Next
	MsgBox (48, "LOGOFF", "Все сессии удачно сброшены")
EndIf

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

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
Dim $myArray[10][20]    ;element 0,0 to 9,19
$rows = UBound($myArray)
$cols = UBound($myArray, 2)
$dims = UBound($myArray, 0)

MsgBox(0,  "The " & $dims & "-dimensional array has",  _
    $rows & " rows, " & $cols & " columns")

;Display  $myArray's contents
$output  = ""
For $r =  0 to UBound($myArray,1) - 1
    $output = $output & @LF
    For $c = 0  to UBound($myArray,2)  - 1
        $output = $output & $myArray[$r][$c] & " "
    Next
Next
MsgBox(4096,"Array  Contents", $output)
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
2Belfigor
Большое спасибо очень помог :smile:
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
Рано радовался :(
Все работает но как то через раз и с ошибками.
Возможно проблема в моем подходе к реализации задуманого.
Итого, хочу придумать велосипед. (А кто не хочет?)

Поставил задачу написать себе "полезняшку" в видне logoff всех сессий на терминале не заходя на сервак.
Для этого решил использовать штатные виндовые средства и обыграть все это в Gui
Собственно вот мое решение:
Этап первый.

Код:
$host = GUICtrlRead($input)
$1 = ("C:\reset.bat")
$2 = ("C:\user.txt")
	$create = FileWrite($1, "query user /SERVER:" & $host & " > " & $2)
		If $create = 1 Then
			Run($1, "C:\", @SW_HIDE)
		Else
			MsgBox (0, "error", "error")
		EndIf


Этап второй.

Код:
$b1 = MsgBox (1, "LOGOFF", "Завершить все терминальные сессии сервера '" & $host & "'")
	If $b1 = 1 Then
		$sUser = FileOpen($2, 0)
		$sString = FileRead($sUser)
		FileClose($sUser)
		$aResult = StringRegExp ($sString, 'rdp-tcp#..', 3)
			If Not @error Then
;~ 				_ArrayDisplay($aResult)
				FileDelete ($1)
				FileDelete ($2)
					For $i = 0 To UBound ($aResult,1) - 1
					Run("logoff " & $aResult[$i] & " /SERVER:" & $host, "", @SW_HIDE)
					Next
Sleep(100)
					MsgBox (48, "LOGOFF", "Все сессии удачно сброшены")
			Else
				MsgBox (16, "LOGOFF", "Не зайдено активных подключений!")
			EndIf
	Else
		FileDelete ($1)
		FileDelete ($2)
	EndIf


Вобщем вот так вот выглядит это сейчас.
Работает через раз.

Причем если подключение на сервере всего одно (тестирую на себе) то работает в 90% случаях.
При тестировании на 5 и больше подключений (да простят меня юзеры) работает в 5-10% случаях.

*сделал такой же вариант на одного юзера где нету перебора массива. Работает 100%
 

Pelerin

Осваивающий
Сообщения
81
Репутация
23
panda_911
Возможно проблема не в цикле с перебором, а в команде Run.
Попробуйте RunWait, чтобы скрипт ждал завершения cmd, а потом переходил к следующему соединению.
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
что то я совсем ничего не пойму.
скрипт при выполнении запускает кучу своих копий (по количеству строк в массиве) и не завершает ниодного сеанса :(
хотя в подтверждение выдаёт что подключения удачно сброшены
 

Pelerin

Осваивающий
Сообщения
81
Репутация
23
panda_911
Код:
RunWait(@ComSpec & " /c logoff " & $aResult[$i] & " /SERVER:" & $host, "", @SW_HIDE)

RunWait - чтобы скрипт дождался завершения cmd
@ComSpec - макрос содержащий путь к cmd.exe
/c - параметр cmd который указывает на то что после отработки команды cmd должен закрыться.
logoff ... - собственно команда

Либо как вариант(я бы реализовал это так):
Код:
#Include <File.au3> ; нужен для команды _TempFile
$temp_bat = StringTrimRight(_TempFile (), 4)&'.bat' ; получаем уникальное имя временного файла в папке %temp%
For "начало списка" to "конец списка"
	FileWriteLine($temp_bat, "logoff " & $aResult[$i] & " /SERVER:" & $host) ; Пишем в бат-файл список команд для завершения юзеров
next
RunWait(@ComSpec & ' /c "' & $temp_bat & '"', "", @SW_HIDE) ; запускаем батник на выполнение
FileDelete($temp_bat)
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
2Pelerin
Огромное человеческое спасибо!
Ваш вариант оказался более действенный.
Правда дома нету возможности проверить в полной мере.
Но завтра на работе проверю и отпишу.

*Отдельное спасибо за разьяснения!
Мне, как начинающему администратору комментарии более опытных коллег очень помогают быстрее понять в чем была моя ошибка.
Спасибо!

*вот бы и со вторым моим "камнем преткновения" так же быстро помогли разобраться.
правда это уже в другой теме и там пока никто не отвечает :(
 
Верх