![]() |
использование && и || при готовом true или false
Такс, кто мне объяснит за пошик у меня мозг слегка подвисать начал от того во что я уперся:
есть такой фрагмент на баше Код:
~ /bin/true && echo "result: OK" || echo "result: KO" Код:
$true 2>&1>$null && Write-Host "result: OK" || Write-Host "result: KO" Код:
$false 2>&1>$null && Write-Host "result: OK" || Write-Host "result: KO" Код:
$true 2>&1>$null && Write-Host "result: OK ($?)" || Write-Host "result: KO ($?)" фрагменты, разумеется, до крайности упрощенные, на самом деле там многоэтажная конструкция (или многопайповая?) результатом которой является либо "true" либо "false", но не в виде "$?", а просто сами по себе. разумеется я это всё дело заменил if, но как и зачем оно так работает таки интересно. |
upd: about_pipeline_chain_operators
Если кратко и по сути: есть то что мы передаем, а есть то что пошик читает. в данном случае мы передаем конкретное значение $true или $false, а пошик смотрит исключительно в $? и на его взгляд вывод значения переменной $false как и $true вполне даже прошел успешно (т.е. вернул в $? - true) на основе чего и строятся условия этих pipeline chain operators (как бы это культурнее перевести? операторы цепочки конвейера? или просто операторы цепочки или операторы конвейера? - любой вариант режет слух). Не могу сказать что это хорошо, хотя и не могу утверждать что плохо. Это просто так, и никак иначе. субъективное мнение: пошик создавался не за один день, было много на него накручено, когда я добрался до try catch finally - вообще полный восторг, наконец можно скрипт просто и элегантно завернуть в адекватную обработку ероров и/или ворнингов, настроить правильные постдействия... а теперь есть официальные примеры, в которых англицким по-белому написано (хоть и несколько иносказательно): забейте на ошибки, если они таки будут - вот вам || и радуйтесь этому как хотите. Ну а если ошибки нам неинтересны то и тем более && |
Цитата:
Цитата:
https://docs.microsoft.com/en-us/pow...or-interaction если исключение слева, то правую часть фиг получим..., что неверно в случае || |
Цитата:
Код:
> $ErrorActionPreference = 'SilentlyContinue' |
Цитата:
В таком варианте вообще не будет прерывающих исключений... |
Цитата:
|
Цитата:
Подавляя вывод ошибок при возникновении непрерывающих исключений, можем получить неожиданные результаты при разработке скрипта в целом. Можно, конечно, уповать на свою память и думать, что ошибки мы нигде не совершим, но... мне кажется, что это несколько самонадеянно. :) Да, можно, в каждом командлете переопределять действие этой переменной параметром erroraction, но все эти действия точно нужны, для использования этих синтетических И и ИЛИ? До powershell 7.0 как-то ведь обходились без них... |
Цитата:
Код:
$ErrorActionPreference = 'Stop' |
Цитата:
Цитата:
Вот здесь всё банально и логично: Код:
Get-ChildItem nonexistfile || $true А теперь заворачиваем в try-catch: c Get-Childitem получаем ожидаемый результат Код:
try { Код:
try { Вот реально! ![]() |
Цитата:
Код:
$(ps) -and $(write-output test) Код:
$(ps) && $(write-output test) Код:
ps;if($?){write-output test} Код:
function test-command ($a){return $a} Цитата:
Цитата:
|
Цитата:
Код:
Try { $null = dir fakedir -ea 'stop' } |
Вложений: 1
|
YuS_2, не тот кусок кода скопировал, мой косяк.
Код:
try { Цитата:
Код:
1/0 || $true |
Цитата:
Код:
try {$true} # замените на $false, потом на 1/0 |
Цитата:
Код:
Get-ChildItem nonexistfile || $true |
Цитата:
Код:
Get-ChildItem nonexistfile -ea 1 || $true |
Не объясняет поведения try-catch. Разумеется если дергать стоп при ошибке, то так оно и будет, но вопрос не в том как заставить пош делать так как нужно, а понять как же он вообще работает в данном случае, при находящемся $ErrorActionPreference в дефолтном Continue.
|
Цитата:
И кстати, именно этот момент описали в документации, я же ссылку выше приводил именно по этому поводу. Прерывающее исключение, прекращает работу операторов && и ||, т.е. завершает их работу и выдает результат только самого исключения. Цитата:
То бишь, чтобы всё было в одинаковых условиях, должно быть так: Код:
try { |
ок, если уровнять обе строки посредством $ErrorActionPreference = 'Stop', значит вроде как они рАвно должны отработать и при $ErrorActionPreference = 'Continue'.
|
Цитата:
|
Время: 01:48. |
Время: 01:48.
© OSzone.net 2001-