Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Перехват ошибок

Ответить
Настройки темы
PowerShell - Перехват ошибок

Пользователь


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

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


Добрый День!
Необходимо у активного сетевого интерфейса получить определенные сведения. Подключение к ПК производиться средствами WMI и на определенных ПК возникает ошибка подключения.
Если на ПК числиться более одного сетевого интерфейса, происходит перезапись в ячейке Excel последними найденными данными, ни как не получается корректно вставить блок try catch.

Код: Выделить весь код
Set-PSDebug -Trace 0
$Excel = New-Object -Com Excel.Application
$Excel.visible = $True
$Excel = $Excel.Workbooks.Add()

$Excel.Worksheets.Item(1).Name = "Данные"
$sheet = $Excel.WorkSheets.Item("Данные")

$Sheet.Cells.Item(1,1) = "Имя ПК"
$Sheet.Cells.Item(1,2) = "Имя Сетевого интерфейса"
$Sheet.Cells.Item(1,3) = "DNS"
$Sheet.Cells.Item(1,4) = "Primary WINS"
$Sheet.Cells.Item(1,5) = "Secondary WINS"
$Sheet.Cells.Item(1,6) = "DHCP Auto"
$intRow = 2

$WorkBook = $Sheet.UsedRange
$WorkBook.Interior.ColorIndex = 20
$WorkBook.Font.ColorIndex = 11
$WorkBook.Font.Bold = $True

$pc = Get-Content D:\2.txt

Foreach ($PS in $pc) {
try {
$DeviceID = Get-WmiObject Win32_NetworkAdapter -computer $PS -ErrorAction Stop | Where {$_.NetConnectionStatus -eq "2"} | Select DeviceID
$Index = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $PS | Where {$DeviceID.DeviceID -contains $_.Index} |
#$data = $index | Where {$DeviceID.DeviceID -contains $_.Index} | Select PSComputerName, Description, DNSServerSearchOrder, WINSPrimaryServer, WINSSecondaryServer, DHCPEnabled |
ForEach-Object {
$c = $_
$DNSServerSearchOrder = $c.DNSServerSearchOrder

$Sheet.Cells.Item($intRow,1) = $ps
$Sheet.Cells.Item($intRow,1).EntireColumn.AutoFit()

$Sheet.Cells.Item($intRow,2) = $c.Description
$Sheet.Cells.Item($intRow,2).EntireColumn.AutoFit()

$Sheet.Cells.Item($intRow,3) = "$DNSServerSearchOrder"
$Sheet.Cells.Item($intRow,3).EntireColumn.AutoFit()

$Sheet.Cells.Item($intRow,4) = $c.WINSPrimaryServer
$Sheet.Cells.Item($intRow,4).EntireColumn.AutoFit()

$Sheet.Cells.Item($intRow,5) = $c.WINSSecondaryServer
$Sheet.Cells.Item($intRow,5).EntireColumn.AutoFit()

$Sheet.Cells.Item($intRow,6) = $c.DHCPEnabled
$Sheet.Cells.Item($intRow,6).EntireColumn.AutoFit()
}
}
Catch {
$Sheet.Cells.Item($intRow,1) = $ps
$Sheet.Cells.Item($intRow,1).EntireColumn.AutoFit()
}
$intRow = $intRow + 1
}

Отправлено: 12:55, 25-10-2019

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Если версия Powershell на целевых машинах современная, гораздо удобнее пользоваться Get-NetAdapter, и вообще, лучше настроить так, чтобы можно было подключаться к удалённым машинам прямо самой консолью.
Если конечный файл xlsx, то для Powershell есть отличный модуль ImportExcel, позволяющий работать с такими файлами без Экселя.
В блоке try-catch не надо указывать ErrorAction.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 20:35, 25-10-2019 | #2



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

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


Пользователь


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

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


Добрый День!
Это как можно перехватывать ошибки не указывая ErrorAction -Stop? Что-то не припомню такого.
ImportExcel - это дополнительный модуль, при нашей орг структуре, использование сторонних модулей без особой необходимости не приемлемо.
Проблема не в том что используется для получения сведений, а в том что не можем корректно выполнить перехват ошибок.

Отправлено: 06:28, 28-10-2019 | #3


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата lox-ness:
Это как можно перехватывать ошибки не указывая ErrorAction -Stop? Что-то не припомню такого. »
Ошибки и исключения - не одно и то же.
Существуют прерывающие и не прерывающие ошибки. Прерывающие ошибки приводят к исключению, а исключение уже ловится в try-catch.
параметр команды:
Код: Выделить весь код
-ea 1
- приводит к искусственному исключению.

В командлетах есть возможность переопределять переменную, сохраняющую ошибки (то бишь для каждого можно назначить свою).
Пример
Код: Выделить весь код
gsv servicess,serv,notserv -ea 0 -errorvariable +var
- и анализировать переменную на предмет ошибок... зачем искусственно вызывать останов?

А прерывающие ошибки, уже отлавливать в try-catch...

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

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

Отправлено: 07:09, 28-10-2019 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Перехват ошибок

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
перехват GPRS exo Хочу все знать 0 03-03-2010 14:14
Перехват сообщений Bodler Microsoft Windows 2000/XP 21 08-03-2007 01:46
Delphi - Delphi | перехват проводника Crowner Программирование и базы данных 5 06-02-2007 18:30
Перехват обращения к принтеру knzsoft Программирование и базы данных 4 25-03-2006 23:13
Перехват ICQ Apock Программирование и базы данных 3 13-02-2004 16:59




 
Переход