Лучший отвечающий
PoSh: Отключение сообщения об ошибке

Вопрос
-
есть скрипт...
------------------------------------------------------
param ([int]$start, [int]$end = $start)
[string]$range = '192.168.111.'
function GetWmiClass {
param ( $target = "" )
if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $comp -ErrorAction SilentlyContinue -Authentication Call) { return $wmi }
else { return $false }
}
$num = $start
while ($num -le $end) {
$comp = $range + $num
Write-Host $comp":`t`t" -NoNewline -ForegroundColor Gray
if (Test-Connection -ComputerName $comp -Quiet -Count 1) {
If ($wmi = GetWmiClass $comp ) {
Write-Host $wmi.Name"`t`t" -NoNewline -ForegroundColor DarkGreen
if ($wmi.UserName) { Write-Host $wmi.UserName -ForegroundColor DarkGreen }
else { Write-Host "Вход не выполнен" -ForegroundColor DarkGray }
}
else {
Write-Host "Ошибка доступа к WMI" -ForegroundColor DarkRed
}
}
else { Write-Host "Хост не доступен" -ForegroundColor DarkGray }
$num++
}
-----------------------------------------
на некоторых хостах видим
-----------------------------------------
Get-WmiObject : Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
D:\dev.scripts\getusers.ps1:6 знак:26
+ if ($wmi = Get-WmiObject <<<< -Class Win32_ComputerSystem -ComputerName $comp -ErrorAction SilentlyContinue -Authentication Call) { return $wmi }
+ CategoryInfo : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException<br/>
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
-----------------------------------------
как сделать чтоб ошибка не выводилась в консоль при выполнении скрипта?
-ErrorAction SilentlyContinue указано, но ошибка всё равно прёт
эээ...22 января 2010 г. 14:48
Ответы
-
Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.
AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com- Предложено в качестве ответа Vasily GusevModerator 23 января 2010 г. 6:35
- Помечено в качестве ответа OlegKrikun 23 января 2010 г. 10:26
23 января 2010 г. 6:33Модератор
Все ответы
-
Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.
AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com- Предложено в качестве ответа Vasily GusevModerator 23 января 2010 г. 6:35
- Помечено в качестве ответа OlegKrikun 23 января 2010 г. 10:26
23 января 2010 г. 6:33Модератор -
Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.
решил тоже поэксперемтировать.
для воспроизведения ошибки, возникающей у автора, использовал gwmi Win32_ComputerSystem -Impersonation Anonymous. Как ни станно, но при добавлении -ErrorAction SilentlyContinue, сообщение об ошибке действительно продолжает выводиться на экран, а, вот использование $ErrorActionPreference=silentlycontinue или trap{continue} приводит к желаемом резудьтату: сообщение об ошибке не выводится. Правда, не понятно - почему так происходит?
PS Вопрос Василию;) Интересно, а как можно отключить вывод сообщения об ошибке, возникающей, например, в следствие выполнения следующей команды: 1/0 (т.е. поделить некое число на нуль). Мне никак не удалось это сделать - сообщение об ошибке все время выводится на экран.23 января 2010 г. 7:25 -
для воспроизведения ошибки, возникающей у автора, использовал gwmi Win32_ComputerSystem -Impersonation Anonymous. Как ни станно, но при добавлении -ErrorAction SilentlyContinue, сообщение об ошибке действительно продолжает выводиться на экран
Попробовал так - действительно, на 1.0 -erroraction в таком случае не работает. Обоим срочно обновляться на 2.0 - там всё отлично :)
Что касается 1/0, то хоть и пишется что это RunTime Exception, на самом деле ошибка обнаруживается еще при разборе скрипта. Для PowerShell слишком очевидно что деление на ноль приведет к ошибке :) При желании отсрочить обнаружение ошибки на этап выполнения, когда уже будут работать различные методы перехвата ошибок, следует использовать не очевидное деление на ноль, а сделать например так:
1/$null
Значение переменной $null парсеру не очевидно, так что он её пропустит, а ошибка случится на этапе выполнения :)
AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com23 января 2010 г. 8:08Модератор -
> Попробовал так - действительно, на 1.0 -erroraction в таком случае не работает. Обоим срочно обновляться на 2.0 - там всё отлично :)
Не угадал. У меня уже давно PoSh 2.0, правда на win xp sp3 ;) Если PoSh v 1.0 у тебя установлен на XP, то, получается версия PoSh здесь не причем, а, вот, версия ОС очень даже важна...
PS > (get-host).version
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
>Что касается 1/0, то хоть и пишется что это RunTime Exception, на самом деле ошибка обнаруживается еще при разборе скрипта.
Действительно, похоже, что именно так и есть. Спасибо, мне это даже в голову не пришло.
... но, тогда получается, что это действительно совсем не RunTime Exception...23 января 2010 г. 9:24 -
Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
Вставка в скрипт $ErrorActionPreference = "SilentlyContinue" помогло, Спасибо!
Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.
а можно поподробнее? =) не понял что то...
эээ...23 января 2010 г. 10:26 -
>Не угадал. У меня уже давно PoSh 2.0, правда на win xp sp3 ;) Если PoSh v 1.0 у тебя установлен на XP, то, получается версия PoSh здесь не причем, а, вот, версия ОС очень даже важна...
Да, действительно, 1.0 у меня на XP. Кстати Get-Host возвращает версию хоста, которая вовсе не всегда совпадает с версией PowerShell. Версию PS надо смотреть в $PSVersionTable.psversion
AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com23 января 2010 г. 10:37Модератор -
Не
If ($wmi = GetWmiClass $comp ) {
а
$wmi = GetWmiClass $comp
if ($?) {
AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com23 января 2010 г. 10:39Модератор -
$wmi = GetWmiClass $comp
if ($?) {
эээ...23 января 2010 г. 10:42 -
Правильнее. Get-WmiObject может вполне успешно отработать не вернув ни одного объекта. А может наоборот вернуть несколько объектов, и одновременно выдать ошибку. В конкретном случае возврат объекта конечно эквивалентен успешному выполнению, но привычку лучше вырабатывать правильную ;)
AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com23 января 2010 г. 10:46Модератор -
Правильнее. Get-WmiObject может вполне успешно отработать не вернув ни одного объекта. А может наоборот вернуть несколько объектов, и одновременно выдать ошибку. В конкретном случае возврат объекта конечно эквивалентен успешному выполнению, но привычку лучше вырабатывать правильную ;)
эээ...23 января 2010 г. 10:48