Guiri
Guiri

Reputation: 79

powershell - storing cmdlet Get-DhcpServerv4Reservation into a variable and then printing it, doesn't give expected output

I'm running a DHCP server in Windows Server 2012 R2 with an active scope and I've made a script which asks the user for a MAC address and will then reserve an available ip from the scope to the user's MAC.

The actual reservation works without a problem but I've introduced an IF ELSE statement, with the hope that the conditional expression is evaluated as TRUE when a reservation is successful and to FALSE otherwise.

But the expression always evaluates to FALSE because storing the execution of the cmdlet Get-DhcpServerv4Reservation into a variable and then printing it, yields a really messed up output: basically it will print "DHCPServerv4Reservation" as many times as reservations present in the scope, instead of the output given when directly executing the cmdlet.

Here's the code:

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

Why is this happening? Thanks

Upvotes: 0

Views: 1709

Answers (2)

Guiri
Guiri

Reputation: 79

This is the alternative I have come up with, which works

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"}

Upvotes: 0

briantist
briantist

Reputation: 47792

The result of Get-DhcpServerv4Reservation is a reservation object.

The -match operator is for matching a string against a regular expression.

You might be looking to something like:

if (($reservedips | Where-Object { $_.IPAddress -eq $freeip })) {
    # success
}

I think you consider restructuring your code to look something like this:

$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'."
}

Adding -ErrorAction Stop forces all exceptions to be caught by the try/catch block.

Upvotes: 1

Related Questions