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

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

 

Ветеран


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

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


Цитата Elven:
А теперь заворачиваем в try-catch »
На мой взгляд try-catch для этого не предназначен, его задача отловить ошибку, во всяком случае я его применяю в этом контексте -- отловить - вывести ошибку - прервать скрипт.

Код: Выделить весь код
Try { $null = dir fakedir -ea 'stop' }
Catch { "fakedir не существует"; return }

"fakedir существует, продолжаем"
Это сообщение посчитали полезным следующие участники:

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



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

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


Аватара для YuS_2

Crazy


Contributor


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

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



Цитата Elven:
внезапно вываливаемся в catch. »
хмм, а у меня так:
2021-5-14 13-37-16.png

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


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


Аватара для Elven

Ветеран


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

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


YuS_2, не тот кусок кода скопировал, мой косяк.
Код: Выделить весь код
try {
  1/0 || $true
}
catch {
  Write-Error "$?"
}

Write-Error: False
Цитата Foreigner:
его задача отловить ошибку, »
так и есть, но согласно логике описанной у ms строка
Код: Выделить весь код
  1/0 || $true
вроде как не содержит ошибки (точнее содержит, но превращает ее все равно в true), т.о. в catch вываливать не должно, но вываливается.

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


Ветеран


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

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


Цитата Elven:
точнее содержит, но превращает ее все равно в true »
Try ее и отлавливает, оно не руководствуется конечным результатом ($true или $false не важны), а лишь отлавливает ошибку:

Код: Выделить весь код
try {$true} # замените на $false, потом на 1/0
catch {'error'; return }

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

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


Аватара для Elven

Ветеран


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

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


Цитата Foreigner:
лишь отлавливает ошибку»
Значит отлавливает ее по-разному, иначе почему точно так же содержащая ошибку
Код: Выделить весь код
  Get-ChildItem nonexistfile || $true
возвращает True и в catch не вываливается?

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


Ветеран


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

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


Цитата Elven:
возвращает True и в catch не вываливается? »
Потому, что ее надо прерывать:
Код: Выделить весь код
Get-ChildItem nonexistfile -ea 1 || $true
$ErrorActionPreference = 'stop'; 1/0 || $true

Отправлено: 11:17, 14-05-2021 | #16


Аватара для Elven

Ветеран


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

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


Не объясняет поведения try-catch. Разумеется если дергать стоп при ошибке, то так оно и будет, но вопрос не в том как заставить пош делать так как нужно, а понять как же он вообще работает в данном случае, при находящемся $ErrorActionPreference в дефолтном Continue.

Отправлено: 11:25, 14-05-2021 | #17


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Elven:
не тот кусок кода скопировал, мой косяк. »
угу, понятно. Ну, что тут сказать, говорю же, синтетически внедренные операторы и видимо, их до конечного результата толком не отладили...
И кстати, именно этот момент описали в документации, я же ссылку выше приводил именно по этому поводу. Прерывающее исключение, прекращает работу операторов && и ||, т.е. завершает их работу и выдает результат только самого исключения.

Цитата Elven:
Значит отлавливает ее по-разному, иначе почему точно так же содержащая ошибку
возвращает True и в catch не вываливается?
»
конечно, по-разному. try-catch-finally не ловит непрерывающие исключения.
То бишь, чтобы всё было в одинаковых условиях, должно быть так:
Код: Выделить весь код
try {
    Get-ChildItem nonexistfile -ea 1|| $true
} catch {
    Write-Error "$?"
}

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


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


Отправлено: 11:26, 14-05-2021 | #18


Аватара для Elven

Ветеран


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

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


ок, если уровнять обе строки посредством $ErrorActionPreference = 'Stop', значит вроде как они рАвно должны отработать и при $ErrorActionPreference = 'Continue'.

Отправлено: 11:59, 14-05-2021 | #19


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Elven:
если уровнять обе строки посредством $ErrorActionPreference = 'Stop', значит вроде как они рАвно должны отработать и при $ErrorActionPreference = 'Continue'. »
Здесь в предложении ошибка, такая переменная всего одна и значение у неё тоже единственное. Но да, если присвоить ей значение Stop, соответственно все непрерывающие исключения, становятся прерывающими. Эта переменная воздействует именно на непрерывающие исключения, на прерывающие, она никак не влияет.

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


Отправлено: 12:17, 14-05-2021 | #20



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




 
Переход