function ConvertTo-HostsFileEntry { <# .SYNOPSIS Convert the given record to a defined Hosts File Entry .OUTPUTS Returns a [object[]] of hosts entries. #> [CmdletBinding(DefaultParameterSetName = 'FromPipeline')] [OutputType([string[]])] param ( [Parameter(Mandatory = $false, ValueFromPipeline = $true, Position = 0, ParameterSetName = 'FromPipeline')] [string]$RawRecord, [Parameter(Mandatory = $true, ParameterSetName = 'Entries')] [ValidateNotNullOrEmpty()] [string]$IpAddress, [Parameter(Mandatory = $true, ParameterSetName = 'Entries')] [ValidateNotNullOrEmpty()] [string]$Hostname, [Parameter(Mandatory = $false, ParameterSetName = 'Entries')] [string]$Comment ) begin { # Define the defaults for the HostsFileEntry response to add some custom display information $defaultTypeName = 'HostsFileEntry' $defaultKeys = @('IPAddress') $defaultDisplaySet = @('IPAddress', 'Hostname', 'IsDisabled', 'Comment') $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultDisplaySet) $defaultKeyPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultKeyPropertySet',[string[]]$defaultKeys) $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet,$defaultKeyPropertySet) $disabledKey = "#DISABLED#" } process { $workingIpAddress = $IpAddress $workingHostname = $Hostname $workingComment = $Comment $isDisabled = $false $commentSeparator = -1 if ($PSCmdlet.ParameterSetName -eq 'FromPipeline') { $RawRecord = $RawRecord.Trim() if ($RawRecord.StartsWith($disabledKey)) { $isDisabled = $true $RawRecord = $RawRecord.Substring($disabledKey.Length).Trim() } $commentSeparator = $RawRecord.IndexOf("#") $workingComment = "" $keep = $false if ($commentSeparator -gt -1) { $splits = $RawRecord -split '#',2 $workingComment = $splits[1].Trim() $RawRecord = $splits[0].Trim() } if ($RawRecord.length -gt 0) { $bits = [regex]::Split($RawRecord, "\s+") if ($bits.count -gt 1) { $workingIpAddress = $bits[0].Trim() $workingHostname = $bits[1].Trim() } } } $keep = (($workingComment -imatch 'keep') -or ($workingIpAddress -eq $null)) $blankLine = ([string]::IsNullOrWhiteSpace($workingComment) -and [string]::IsNullOrWhiteSpace($workingIpAddress) -and ($commentSeparator -eq -1)) try { $hostEntryObject = New-Object PSCustomObject -Property @{ IpAddress = $workingIpAddress Hostname = $workingHostname Comment = $workingComment Keep = $keep BlankLine = $blankLine IsDisabled = $isDisabled } #Give this object a unique typename $hostEntryObject.PSObject.TypeNames.Insert(0,$defaultTypeName) $hostEntryObject | Add-Member -MemberType MemberSet -Name PSStandardMembers -Value $PSStandardMembers return $hostEntryObject } catch { Write-Warning "$logLead : Could not convert item to HostEntry object. Check error below. Returning `$null" Write-ErrorObject -ErrorItem $PSItem return $null } } } Set-Alias -Name New-HostsFileEntry -Value ConvertTo-HostsFileEntry