我有一个简单的脚本,用于查看 DHCP 中的 IP 范围并报告所有没有租约的地址。据说已经有一项功能可以做到这一点,但它似乎对我不起作用。
无论如何,我想了解的是为什么下面的代码没有捕获错误:
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:无法从 DHCP 服务器服务器名获取 IP 地址 172.30.218.255 的租约信息。
我有一个解决方法,但我想了解这里发生了什么。
解决方法也有可怕的红色文本,但至少当我将其重定向到文件时,我收集了我感兴趣的 ips:
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 }
}
答案1
从Get-Help about_Try_Catch_Finally
:
简短的介绍
描述如何使用 Try、Catch 和 Finally 块来处理终止错误。
只能捕获终止错误。你可以让 PowerShell 处理非-terminating 错误作为带有 的终止错误-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
。