|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] использование && и || при готовом true или false |
|
|
PowerShell - [решено] использование && и || при готовом true или false
|
Ветеран Сообщения: 992 |
Такс, кто мне объяснит за пошик у меня мозг слегка подвисать начал от того во что я уперся:
есть такой фрагмент на баше ~ /bin/true && echo "result: OK" || echo "result: KO" result: OK ~ /bin/false && echo "result: OK" || echo "result: KO" result: KO с этим всё путём, так и ожидалось. а теперь втф? начал глубже копаться, добавил в вывод $? дык оказывается $? возвращает 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 |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить PM | Цитировать upd: about_pipeline_chain_operators
Если кратко и по сути: есть то что мы передаем, а есть то что пошик читает. в данном случае мы передаем конкретное значение $true или $false, а пошик смотрит исключительно в $? и на его взгляд вывод значения переменной $false как и $true вполне даже прошел успешно (т.е. вернул в $? - true) на основе чего и строятся условия этих pipeline chain operators (как бы это культурнее перевести? операторы цепочки конвейера? или просто операторы цепочки или операторы конвейера? - любой вариант режет слух). Не могу сказать что это хорошо, хотя и не могу утверждать что плохо. Это просто так, и никак иначе. субъективное мнение: пошик создавался не за один день, было много на него накручено, когда я добрался до try catch finally - вообще полный восторг, наконец можно скрипт просто и элегантно завернуть в адекватную обработку ероров и/или ворнингов, настроить правильные постдействия... а теперь есть официальные примеры, в которых англицким по-белому написано (хоть и несколько иносказательно): забейте на ошибки, если они таки будут - вот вам || и радуйтесь этому как хотите. Ну а если ошибки нам неинтересны то и тем более && |
Отправлено: 16:01, 13-05-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Crazy Сообщения: 1228
|
Профиль | Отправить PM | Цитировать Цитата Elven:
Цитата Elven:
https://docs.microsoft.com/en-us/pow...or-interaction если исключение слева, то правую часть фиг получим..., что неверно в случае || |
||
------- Отправлено: 18:48, 13-05-2021 | #3 |
Ветеран Сообщения: 1758
|
Цитата YuS_2:
|
|
Отправлено: 19:50, 13-05-2021 | #4 |
Crazy Сообщения: 1228
|
Профиль | Отправить PM | Цитировать Цитата Foreigner:
![]() В таком варианте вообще не будет прерывающих исключений... |
||
------- Отправлено: 22:31, 13-05-2021 | #5 |
Ветеран Сообщения: 1758
|
Цитата YuS_2:
|
|
Отправлено: 23:42, 13-05-2021 | #6 |
Crazy Сообщения: 1228
|
Профиль | Отправить PM | Цитировать Цитата Foreigner:
Подавляя вывод ошибок при возникновении непрерывающих исключений, можем получить неожиданные результаты при разработке скрипта в целом. Можно, конечно, уповать на свою память и думать, что ошибки мы нигде не совершим, но... мне кажется, что это несколько самонадеянно. ![]() Да, можно, в каждом командлете переопределять действие этой переменной параметром erroraction, но все эти действия точно нужны, для использования этих синтетических И и ИЛИ? До powershell 7.0 как-то ведь обходились без них... |
|
------- Последний раз редактировалось YuS_2, 14-05-2021 в 08:07. Отправлено: 07:53, 14-05-2021 | #7 |
Ветеран Сообщения: 1758
|
Цитата YuS_2:
Главным образом при веб-запросах, например при обновлении FAR. |
|
Отправлено: 09:02, 14-05-2021 | #8 |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить PM | Цитировать Цитата YuS_2:
Цитата Foreigner:
Вот здесь всё банально и логично: 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 А теперь заворачиваем в try-catch: c Get-Childitem получаем ожидаемый результат try { Get-ChildItem nonexistfile || $true } catch { Write-Error "$?" } Cannot find path '/path/nonexistfile' because it does not exist. True внезапно вываливаемся в catch. Вот реально! ![]() |
||
Последний раз редактировалось Elven, 14-05-2021 в 10:43. Отправлено: 10:15, 14-05-2021 | #9 |
Crazy Сообщения: 1228
|
Профиль | Отправить PM | Цитировать Цитата Foreigner:
получим True, в отличие от: и до версии 7.0, подобное выражение, нам пришлось бы записать так: т.е. по сути, вместо && и ||, это соответственно: 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:
|
|||
------- Последний раз редактировалось YuS_2, 14-05-2021 в 10:29. Отправлено: 10:21, 14-05-2021 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|