Functions/UpdateHosts.ps1
function Update-Hosts { [CmdletBinding()] param ( [Parameter(Mandatory)] [string] $Address, [Parameter(Mandatory)] [string[]] $Names ) if ($Address.Length -eq 0) { Write-Error "Address argument is required" -ErrorAction Stop; } if ($Names.Count -eq 0) { Write-Error "Names argument is required" -ErrorAction Stop; } $hostsList = @(); $hostsNamesList = @($Names); foreach ($hostRecord in Read-Hosts) { if ($hostRecord -is [HostRecord]) { # Define placeholder and fill it with found names $hostRecordPlaceholder = $null; # Iterate through hostnames that we didn't use yet foreach ($name in $hostsNamesList) { if ($hostRecord.Names -contains $name) { if ($null -eq $hostRecordPlaceholder) { # Create placeholder for new record $hostRecordPlaceholder = [HostRecord]::new(); $hostRecordPlaceholder.Address = $Address; } # Add new name to current placeholder $hostRecordPlaceholder.Names += $name; } } if ($null -ne $hostRecordPlaceholder) { # Remove name from the old record $hostRecord.Names = $hostRecord.Names | Where-Object { $PSItem -notin $hostRecordPlaceholder.Names }; if ($hostRecord.Names.Count -eq 0) { # Replace obsolete record with placeholder $hostRecord = $hostRecordPlaceholder; } else { # Looks like we need to keep record, so just prepend placeholder with actual data $hostsList += $hostRecordPlaceholder; } # Exlude host names we already added to the rusult list $hostsNamesList = $hostsNamesList | Where-Object { $PSItem -notin $hostRecordPlaceholder.Names }; } } # Keep it as is $hostsList += $hostRecord; } if ($hostsNamesList.Count -gt 0) { # Add placeholder for new value at the end of the list $hostRecord = [EmptyRecord]::new(); # Create placeholder for new records we didn't use yet $hostRecordPlaceholder = [HostRecord]::new(); $hostRecordPlaceholder.Address = $Address; $hostRecordPlaceholder.Names = $hostsNamesList; $hostsList += $hostRecord, $hostRecordPlaceholder; } Write-Hosts -Records $hostsList; } |