我在Windows Server 2012 R2中运行带有活动作用域的DHCP服务器,并且我已经创建了一个脚本,要求用户输入MAC地址,然后从示波器保留可用的ip到用户的MAC。
实际预订没有问题,但我已经引入了一个 IF ELSE 语句,希望条件表达式在保留成功时评估为TRUE,否则评估为FALSE。
但是表达式总是计算为FALSE,因为将cmdlet Get-DhcpServerv4Reservation 的执行存储到变量然后打印它会产生一个非常混乱的输出:基本上它会打印" DHCPServerv4Reservation"与作用域中存在的预留次数一样多,而不是直接执行cmdlet时给出的输出。
以下是代码:
clear-host
$mac=read-host -prompt "Please type the MAC address for the host "
$freeip=Get-DhcpServerv4FreeIPAddress -scopeid 10.10.10.0
Add-DhcpServerv4Reservation -ScopeId 10.10.10.0 -ClientId $mac -IPAddress $freeip
$reservedips=Get-DhcpServerv4Reservation -ScopeId 10.10.10.0
if ($reservedips -match $freeip) {
write-host "The ip $freeip has been succesfully reserved for the host with the MAC address $mac"
}
else {write-host "I'm sorry but there are no free ip addresses to be reserved"}
# this is just to see what's inside $reservedips
write-host $reservedips
为什么会这样?感谢
答案 0 :(得分:1)
Get-DhcpServerv4Reservation
的结果是预订对象。
-match
运算符用于将字符串与正则表达式匹配。
你可能会看到类似的东西:
if (($reservedips | Where-Object { $_.IPAddress -eq $freeip })) {
# success
}
我认为您考虑重构代码看起来像这样:
$mac=read-host -prompt "Please type the MAC address for the host "
$freeip=Get-DhcpServerv4FreeIPAddress -scopeid 10.10.10.0
try {
Add-DhcpServerv4Reservation -ScopeId 10.10.10.0 -ClientId $mac -IPAddress $freeip -ErrorAction Stop
} catch {
Write-Host "An error has occurred while trying to add a reservation for '$mac' with IP '$freeip'."
}
添加-ErrorAction Stop
会强制try
/ catch
阻止所有异常。
答案 1 :(得分:0)
这是我提出的替代方案,可行
clear-host
$mac=read-host -prompt "Please type the MAC address for the host "
$freeip=Get-DhcpServerv4FreeIPAddress -scopeid 10.10.10.0
Add-DhcpServerv4Reservation -ScopeId 10.10.10.0 -ClientId $mac -IPAddress $freeip
$reservedips=Get-DhcpServerv4Reservation -ScopeId 10.10.10.0 | Where-Object ipaddress -eq $freeip
if ($reservedips -eq "") {write-host "I'm sorry but there are no free ip addresses to be reserved"}
else {write-host "The ip $freeip has been succesfully reserved for the host with the MAC address $mac"}