Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/75: Рейтинг темы: голосов - 75, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 16

Запись в лог

29.01.2018, 14:24. Показов 13999. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос поднимала в рамках другой темы. Так как там это обсуждение не в тему, создала новую тему.

Хотела уточнить.
Хочу вносить информацию о некоторых операциях.
Например, успешно ли скопировался файл, успешно ли распаковался архив.
При этом мне нужна фиксация в логе, но чтобы при этом работа скрипта не прерывалась, а продолжалась дальше.

Чтобы отрабатывала ошибка в Try/Catch нужно -ea Stop указывать, но тогда прервется ведь дальнейшее выполнение, если например, не удалось распаковать какой-то один архив.
Если не ставить -ea Stop, то он продолжает как будто ошибки не было.

Как нужно фиксировать успешное выполнение в таких случаях?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.01.2018, 14:24
Ответы с готовыми решениями:

Запись действия Start-Process в лог
Всем приятных выходных. Кто знает, как выполнить запись действий по запускаемому процессу из Powershell? Мои исходные: $cfg =...

Удалить каталог и сделать запись в лог-файл
Доброго времени суток. Необходим скрипт, который бы удалял заранее заданные каталоги и делал запись в конец лог-файла, т.е. работал бы...

Запись в лог
Короче парсю с сайта два параметра который на всей старанице встречаются. my $page = $ua->get("site")->as_string; ...

18
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
29.01.2018, 17:05
Если честно, из всего вопроса понятно лишь желание заносить в журнал (и то непонятно системный или просто текстовый файл) данные о произведенных операциях. Попробую объяснить популярно на пальцах принципы обработки исключений в PS. А принципы в нем кому-то могут показаться довольно избыточными, но это только на первый взгляд. Чтобы не запутаться в дебрях, начать, пожалуй стоит с потоков. В зависимости от версии PS, последний поддерживает следующие потоки:
1 - все пучком
2 - эррор (не путать с эротикой)
3 - ворнинг (ахнунг, пердуперждение - нужное подчеркнуть)
4 - вербоз (или закулисье протекающей операции, см. параметр -Verbose)
5 - дебаг (по-русски отладка, хотя отладчика в PS как не было, так и нет)
Первые два из упомянутых потока поддерживаются во всех версиях без исключения, как никак без них журналирование ошибок было бы попросту невозможным. Чтобы понять как они работают, посмотрим на следующий пример:
PowerShell
1
2
3
4
5
6
7
PS> gci foo
gci : Не удается найти путь "E:\sandbox\foo", так как он не существует.
строка:1 знак:1
+ gci foo
+ ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\sandbox\foo:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Теперь попробуем эту же команду передать по конвейеру командлету Out-File (будем предполагать, что журналирование ведется в обычном текстовом файле):
PowerShell
1
2
3
4
5
6
7
PS> gci foo | Out-File log.log
gci : Не удается найти путь "E:\sandbox\foo", так как он не существует.
строка:1 знак:1
+ gci foo
+ ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\sandbox\foo:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Смотрим создался ли файл:
PowerShell
1
2
3
4
5
6
7
8
PS> gci log.log
 
    Каталог: E:\sandbox
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       29.01.2018     18:28              0 log.log
Файл есть, но, как видно из его размера, он пуст. Теперь проделаем то же, но перенаправим поток ошибок (2) в стандартный поток (1):
PowerShell
1
PS> gci foo 2>&1 | Out-File log.log
Как видим, операция "успешно" завершена (в хосте нет никакого криминала), и в журнал, как того и хотелось, занесена ошибка.
PowerShell
1
2
3
4
5
6
7
PS> gc log.log
gci : Не удается найти путь "E:\sandbox\foo", так как он не существует.
строка:1 знак:1
+ gci foo 2>&1 | out-file log.log
+ ~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\sandbox\foo:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Подобный подход не нарушает логики работы сценариев (исключение составляют фатальные ошибки хоста), а потому набор команд вроде:
PowerShell
1
PS> gci foo 2>&1 | Out-File log.log -Append;gci
является вполне действенным подходом. К слову, вместо Out-File можно использовать tee, чтобы ошибки выводились и в хост и в файл:
PowerShell
1
PS> gci foo 2>&1 | tee log.log -a; # прочие команды
Что касается try/cacth, то без явной необходиости лучше избегать данной конструкции впринципе. Некоторые адепты try/catch очень любят сексуализировать эту конструкцию, но применять ее стоит только в случаях когда неизвестно как себя поведет тот или иной ресурс (например, открытый поток), а его гарантированно нужно высвободить (finally), - и прочее в этом духе. Если желаете просто изолировать некоторый участок кода, способного привести к исключению, используйте trap,однако следует учитывать, что при помещении такого кода в trap встроенная переменная $Error не наполняется:
PowerShell
1
2
3
PS> $Error.Clear()
PS> trap { gci foo }
PS> $Error
Более подробно о trap:
PowerShell
1
PS> man about_trap
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2018, 19:48
greg zakharov, конечно, как альтернатива для Start-Transcript и Stop-Transcript, показанный вами пример с потоками это отличный вариант. Но, чаще от журналов требуется не просто запись сообщений с экрана, а ещё и дата, время, сообщение об ошибке и очень часто различная вспомогательная информация (свойства объектов, значение переменных и т.п.)

Вот, например что-то подобное (не подходит по какой то причине try, пусть будет trap или проверка $Error):

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function write-log ($message)
{
    "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') $message" | ac C:\Temp\log.log -enc Unicode
}
 
foreach ($file in (ls "$source\*" -In *.txt, *.zip))
{
    try{cp $file.fullname -dest $dest -ea stop}
    catch
    {
        write-log "Не удалось скопировать $($file.name), размер которого $($file.Length/1KB)KB, в $dest"
        write-log $_.exception.message
    }
}
А ещё trap или try позволяют среагировать только на нужный тип исключения.

Цитата Сообщение от greg zakharov Посмотреть сообщение
используйте trap,однако следует учитывать, что при помещении такого кода в trap встроенная переменная $Error не наполняется:

PowerShell
1
2
3
PS> $Error.Clear()
PS> trap { gci foo }
PS> $Error
Здесь вы что-то путаете, т.к. такой код не делает ничего, кроме очистки $Error, Trap же ловит все ошибки в скрипте, возникающие после себя и если в любом месте ниже возникла ошибка, выполняет свой скрипт блок:

PowerShell
1
2
3
4
5
$Error.Clear()
trap {'Ошибка!'; continue}
gci foo -EA Stop; $Error[0]
ps -id 0
gci foo1 -EA Stop
А вот пример ошибки записанной в $Error, которая возникла в скрипт-блоке trap:

PowerShell
1
2
3
4
$Error.Clear()
trap {'Ошибка!'; gci foo1 -EA 0; continue}
gci foo -EA Stop
$Error
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Ошибка!
gci : Не удается найти путь "C:\Temp\foo1", так как он не существует.
строка:2 знак:18
+ trap {'Ошибка!'; gci foo1 -EA 0; continue}
+                  ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo1:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 
gci : Не удается найти путь "C:\Temp\foo", так как он не существует.
строка:3 знак:1
+ gci foo -EA Stop
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


Или вы имели ввиду, что-то ещё?

Вообще же, использовать trap нужно очень внимательно, как вы верно написали man about_trap, т.к. есть очень тонкие моменты с областями действия (scope) и если есть глобальный trap можно легко вылететь из функции в основное тело скрипта. Плюс не следует забывать, что если есть только один trap в начале, тогда он будет ловить все возникающие ниже ошибки - иногда это очень удобно, а иногда просто не допустимо...

Добавлено через 10 минут
Цитата Сообщение от IrSh Посмотреть сообщение
Чтобы отрабатывала ошибка в Try/Catch нужно -ea Stop указывать, но тогда прервется ведь дальнейшее выполнение, если например, не удалось распаковать какой-то один архив.
Если не ставить -ea Stop, то он продолжает как будто ошибки не было.
Можете показать пример вызывающий проблемы?

Если у вас распаковка архивов идёт в foreach цикле, то Try/Catch сработает на ошибку, а затем продолжится выполнение скрипт-блока foreach со следующим объектом...
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
29.01.2018, 20:14
Цитата Сообщение от KDE777
Здесь вы что-то путаете
Увы, нет.
Цитата Сообщение от KDE777
PowerShell
1
2
3
4
$Error.Clear()
trap {'Ошибка!'; gci foo -EA 0; continue}
gci foo -EA Stop
$Error
Пошагово: очистка контейнера error, далее trap перехватывает выражение, которое может вызвать ошибку при этом контейнер error пуст, ибо ошибка перехвачена, а далее Вы просто дублируете то же выражение, которое приводит к сбою - естественно $error заполнится.
Цитата Сообщение от KDE777
Но, чаще от журналов требуется не просто запись сообщений с экрана, а ещё и дата, время...
Дык загляните в стек или в прочие потоки (если они поддерживаются хостом), обнаружите для себя много чего любопытного. Можно вообще создать кастомный поток через тип [PowerShell], который бы просто писал в лог ошибки в отформатированом как нужно виде по мере появления оных, не нарушая при этом целостности работы хоста и не жонглируя потоками.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2018, 21:51
Цитата Сообщение от greg zakharov Посмотреть сообщение
Увы, нет.
Пошагово: очистка контейнера error, далее trap перехватывает выражение, которое может вызвать ошибку при этом контейнер error пуст, ибо ошибка перехвачена, а далее Вы просто дублируете то же выражение, которое приводит к сбою - естественно $error заполнится.
Вы невнимательно посмотрели мой пример и его результат. Я специально выполнил после trap - gci foo, а внутри скрипт блока у trap - gci foo1 + показал вывод содержимого $Error.

В результате в $Error хранится уже два объекта: $Error[0] (ошибка возникшая в скрипт блоке trap) - gci : Не удается найти путь "C:\Temp\foo1"... и $Error[1] - gci : Не удается найти путь "C:\Temp\foo"...

Соответственно и $Error.Count будет равен 2, как впрочем и если обе команды будут gci foo


Цитата Сообщение от greg zakharov Посмотреть сообщение
Можно вообще создать кастомный поток через тип [PowerShell], который бы просто писал в лог ошибки в отформатированом как нужно виде по мере появления оных, не нарушая при этом целостности работы хоста и не жонглируя потоками.
Я это как раз всё это понимаю. И написал только про то, что gci foo 2>&1 | Out-File log.log -Append - является некоторой альтернативой Start-Transcript и Stop-Transcript, а для получения нормального лога нужно приложить чуть больше усилий, чем просто запись сообщений с экрана.

Не по теме:

У Exchange-сервера есть командлеты, которые при самой незначительной проблеме вываливают 3-4 экрана stacktrace-откровений и я представил себе какой получится лог при таком подходе :)

0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
29.01.2018, 22:10
Цитата Сообщение от KDE777
Вы невнимательно посмотрели мой пример и его результат.
Да хоть копипастом проверяй: в $Error одна единственная ошибка. Где Вы там нашли второе значение, знает видать только лукавый.
Цитата Сообщение от KDE777
...для получения нормального лога нужно приложить чуть больше усилий, чем просто запись сообщений с экрана.
Мда... напиши РоС безо всяких Get-Date, Вы также будете утверждать, дескать, нет, имелось совсем другое. Ну что ж, удачи в изобретении велосипеда.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2018, 22:29
Цитата Сообщение от greg zakharov Посмотреть сообщение
Да хоть копипастом проверяй: в $Error одна единственная ошибка. Где Вы там нашли второе значение, знает видать только лукавый.
Вы серьёзно? Вам не лень было написать два ответа - "не верю", вместо того чтобы проверить простейший пример?



Не по теме:

Но судя по предвзятому ко мне отношению, "Вы также будете утверждать, дескать, нет" - вывод $Error я написал сам, а скриншот нарисовал в mspaint.

0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2018, 22:35
И да - $Error.Clear() - естественно отрабатывает

PowerShell
1
$Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo -EA 1; $Error; $Error.Count
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
29.01.2018, 22:37
Цитата Сообщение от KDE777

Не по теме:

Но судя по предвзятому ко мне отношению, "Вы также будете утверждать, дескать, нет" - вывод $Error я написал сам, а скриншот нарисовал в mspaint.

В мыслях не было, но раз уж Вы сами озвучили эту мысль, то назовите причину не ставить под сомнение подлинность скриншота? Что касается предвзятости, даже как-то тошно от подобного рода мнительности.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
29.01.2018, 22:53
Цитата Сообщение от greg zakharov Посмотреть сообщение
В мыслях не было, но раз уж Вы сами озвучили эту мысль, то назовите причину не ставить под сомнение подлинность скриншота?
Я как то уже отвечал на подобное, в другой теме - верить не нужно мы не церкви, просто возьмите и выполните у себя этот же пример, ждать результата часами не придётся

Добавлено через 10 минут

Не по теме:

Цитата Сообщение от greg zakharov Посмотреть сообщение
Что касается предвзятости, даже как-то тошно от подобного рода мнительности.
Периодически на мои самые обычные вопросы или комментарии, вы отвечали таким тоном и в такой манере, что без всякой мнительности, это выходит за рамки вежливого общения.

0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
29.01.2018, 22:58
Цитата Сообщение от KDE777
Я как то уже отвечал на подобное, в другой теме - верить не нужно мы не церкви
А причем здесь, собственно, церковь? Верить можно во все что угодно.
Цитата Сообщение от KDE777
выполните у себя этот же пример, ждать результата часами не придётся
Конечно не займет, и результат более, чем предсказуем: 0 - трейсбэк с сообщением, о том что foo не найден - 1. Вам еще скриншот аттачить? Все это софистика. Лучше уж пойду приму ванну, выпью чашечку кофе и почитаю что-нибудь из художественной литературы.

Добавлено через 1 минуту
Цитата Сообщение от KDE777

Не по теме:

Периодически на мои самые обычные вопросы или комментарии, вы отвечали таким тоном и в такой манере, что без всякой мнительности, это выходит за рамки вежливого общения.

Не по теме:

Если так, давайте перейдем в ЛС, там и объяснимся/

0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
30.01.2018, 00:35
Цитата Сообщение от greg zakharov Посмотреть сообщение
Конечно не займет, и результат более, чем предсказуем: 0 - трейсбэк с сообщением, о том что foo не найден - 1. Вам еще скриншот аттачить?
Мне достаточно текстового вывода этой команды:

PowerShell
1
$Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo -EA 1; $Error; $Error.Count
Я проверил на Win7 SP1, Win8.1, Win10 (1709), Win2012R2 в PowerShell v2, v4 и v5.1 - везде результат одинаковый.

Давайте сравним - какие у вас версии OS и PS?

PowerShell 5.1

Кликните здесь для просмотра всего текста

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PS C:\Temp> $Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo -EA 1; $Error; $Error.Count
 
0
Ошибка!
gci : Не удается найти путь "C:\Temp\foo1", так как он не существует.
строка:1 знак:33
+ $Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Cou ...
+                                 ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo1:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 
gci : Не удается найти путь "C:\Temp\foo", так как он не существует.
строка:1 знак:74
+ ... бка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo -EA 1; $Error ...
+                                                     ~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 
2
PS C:\Temp> ($PSVersionTable).PSVersion
 
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      16299  98


PowerShell 4

Кликните здесь для просмотра всего текста

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PS C:\Temp> $Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo -EA 1; $Error; $Error.Count
 
0
Ошибка!
gci : Не удается найти путь "C:\Temp\foo1", так как он не существует.
строка:1 знак:33
+ $Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo ...
+                                 ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo1:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 
gci : Не удается найти путь "C:\Temp\foo", так как он не существует.
строка:1 знак:74
+ $Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo ...
+                                                                          ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 
2
PS C:\Temp> ($PSVersionTable).PSVersion
 
Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1


PowerShell 2

Кликните здесь для просмотра всего текста

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
PS C:\Temp> $Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo -EA 1; $Error; $Error.Count
0
Ошибка!
gci : Не удается найти путь "C:\Temp\foo1", так как он не существует.
 
строка:1 знак:36
+ $Error.Clear(); trap{'Ошибка!'; gci <<<<  foo1 -EA 0; continue}; $Error.Count; gci fo
o -EA 1; $Error; $Error.Count
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo1:String) [Get-ChildItem], I
   temNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemC
   ommand
 
gci : Не удается найти путь "C:\Temp\foo", так как он не существует.
 
строка:1 знак:77
+ $Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci <<<<  fo
o -EA 1; $Error; $Error.Count
    + CategoryInfo          : ObjectNotFound: (C:\Temp\foo:String) [Get-ChildItem], It
   emNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemC
   ommand
 
2
PS C:\Temp> ($PSVersionTable).PSVersion
 
Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1


Добавлено через 1 час 8 минут

Не по теме:

Цитата Сообщение от greg zakharov Посмотреть сообщение
Если так, давайте перейдем в ЛС, там и объяснимся
Вот только у вас отключен приём личных сообщений :)

Если вы заметили, не смотря на все попытки (причём не только ваши) перевести общение на форуме на личности, меня интересуют исключительно техническая сторона обсуждаемых вопросов.

На бессмысленные выяснения личных отношений я тратить время не собираюсь. И ещё раз повторю, что кроме технических деталей, никаких личных мотивов в моих вопросах нет.

И очень надеюсь, что вы greg zakharov, уважаемый мной, как профессионал в своей области, продолжите общение исключительно в техническом ключе.

Модератора, просьба удалить оффтопик из этого сообщения. Другой возможности предоставить желаемых объяснений, у меня не было.

1
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
30.01.2018, 10:37
greg zakharov, справедливости ради:
В данном вопросе, по trap-у, KDE777 полностью прав.
Инструкции trap{...} выполняются только при возникновении исключения во внешнем коде относительно самого trap
0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,885
30.01.2018, 11:01
In other words, your Trap construct has to be defined before the error happens; PowerShell won’t scan ahead to look for one.

Excerpt From: Don Jones, Jeffery Hicks, Richard Siddaway. “PowerShell in Depth, Second Edition.” iBooks.

Добавлено через 5 минут
а вот отрывок из другой книги:

The trap statement can appear anywhere in a block of code. This means that it may be specified after a statement that generates an error and still handle that error.
Windows PowerShell in Action, Second Edition

Кому верить ?
1
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
30.01.2018, 11:31
Цитата Сообщение от volodin661 Посмотреть сообщение
Кому верить ?
"Если на клетке слона увидишь надпись буйвол, не верь глазам своим"©Прутков

Ну, а если серьезно - что мешает проверить?
PowerShell
1
2
3
dir фигня -ea 1
trap {'Этот текст не будет напечатан, пока не будет исключения вовне... до trap-а или после него';continue}
dir другая_фигня -ea 1
1
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
30.01.2018, 11:43
Цитата Сообщение от volodin661 Посмотреть сообщение
In other words, your Trap construct has to be defined before the error happens; PowerShell won’t scan ahead to look for one.

а вот отрывок из другой книги:

The trap statement can appear anywhere in a block of code. This means that it may be specified after a statement that generates an error and still handle that error.
Кому верить ?
Практике

PowerShell
1
gci foo -EA Stop;'Test';trap{'Error'; continue}
Code
1
2
Error
Test
Т.е. из этого простого примера, действительно видно, что trap внезапно ловит ошибки и перед собой! При всём уважение к Дону Джонсу. Что ещё раз убеждает меня в том, что trap следует использовать с большой осторожностью.

Но спор был совсем не о том, когда срабатывает trap, а о том что ошибка при выполнение кода из скрипт-блока trap'а не попадает в $Error. Но самый простейший пример этого не подтверждает:

PowerShell
1
$Error.Clear(); trap{'Ошибка!'; gci foo1 -EA 0; continue}; $Error.Count; gci foo -EA 1; $Error.Count
Code
1
2
3
0
Ошибка!
2
Добавлено через 7 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
Ну, а если серьезно - что мешает проверить?
Золотые слова - постоянно удивляюсь, почему так часто вместо того, чтобы взять и проверить, начинают писать "не верю"...

Ваш пример и мой из предыдущего ответа, подтверждают (для меня внезапно) вторую цитату приведённую volodin661 из Windows PowerShell in Action, Second Edition.

PowerShell
1
2
3
dir фигня -ea 1
trap {'Этот текст не будет напечатан, пока не будет исключения вовне... до trap-а или после него';continue}
dir другая_фигня -ea 1
Code
1
2
Этот текст не будет напечатан, пока не будет исключения вовне... до trap-а или после него
Этот текст не будет напечатан, пока не будет исключения вовне... до trap-а или после него
0
 Аватар для volodin661
6688 / 2279 / 348
Регистрация: 10.12.2013
Сообщений: 7,885
30.01.2018, 11:49
Что любопытно, так это то, что trap, об'явленный на всех углах устаревшим и
тяжким наследием царского режима, тем не менее включен в новейший powershell core.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
30.01.2018, 13:04

Не по теме:

Цитата Сообщение от volodin661 Посмотреть сообщение
Что любопытно, так это то, что trap, об'явленный на всех углах устаревшим и
тяжким наследием царского режима, тем не менее включен в новейший powershell core
Хотелось бы сказать, что для backward compatibility, но глядя на то сколько всего выкинули, не уверен :)



Добавлено через 1 час 8 минут
Если уж столько написали про trap, на всякий случай демонстрация областей действия (scope). Возможно, кому-то это пригодится.

Если trap добавлен в основное тело скрипта (глобальная область) и есть функция, в которой свой trap не используется, при возникновение ошибке внутри функции её перехватит/обработает глобальный trap, а затем продолжит выполнение (при наличие Continue) в глобальной области, т.е. внутрь функции работа скрипта не вернётся:

PowerShell
1
2
3
4
function foo { 'Foo_Step1'; 1/0; 'Foo_Step3' }
 
trap {'Error!'; Continue}
'Main_Step1'; foo; 'Main_Step3'
Code
1
2
3
4
Main_Step1
Foo_Step1
Error!
Main_Step3
Иногда этого совсем не ожидают.

Таким же образом, trap прерывает выполнение foreach циклов:

PowerShell
1
2
trap {'Error!'; Continue}
'A'; 1..4 | %{if ($_ -eq 3) {1/0}; $_}; 'B'
Code
1
2
3
4
5
A
1
2
Error!
B
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
31.01.2018, 16:36
Цитата Сообщение от YuS_2
В данном вопросе, по trap-у, KDE777 полностью прав.
Инструкции trap{...} выполняются только при возникновении исключения во внешнем коде относительно самого trap-а
Раз двое говорят, что так должно быть, значит не без основания. Так оно и вышло. Действительно, встроенный trap пишет в $Error, у меня же этого не происходи(т|ло) из-за тяги переделывать кое-что под себя и в данном случае при вызове trap у меня вызывается копия этого оператора подстроенная под себя (расширение eHandling - набор инструментов для переопределения логики операторов и командлетов посредством патчинга на лету). Как-то уже привык, что trap не занимается журналированием. Такой вот казус.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2018, 16:36
Помогаю со студенческими работами здесь

Запись лог файла
Доброго времени суток, есть программа которая сниферит сетевую карту. события приходят в виде }] }] }] |psh}] }] |psh}] ...

Запись в лог по текущей расскладке
Здравствуйте. Пишу курсовую - кейлоггер. Есть честно стыренный код, но проблема в том что пишет только на английском. как получить текущую...

Запись из формы в отдельный лог
Имеем простую форму отправки заказа или еще чего то. Как сделать чтобы при нажатии веденные данные оправлялись по указанному action, но и...

Запись ошибок пхп в лог файл
Здравствуйте, в корне хоста имею файлы индексный, .htaccess, error.log. В файле .htaccess имеются строки #требуется для записи в лог...

Запись входа юзера в лог и другое..
Проблема номер один: Передо мной стоит задача: есть такой ресурс - www.combats.ru (авторизация начинается с enter.pl, но, надеюсь, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 19.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru