PowerShell - [решено] Условие - любые два из всех

Аватара пользователя
DJ Mogarych

PowerShell - [решено] Условие - любые два из всех

Сообщение DJ Mogarych »

Привет!



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

Понадобилось написать условие, в котором любые две переменные из набора должны быть равны 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?



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

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение megaloman »

DJ Mogarych, Ни разу не писал здесь посты в PowerShell - далёк от него.
Цитата DJ Mogarych:



любые две переменные из набора должны быть равны 2



Не обижайте ребёнка за наивность:

Код:

Код: Выделить всё

$1 = 222
$2 = 2
$3 = 2
if (($1 -eq 2) + ($2 -eq 2) + ($3 -eq 2) -ge 2) {"OK"} else {"Тревога"}

Или

Код:

Код: Выделить всё

$1 = 4
$2 = 7
$3 = 2
$Alarm=($1 -eq 2) + ($2 -eq 2) + ($3 -eq 2)
if ($Alarm -ge 2) {"OK"} else {"Тревога"}

Наверное для массива можно поступить так же, но в цикле.
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение DJ Mogarych »

Цитата NickM:



любые две переменные имели бы одинаковые значения
PowerShell - [решено] Условие - любые два из всех




Ну да. В данном случае двойки, но в целом может быть что угодно.



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

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение DJ Mogarych »

Офф-топ кончено, но
на Паскале
это могло бы выглядеть, например, так:



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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);
  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 переложить Изображение
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение DJ Mogarych »

Цитата NickM:



сравнение двух соседних элементов, если они равны, то прерывание и выход с "OK"
PowerShell - [решено] Условие - любые два из всех




Двух соседних, совпадающих с двойкой, верно?



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





Код:

Код: Выделить всё

$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
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение DJ Mogarych »

Цитата DJ Mogarych:



Двух соседних, совпадающих с двойкой, верно?
PowerShell - [решено] Условие - любые два из всех




Любых, меньших/ первых (т.к. массив сортируется по возрастанию) совпадающих в массиве.

Выше приведённый пример на Паскале демонстрирует это.
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение DJ Mogarych »

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

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение DJ Mogarych »

Цитата DJ Mogarych:



Если массив, например, 4444444211111, то это не сработает.
PowerShell - [решено] Условие - любые два из всех




Т.е. типа такого?





Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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);
  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.









Некоторые результаты:



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

---
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.
Аватара пользователя
NickM

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение NickM »

Можно использовать делегата сортировки массива (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 }
}
Аватара пользователя
Sham

Re: PowerShell - [решено] Условие - любые два из всех

Сообщение Sham »

Можно использовать делегата сортировки массива (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 }
}
Ответить

Вернуться в «Скриптовые языки администрирования Windows»