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

Компьютерный форум 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

 

Ветеран


Contributor


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

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


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 {"Тревога"}
Наверное для массива можно поступить так же, но в цикле.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


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

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

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



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

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


Deadooshka


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

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


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

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


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

fascinating rhythm


Moderator


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

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


megaloman, интересный подход, спасибо.

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

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


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


Аватара для NickM

Ветеран


Contributor


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

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


Цитата Sham:
Непонятно»
Вот!
Непонятно было по первому посту.

Цитата DJ Mogarych:
условие такое - из всех переменных две обязательно должны быть равны 2, иначе тревога. »
Разве так?
Вы выше говорили, что не только равны между собою, но и ещё конкретному значению?!
2 Вы приводили лишь только в качестве конкретного примера, не так ли?

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


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

fascinating rhythm


Moderator


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

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


Цитата NickM:
2 Вы приводили лишь только в качестве конкретного примера, не так ли? »
Да.
Цитата DJ Mogarych:
В данном случае двойки, но в целом может быть что угодно. »
Давайте так: из всех переменных две обязательно должны быть равны X, иначе тревога.

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

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

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


Deadooshka


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

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


тогда можно и так, наверное
Код: Выделить весь код
(get-variable | where {$_.Name -match '^\d+$' -and $_.Value -eq 2}).Length
Это сообщение посчитали полезным следующие участники:

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


Аватара для NickM

Ветеран


Contributor


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

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


Цитата DJ Mogarych:
что эффективнее всего выцеплять из массива нужные значения и потом подсчитывать их количество »
Получается что так - можно обойтись одним циклом, причём от условий/ порядка переменных ещё и не полным перебором массива.

UPD: Как Мне кажется, предварительной сортировкой массива удобней пользоваться, т.к., зачастую, уже имеется готовый функционал, полагаю и в powershell тоже. Ну, а на выходе Мы уже имеем "подготовленный" массив, в котором уже достаточно сравнить только два соседних элемента - (i) и (i+1).

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


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


Ветеран


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

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


Цитата DJ Mogarych:
две обязательно должны быть равны X »
разве это не самый обычный поиск дубликата?
Код: Выделить весь код
$a = 1
$b = 2
$c = 3
$d = 2
$e = 5

$arr = @($a, $b, $c, $d, $e)
$alarm = $arr|group|where {$_.Count -gt 1}
if ($alarm) {'Alarm!'}
и да, если еще и задан дубль, то поиск будет еще быстрее:
Код: Выделить весь код
$a = 22
$b = 2
$c = 3
$d = 2
$e = 5

$arr = @($a, $b, $c, $d, $e)
$alarm = $arr -Match '^2$'|group
if ($alarm.Count -gt 1) {'Alarm!'}

Последний раз редактировалось alpap, 20-01-2022 в 02:50.

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

Отправлено: 01:52, 20-01-2022 | #18


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
Давайте так: из всех переменных две обязательно должны быть равны X, иначе тревога. »
для быстрого подсчета:
Код: Выделить весь код
$1,$2,$3,$4,$5,$n = 4,4,2,6,7,8
[int[]]$arr = $1,$2,$3,$4,$5,$n
$X = 2
if([linq.enumerable]::count($arr, [Func[int,bool]]{$args[0] -eq $X }) -lt 2){"Алярм"} else {"Норма"}
ЗЫ Условие надо бы уточнить: только две, или не меньше двух?

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 20-01-2022 в 08:34.

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

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


Ветеран


Contributor


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

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


Код: Выделить весь код
$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11 = 1, 32, 3.141526, 4, 5, 2, 754, 3.141526, 2, 398, 222
$x, $nx = 3.141526, 2
 
$Alarm = 0
($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11).ForEach({ $Alarm += $_ -eq $x })
if ($Alarm -ge $nx) {"OK"} else {"Тревога"}
Код: Выделить весь код
$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11 = 1, 32, 3.1415264, 4, 5, 2, 754, 3.141526, 2, 398, 222
$x, $nx = 3.141526, 2
 
$Alarm = (($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11).Where{ $_ -eq $x }).count -ge $nx
if ($Alarm) {"OK"} else {"Тревога"}

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-01-2022 в 19:52.

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

Отправлено: 19:18, 20-01-2022 | #20



Компьютерный форум 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




 
Переход