PoshNmap.psm1



if ($psEdition -ne 'Core') {
    $dotNetTarget = "net40-client"
}

#Special Newtonsoft Handling
try {
    $loadedNewtonsoftVersion = [version]([newtonsoft.json.jsonconvert].assembly.fullname -replace '^.+Version=([\d\.]+),.+$','$1')
} catch {
    Write-Verbose "Newtonsoft.Json not loaded"
}
if ($PSEdition -ne 'Core') {
    if ($loadedNewtonSoftVersion) {
        if ($loadedNewtonSoftVersion.major -lt '11') {
            Write-Debug "Already loaded Newtonsoft.Json $loadedNewtonsoftVersion was detected and is less than version 11, falling back to compatible behavior"
            $SCRIPT:useLegacyXMLDeserializer = $true
        }
    } else {
        Add-Type -Path $PSSCriptRoot\PoshNmap\lib\Newtonsoft.Json-net40-client.dll
    }
}

#$AssembliesToLoad = Get-ChildItem -Path "$PSScriptRoot\lib\*-$dotNetTarget.dll" -ErrorAction SilentlyContinue

if ($AssembliesToLoad) {
    #If we are in a build or a pester test, load assemblies from a temporary file so they don't lock the original file
    #This helps to prevent cleaning problems due to a powershell session locking the file because unloading a module doesn't unload assemblies
    if ($BuildTask -or $TestDrive -or $env:BUILD_BUILDID) {
        write-verbose "Detected Invoke-Build or Pester, loading assemblies from a temp location to avoid locking issues"

        $TempAssembliesToLoad = @()
        foreach ($AssemblyPathItem in $AssembliesToLoad) {
            $TempAssemblyPath = [System.IO.Path]::GetTempFileName() + ".dll"
            Copy-Item $AssemblyPathItem $TempAssemblyPath
            $TempAssembliesToLoad += [System.IO.FileInfo]$TempAssemblyPath
        }

        $AssembliesToLoad = $TempAssembliesToLoad
    }

    $assembliestoLoad | Foreach-Object {
        [Reflection.Assembly]::LoadFile($AssembliesToLoad)
    }
}

#region SourceInit
#Dot source the files
Foreach($FolderItem in 'Private','Public') {
    $ImportItemList = Get-ChildItem -Path $PSScriptRoot\$FolderItem\*.ps1 -ErrorAction SilentlyContinue
    Foreach($ImportItem in $ImportItemList) {
        Try {
            . $ImportItem
        }
        Catch {
            throw "Failed to import function $($importItem.fullname): $_"
        }
    }
    if ($FolderItem -eq 'Public') {
        Export-ModuleMember -Function ($ImportItemList.basename | Where-Object {$PSitem -match '^\w+-\w+$'})
    }
}
#endregion SourceInit

#Import Settings files as global objects based on their filename
foreach ($ModuleSettingsItem in $ModuleSettings) {
    New-Variable -Name "$($ModuleSettingsItem.basename)" -Scope Global -Value (convertfrom-json (Get-Content -raw $ModuleSettingsItem.fullname)) -Force
}

#Export the public functions. This requires them to match the standard Noun-Verb powershell cmdlet format as a safety mechanism