Войти

Показать полную графическую версию : Перехват ошибок


lox-ness
25-10-2019, 12:55
Добрый День!
Необходимо у активного сетевого интерфейса получить определенные сведения. Подключение к ПК производиться средствами 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
}

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

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

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

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

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




© OSzone.net 2001-2012