У меня есть простой скрипт, который просматривает диапазон IP-адресов в DHCP и сообщает обо всех адресах, для которых нет аренды. Есть функция, которая якобы уже делает это, но, похоже, у меня она не работает.
В любом случае, я хочу понять, почему следующий код не обнаруживает ошибок:
for ($x = 2; $x -le 255; $x++)
{
$ip = "172.30.218.$x"
try
{
Get-DhcpServerv4Lease -IPAddress $ip -computername servername | out-null
}
catch
{
Write-Output $ip
}
}
Вместо этого я получаю это:
Get-DhcpServerv4Lease: не удалось получить информацию об аренде IP-адреса 172.30.218.255 от имени сервера DHCP-сервера.
У меня есть обходной путь, но я хотел бы понять, что здесь происходит.
Обходной путь также имеет ужасный красный текст, но, по крайней мере, я собираю интересующие меня IP-адреса, когда перенаправляю его в файл:
for ($x = 2; $x -lt 255; $x++)
{
$ip = "172.30.218.$x"
$temp = $null
$temp = Get-DhcpServerv4Lease -IPAddress $ip -computername servername
if ($temp -eq $null) { Write-Output $ip }
}
Из Get-Help about_Try_Catch_Finally
:
КРАТКОЕ ОПИСАНИЕ
Описывает, как использовать блоки Try, Catch и finally для обработки прерывающих ошибок.
Могут быть обнаружены только завершающие ошибки. Вы можете заставить PowerShell лечить не-определение ошибки как прерывающей ошибки с помощью -ErrorAction Stop
. Это будет catch
ошибку и запустите блок, как ожидалось. Обратите внимание, что это влияет только на поведение ошибок из Get-DhcpServer4Lease
. Вы можете указать $ErrorActionPreference = 'Stop'
вверху вашего скрипта, чтобы изменить его для всей области.
for ($x = 2; $x -le 255; $x++) {
$ip = "172.30.218.$x"
try {
Get-DhcpServerv4Lease -IPAddress $ip -ErrorAction Stop
} catch {
Write-Output "Can't find $ip"
}
}
Другой вариант, если вас не волнует ошибка, - SilentlyContinue
:
for ($x = 2; $x -le 255; $x++) {
$ip = "172.30.218.$x"
Get-DhcpServerv4Lease -IPAddress $ip -ErrorAction SilentlyContinue
}
Видеть Get-Help about_CommonParameters
для более подробной информации о ErrorAction
и ErrorVariable
.