Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
PowerShell - [решено] использование && и || при готовом true или false

Аватара для Elven

Ветеран


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

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


Такс, кто мне объяснит за пошик у меня мозг слегка подвисать начал от того во что я уперся:
есть такой фрагмент на баше
Код: Выделить весь код
~ /bin/true && echo "result: OK" || echo "result: KO"
result: OK

~ /bin/false && echo "result: OK" || echo "result: KO"
result: KO
и тут всё понятно, отдаем true или false и в зависимости от принятого выводим ОК или KO. пробуем сделать аналогично в пошике:
Код: Выделить весь код
$true 2>&1>$null && Write-Host "result: OK" || Write-Host "result: KO"
result: OK
с этим всё путём, так и ожидалось. а теперь
Код: Выделить весь код
$false 2>&1>$null && Write-Host "result: OK" || Write-Host "result: KO"
result: OK
втф? начал глубже копаться, добавил в вывод $? дык оказывается $? возвращает true и при $true, и при $false
Код: Выделить весь код
$true 2>&1>$null && Write-Host "result: OK ($?)" || Write-Host "result: KO ($?)"
result: OK (True)
$false 2>&1>$null && Write-Host "result: OK ($?)" || Write-Host "result: KO ($?)"
result: OK (True)
у кого есть сцыль на то чтобы почитать что-то про это дело? ну или своими словами можно, я не привередливый.

фрагменты, разумеется, до крайности упрощенные, на самом деле там многоэтажная конструкция (или многопайповая?) результатом которой является либо "true" либо "false", но не в виде "$?", а просто сами по себе. разумеется я это всё дело заменил if, но как и зачем оно так работает таки интересно.

Отправлено: 13:57, 13-05-2021

 

Аватара для Elven

Ветеран


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

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


upd: about_pipeline_chain_operators
Если кратко и по сути: есть то что мы передаем, а есть то что пошик читает. в данном случае мы передаем конкретное значение $true или $false, а пошик смотрит исключительно в $?
и на его взгляд вывод значения переменной $false как и $true вполне даже прошел успешно (т.е. вернул в $? - true) на основе чего и строятся условия этих pipeline chain operators (как бы это культурнее перевести? операторы цепочки конвейера? или просто операторы цепочки или операторы конвейера? - любой вариант режет слух). Не могу сказать что это хорошо, хотя и не могу утверждать что плохо. Это просто так, и никак иначе.

субъективное мнение: пошик создавался не за один день, было много на него накручено, когда я добрался до try catch finally - вообще полный восторг, наконец можно скрипт просто и элегантно завернуть в адекватную обработку ероров и/или ворнингов, настроить правильные постдействия... а теперь есть официальные примеры, в которых англицким по-белому написано (хоть и несколько иносказательно): забейте на ошибки, если они таки будут - вот вам || и радуйтесь этому как хотите. Ну а если ошибки нам неинтересны то и тем более &&

Отправлено: 16:01, 13-05-2021 | #2



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Elven:
или просто операторы цепочки или операторы конвейера? »
Как по мне, это самые, что ни на есть логические -И- и -ИЛИ-

Цитата Elven:
абейте на ошибки, если они таки будут - вот вам || и радуйтесь этому как хотите. Ну а если ошибки нам неинтересны то и тем более && »
это вряд ли...
https://docs.microsoft.com/en-us/pow...or-interaction
если исключение слева, то правую часть фиг получим..., что неверно в случае ||

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


Отправлено: 18:48, 13-05-2021 | #3


Ветеран


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

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


Цитата YuS_2:
если исключение слева, то правую часть фиг получим..., что неверно в случае || »
Код: Выделить весь код
 > $ErrorActionPreference = 'SilentlyContinue'
 > 1/0 && $true || $false
False
 > 0/1 && $true || $false
0
True

Отправлено: 19:50, 13-05-2021 | #4


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Foreigner:
$ErrorActionPreference = 'SilentlyContinue' »
А это вроде, как бы и не при чем?
В таком варианте вообще не будет прерывающих исключений...

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


Отправлено: 22:31, 13-05-2021 | #5


Ветеран


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

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


Цитата YuS_2:
А это вроде, как бы и не при чем? »
Это чтобы подавить вывод ошибки.

Отправлено: 23:42, 13-05-2021 | #6


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Foreigner:
Это чтобы подавить вывод ошибки. »
Да, это понятно... но:
Подавляя вывод ошибок при возникновении непрерывающих исключений, можем получить неожиданные результаты при разработке скрипта в целом. Можно, конечно, уповать на свою память и думать, что ошибки мы нигде не совершим, но... мне кажется, что это несколько самонадеянно.
Да, можно, в каждом командлете переопределять действие этой переменной параметром erroraction, но все эти действия точно нужны, для использования этих синтетических И и ИЛИ? До powershell 7.0 как-то ведь обходились без них...

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


Последний раз редактировалось YuS_2, 14-05-2021 в 08:07.


Отправлено: 07:53, 14-05-2021 | #7


Ветеран


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

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


Цитата YuS_2:
До powershell 7.0 как-то ведь обходились без них... »
Я и сейчас не прибегаю к такой конструкции. В основном:

Код: Выделить весь код
$ErrorActionPreference = 'Stop'

Try{}
Catch{}
Finally {} # редко
Главным образом при веб-запросах, например при обновлении FAR.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:02, 14-05-2021 | #8


Аватара для Elven

Ветеран


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

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


Цитата YuS_2:
Как по мне, это самые, что ни на есть логические -И- и -ИЛИ- »
нет. или по крайней мере не совсем. даже в bash или cmd/bat это не "И" и "ИЛИ", хоть их так и называют.

Цитата Foreigner:
Try{}
Catch{}
Finally {} »
кстати поведение || в try может стать еще более неожиданным чем мне до этого казалось.
Вот здесь всё банально и логично:
Код: Выделить весь код
Get-ChildItem nonexistfile || $true

Get-ChildItem: Cannot find path '/path/nonexistfile' because it does not exist.
True


1/0 || $true                       

RuntimeException: Attempted to divide by zero.
True
Просим возвращать true если имели ошибку - такое и получаем.
А теперь заворачиваем в try-catch:
c Get-Childitem получаем ожидаемый результат
Код: Выделить весь код
try {
  Get-ChildItem nonexistfile || $true
}
catch {
  Write-Error "$?"
}

Cannot find path '/path/nonexistfile' because it does not exist.

True
сиречь True, а вот с 1/0...

Код: Выделить весь код
try {
  1/0 || $true
}
catch {
  Write-Error "$?"
}

Write-Error: False
внезапно вываливаемся в catch.
Вот реально!

Последний раз редактировалось Elven, 14-05-2021 в 10:43.


Отправлено: 10:15, 14-05-2021 | #9


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Foreigner:
Я и сейчас не прибегаю к такой конструкции. »
Ну, вряд ли, эта конструкция предназначена для замены try-catch-finally, она скорее замена условному блоку, т.е. упрощение записи, а существующие -and и -or, выдают не результат выполнения операторов и их операндов, а булевый... скажем:
Код: Выделить весь код
$(ps) -and $(write-output test)
получим True, в отличие от:
Код: Выделить весь код
$(ps) && $(write-output test)
и до версии 7.0, подобное выражение, нам пришлось бы записать так:
Код: Выделить весь код
ps;if($?){write-output test}
т.е. по сути, вместо && и ||, это соответственно:
Код: Выделить весь код
function test-command ($a){return $a}
# && правый будет выполнен только если выполнен левый
test-command '1'; if ($?) {test-command '2'}
# || если левый операнд выполнен
test-command '1'; if (!$?) {test-command '2'}
# || если левый операнд не выполнен, выполняем правый
write-error 'error'; if (!$?) {test-command '2'}
Цитата Elven:
нет. »
Да, только результат будет не булевым, а именно то, что выполняет левый или правый операнд, всё просто, см. выше...

Цитата Elven:
даже в bash или cmd/bat это не "И" и "ИЛИ", хоть их так и называют. »
там, как раз, полные аналоги этих введеных операторов в ps 7.0

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


Последний раз редактировалось YuS_2, 14-05-2021 в 10:29.


Отправлено: 10:21, 14-05-2021 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PCI\VEN_10DE&DEV_006A&SUBSYS_1B311019&REV_A1 Вика_Керимова@vk Поиск драйверов, прошивок и руководств 3 11-04-2014 11:02
USB\VID_04F2&PID_B1E5&REV_2069&MI_00 перевёрнута вебка Марианна! Хочу все знать 1 28-03-2013 22:14
Драйвер - PCI\VEN_1095&DEV_3132&SUBSYS_71321095&REV_01\4&662654C&0&00E0 kalion-kill Поиск драйверов, прошивок и руководств 1 08-11-2009 16:45
WinXP & Win2K & Net &  Inet проблема!! Help! SDL2000 Сетевые технологии 5 19-10-2003 22:29




 
Переход