Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 29.05.2019
Сообщений: 55

Предыдущий элемент массива или найти значение

30.05.2019, 16:17. Показов 2229. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые!
В продолжение моей последней темы Автоматизация IPerf
Возникла необходимость заносить в журнал только результаты тестов с низким значением скорости подключения.
У меня есть массив $Array содержащий:
------------------------------------------------------------
Client connecting to 192.168.22.201, TCP port 12344
TCP window size: 32.0 KByte
------------------------------------------------------------
[196] local 10.77.0.219 port 25027 connected with 192.168.22.201 port 12344
[ ID] Interval Transfer Bandwidth
[196] 0.0-10.0 sec 113 MBytes 94.3 Mbits/sec
Из него нужно взять значение 94.3 Mbits/sec сравнить его с эталоном и если не совпадает внести запить в лог.
Сейчас имею вот такой код, проблема в том, что при изменении адреса с 10.77.1.29 на 192.168.22.201, добавляется еще 1 символ, что приводит к сдвигу строк после команды $iPerfRes=$Array.Split(" "). Ну и соответственно в лог пишется 0
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
$ipList=@('10.77.1.29')#,'192.168.22.201','192.168.51.254')
$iPerf="C:\iperf\iperf2.exe" #создаем переменную
$ipList | %{
$Param="-c $_ -p 12344 -t 10 -w 32768" #создаем переменную с параметрами запуска iPerf
$Param = $Param.Split(" ") # не знаю, что это значит. где подсмотрел
$Array= & "$iPerf" $Param # создаем переменную, запускаем iPerf с параметрами, загружаем результат в переменную(массив строк)
$iPerfRes=$Array.Split(" ") #разбиваем массив на строки
$Speed=[int32]$iPerfRes[47] #преобразуем 47 строку в число
if ($Speed -lt "100") { # если число < 100 то записываем в лог
$datetime=Get-Date -UFormat "%d/%m/%Y %H:%M " 
Out-File -FilePath C:\iperf\test.log -InputObject `n$datetime, 'IP ',$_,' Speed ',$Speed -append -NoNewline #Дописываем в лог файл $date и строки массива.
}
}
Как мне выдернуть цифры перед Mbits/sec? Я пробовал через for, через foreach, через where. Найти Mbits/sec получается, а как указать предыдущий элемент массива в случае нахождения Mbits/sec не могу понять.
Такой способ вообще выдает ошибку, что не может сконвертировать
Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Int32"
PowerShell
1
for ($i=0, $iPerfRes[$i] -eq "Mbits/sec", $i++) {$iPerfRes[$i-1]}
Научите, пожалуйста!

Добавлено через 32 минуты
Я попробовал через работу со строкой, но получил ту же самую проблему.
PowerShell
1
2
3
4
5
6
7
$str=$Array[6] # передаем строку из массива в обычную строку
$idexStr=$str.IndexOf("Mbits/sec") # находим индекс, номер позиции 
$idxA=$idexStr-5 # выставляем значение первого символа
$idxB=$idexStr-2 # выставляем значение последнего символа
$Speed=[system.String]::Join("", $str[$idxA..$idxB]) #убираем пробелы между символами 
$Speed=[int32]$Speed #преобразуем в инт 
$Speed #ура у нас есть цифра которую можно сравнивать с эталоном (100)
В итоге, если Mbits/sec сдвинулся, то все расчеты тоже двигаются.

Добавлено через 3 минуты
С другой стороны, это результат выдает программа а отсчет идет от искомой фразы, не должно там ничего сдвинуться

Но ведь должны быть более изящные решения!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2019, 16:17
Ответы с готовыми решениями:

Найти серию наибольшей длины, в которой предыдущий элемент меньше или равен последующего
Дан массив вещественных чисел A, содержащий N элементов. Найти серию наибольшей длины, в которой предыдущий элемент меньше или равен...

Найти серию наибольшей длины, в которой предыдущий элемент меньше или равен последующего
Дан массив вещественных чисел A, содержащий N элементов. Найти серию наибольшей длины, в которой предыдущий элемент меньше или равен...

Найти максимальный элемент и показать предыдущий элемент в матрице
Дана матрица, нужно найти макс. елемент и и показать предыдущий елемент. как ето реализовать через Stringgrid?? сори за нелепый...

4
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
30.05.2019, 19:07
Цитата Сообщение от Asshaker Посмотреть сообщение
Но ведь должны быть более изящные решения!
Если не обращать внимание на существование https://docs.microsoft.com/en-... s-pal-tool, то нужен собственный полноценный разбор строк и сохранение результата разбора в собственном об'екте, точнее, в массиве об'ектов.
0
210 / 59 / 26
Регистрация: 16.06.2016
Сообщений: 193
30.05.2019, 20:33
Лучший ответ Сообщение было отмечено Asshaker как решение

Решение

Asshaker, Регуляркой можно вытянуть.

PowerShell
1
[regex]::matches($Array[6],"(\d+\.\d+)\sMbits/sec$").groups[1].value
Удачи!
1
1 / 1 / 0
Регистрация: 29.05.2019
Сообщений: 55
31.05.2019, 09:10  [ТС]
Цитата Сообщение от AAT666 Посмотреть сообщение
Asshaker, Регуляркой можно вытянуть.

Удачи!
А не могли бы вы объяснить, что тут происходит?

PowerShell
1
$speed=[regex]::matches($Array[6],"(\d+\.\d+)\sMbits/sec$").groups[1].value
Я так понял, [regex]::matches это и есть регулярка, которая ищет совпадение в Array видимо целое число, точку, целое число, пробел, Mbits/sec, а вот что происходит дальше с символа $?
Я нашел материал по регуляркам там используется только форма
PowerShell
1
Get-Process | where {$_.name -match "sy[ns]"}
0
210 / 59 / 26
Регистрация: 16.06.2016
Сообщений: 193
31.05.2019, 10:53
Asshaker,

[regex] это конструкция из .NET

Примеров в сети много. Например, здесь ---> Регулярные выражения в Windows PowerShell

По самим регулярным выражениям, тоже все есть в сети.

Цитата Сообщение от Asshaker Посмотреть сообщение
которая ищет совпадение в Array видимо целое число, точку, целое число, пробел, Mbits/sec, а вот что происходит дальше с символа $?
Да, так и есть. А дальше [regex]::matches возвращает объект в котором есть Groups[] и у него value.

Если так интересно, то можно просто в PS запустить:

PowerShell
1
[regex]::matches("[196] 0.0-10.0 sec 113 MBytes 94.3 Mbits/sec","(\d+\.\d+)\sMbits/sec$")
И будет видно, что возвращается и изучать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.05.2019, 10:53
Помогаю со студенческими работами здесь

Удалить предыдущий элемент массива
Всем привет уже битых полтора часа не могу реализовать удаление предыдущего элемента массива. Суть заключается в том чтоб удалить...

Проверить, больше ли каждый последующий элемент массива, чем предыдущий
Подскажите пожалуйста, уперлась в проблему понимания массивов. Точнее что такое массив я, вроде понимаю, понимаю как его вывести,...

Найти среднее значение элементов массива, разделить каждый элемент на это значение
Вводится произвольный квадратный массив. Нужно найти среднее значение элементов этого массива, разделить каждый элемент на это среднее...

Как сделать чтобы при повторном нажатии на элемент из массива его предыдущий цвет возвращался?
Добрый день. Мне нужно повторно поменять цвет эллипса. Как сделать .чтобы при повторном нажатие на элемент из массива его предыущий...

В элемент Lebel или Edit записывается значение из массива слов
Есть массив слов(предложений) из него в эллемент label (edit) записывается значение


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru