Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Условие - любые два из всех

Ответить
Настройки темы
PowerShell - [решено] Условие - любые два из всех

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6705
Благодарности: 1576


Конфигурация

Профиль | Отправить PM | Цитировать


Привет!

Подскажите, пожалуйста, что-то я торможу. Есть несколько переменных.
Понадобилось написать условие, в котором любые две переменные из набора должны быть равны 2, иначе тревога.

Можно, конечно, и так написать:
Код: Выделить весь код
$1 = 4
$2 = 4
$3 = 2

if (($1 -ne 2 -and $2 -ne 2) -or ($2 -ne 2 -and $3 -ne 2) -or ($1 -ne 2 -and $3 -ne 2)) {
"Тревога!"
}
else {
"ОК"
}
Но это по-уродски, тем более, что будет, если переменных будет 100?

Как грамотно написать условие?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 09:28, 19-01-2022

 

Аватара для NickM

Ветеран


Contributor


Сообщения: 4635
Благодарности: 1115

Профиль | Отправить PM | Цитировать


Массив, после его сортировка, после сравнение двух соседних элементов, если они равны, то прерывание и выход с "OK", при достижении конца массива выход с "Тревога!".

UPD:
А Вам же только ДВОЙКИ считать? Тогда количество двоек в массиве и подсчитать.
Читая тему "PowerShell - Условие - любые два из всех" подумалось, что любые две переменные имели бы одинаковые значения.

Последний раз редактировалось NickM, 19-01-2022 в 09:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:51, 19-01-2022 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6705
Благодарности: 1576

Профиль | Отправить PM | Цитировать


Цитата NickM:
любые две переменные имели бы одинаковые значения »
Ну да. В данном случае двойки, но в целом может быть что угодно.

Я вообще про Zabbix спрашиваю, как там теперь реализовать.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 10:11, 19-01-2022 | #3


Аватара для NickM

Ветеран


Contributor


Сообщения: 4635
Благодарности: 1115

Профиль | Отправить PM | Цитировать


Офф-топ кончено, но на Паскале это могло бы выглядеть, например, так:
Скрытый текст
Код: Выделить весь код
const n=15;
var
v:array[1..n] of real;
k:integer;

procedure qSort(l,r:integer);
var i,j:integer;
    w,q:real;
begin
  i := l; j := r;
  q := v[(l+r) div 2];
  repeat
    while (v[i] < q) do inc(i);
    while (q < v[j]) do dec(j);
    if (i <= j) then
    begin
      w:=v[i]; v[i]:=v[j]; v[j]:=w;
      inc(i); dec(j);
    end;
  until (i > j);
  if (l < j) then qSort(l,j);
  if (i < r) then qSort(i,r);
end;

begin
randomize;
for k:=1 to n do begin               //Получаем массив значений
v[k]:=random(100);
writeln(round(v[k]));
end;
writeln('---');
qSort(1, n);                              //Сортируем массив
for k:=1 to n do begin
writeln(round(v[k]));
end;
writeln('---');
for k:=1 to n do 
if v[k]=v[k+1] then begin          //Сравниваем два соседних элемента, при совпадении выходим и сообщаем, что нашли
writeln(round(v[k]), ' , OK!');
break;
end;
if k=n then writeln('Nothing');   //Двух одинаковых не нашли - сообщаем об этом
end.

Осталось только на Powershell переложить

Отправлено: 10:45, 19-01-2022 | #4


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6705
Благодарности: 1576

Профиль | Отправить PM | Цитировать


Цитата NickM:
сравнение двух соседних элементов, если они равны, то прерывание и выход с "OK" »
Двух соседних, совпадающих с двойкой, верно?

Да, видать, только поиск в массиве.

Код: Выделить весь код
$1 = 2
$2 = 4
$3 = 4

if (($1,$2,$3 -eq 2).count -ne 2) {
"Тревога!"
}
else {
"ОК"
}
В Заббиксе тупо решил суммой...
Код: Выделить весь код
sum(last(/Ramos Ultra/drycontactSensor[4]),last(/Ramos Ultra/drycontactSensor[6]),last(/Ramos Ultra/drycontactSensor[8]))<>8

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 11:08, 19-01-2022 | #5


Аватара для NickM

Ветеран


Contributor


Сообщения: 4635
Благодарности: 1115

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Двух соседних, совпадающих с двойкой, верно? »
Любых, меньших/ первых (т.к. массив сортируется по возрастанию) совпадающих в массиве.
Выше приведённый пример на Паскале демонстрирует это.

Отправлено: 12:05, 19-01-2022 | #6


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6705
Благодарности: 1576

Профиль | Отправить PM | Цитировать


Ну любых не подойдёт же. Если массив, например, 4444444211111, то это не сработает.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 13:03, 19-01-2022 | #7


Аватара для NickM

Ветеран


Contributor


Сообщения: 4635
Благодарности: 1115

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Если массив, например, 4444444211111, то это не сработает. »
Т.е. типа такого?

Скрытый текст
Код: Выделить весь код
const n=15;
const f=2;
var
v:array[1..n] of real;
k:integer;

procedure qSort(l,r:integer);
var i,j:integer;
    w,q:real;
begin
  i := l; j := r;
  q := v[(l+r) div 2];
  repeat
    while (v[i] < q) do inc(i);
    while (q < v[j]) do dec(j);
    if (i <= j) then
    begin
      w:=v[i]; v[i]:=v[j]; v[j]:=w;
      inc(i); dec(j);
    end;
  until (i > j);
  if (l < j) then qSort(l,j);
  if (i < r) then qSort(i,r);
end;

begin
randomize;
for k:=1 to n do begin               //Получаем массив значений
v[k]:=random(10)+1;
writeln(round(v[k]));
end;
writeln('---');
qSort(1, n);                              //Сортируем массив
for k:=1 to n do begin
writeln(round(v[k]));
end;
writeln('---');
for k:=1 to n do 
if (v[k]=f) and (v[k]=v[k+1]) then begin          //Сравниваем два соседних элемента, при совпадении выходим и сообщаем, что нашли
writeln(round(v[k]), ', Ok, found!');
break;
end;
if k=n then writeln('Nothing found.');   //Двух одинаковых не нашли - сообщаем об этом
end.


Некоторые результаты:
Скрытый текст
Код: Выделить весь код
---
1
1
1
2
2
3
3
3
5
7
8
9
10
10
10
---
2, Ok, found!
Код: Выделить весь код
---
1
3
3
4
5
5
6
8
8
8
8
9
9
10
10
---
Nothing found.
Код: Выделить весь код
---
1
1
1
2
3
4
5
6
6
6
6
7
8
9
9
---
Nothing found.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:25, 19-01-2022 | #8


Deadooshka


Сообщения: 2566
Благодарности: 698

Профиль | Отправить PM | Цитировать


Можно использовать делегата сортировки массива (List), но там сравнение может быть не по порядку, в зависимости от алгоритма сортировки.

Код: Выделить весь код
$1 = 4
$2 = 4
$3 = 2

[Comparison[object]]$func = {
	param($i, $j)
	if ($i -eq $j) { return }
	$v1 = gv $i -ValueOnly; $v2 = gv $j -ValueOnly
	if ($v1 -ne 2 -and $v2 -ne 2) { 
		Write-Host "`$$i = $v1; `$$j = $v2";
		throw 'тревога' 
	}
}
$list = [Collections.Generic.List[object]](
	get-variable | where Name -match '\d+').Name
if ($list.Length) {
	try { $list.Sort($func); 'OK' }
	catch { $Error[1].FullyQualifiedErrorId }
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:51, 19-01-2022 | #9


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6705
Благодарности: 1576

Профиль | Отправить PM | Цитировать


Я так понимаю, что эффективнее всего выцеплять из массива нужные значения и потом подсчитывать их количество. Или нет?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 15:17, 19-01-2022 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Условие - любые два из всех

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удаление всех файлов с заданными разрешениями из указанной папки и всех ее подпапок Alexander_88 Скриптовые языки администрирования Windows 5 30-11-2015 00:59
CMD/BAT - [решено] Удаление всех файлов (всех типов) из всех подпапок, кроме расширений txt kot318 Скриптовые языки администрирования Windows 10 12-02-2015 15:48
CMD/BAT - Удаление всех файлов из подпапок Scumtron Скриптовые языки администрирования Windows 2 17-10-2013 16:15
Win32 API - Копирование всех файлов из директории DaRiYs Программирование и базы данных 4 03-09-2009 23:36
Условие кодировки. Редактирование файла из cmd. Mss Автоматическая установка Windows 2000/XP/2003 4 19-05-2005 23:25




 
Переход