Public/Get-AttckDataFiles.ps1

<#
.SYNOPSIS
    Get-AttckDataFiles gives the user access to different data files
.DESCRIPTION
    Get-AttckDataFiles is used internally and shouldn't be used externally
.PARAMETER AttckJson
    A switch to get AttckJson
.PARAMETER AttckDataset
     A switch to get AttckDataset
.EXAMPLE
    Get AttckJson
    C:/> Get-AttckDataFiles -AttckJson
.OUTPUTS
    json
.NOTES
    Created By: Josh Rickard (MSAdministrator)
    Date: 21JAN2020
#>

function Get-AttckDataFiles {
    [CmdletBinding(DefaultParameterSetName='attckjson',
                   SupportsShouldProcess=$true,
                   PositionalBinding=$false,
                   HelpUri = 'http://www.microsoft.com/',
                   ConfirmImpact='Medium')]
    [Alias()]
    [OutputType([String])]
    Param (
        # Gets AttckJson
        [Parameter(Mandatory=$true,
                   Position=0,
                   ValueFromPipeline=$true,
                   ParameterSetName='attckjson')]
        [switch]
        $AttckJson,

        # Gets external Attck Dataset
        [Parameter(Mandatory=$true,
                   Position=1,
                   ValueFromPipeline=$true,
                   ParameterSetName='attckdataset')]
        [switch]
        $AttckDataset
    )

    begin {
        $attckJsonUrl = 'https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json'
        $attckDatasetUrl = 'https://swimlane-pyattck.s3.us-west-2.amazonaws.com/generated_attck_data.json'

        $attckJsonPath = "$env:HOME\PSAttck\AttckJson.json"
        $attckDatasetPath = "$env:HOME\PSAttck\AttckDataset.json"

        Write-Debug -Message 'Checking for local configuration file first'

        $config = Get-PSAttckConfiguration
    }

    process {
        if ($config){
            if ($PSBoundParameters.ContainsKey('AttckJson')){
                Write-Debug -Message 'Getting ATT&CK json path based on config'

                if (-Not(Get-ChildItem -Path $config.AttckJsonPath -ErrorAction SilentlyContinue)){
                    New-Item -Path $config.AttckJsonPath -ItemType File -Force -ErrorAction SilentlyContinue | Out-Null
                    Invoke-RestMethod -Uri $attckJsonUrl -OutFile $config.AttckJsonPath | Out-Null
                    try{
                        Get-Content -Path $config.AttckJsonPath | ConvertFrom-Json | Write-Output
                    }
                    catch{
                        Set-PSAttckConfiguration -AttckJsonPath $config.AttckJsonPath
                        Get-Content -Path $config.AttckJsonPath | ConvertFrom-Json | Write-Output
                    }
                }
                else{
                    try{
                        Get-Content -Path $config.AttckJsonPath | ConvertFrom-Json | Write-Output
                    }
                    catch{
                        Set-PSAttckConfiguration -AttckJsonPath $config.AttckJsonPath
                        Get-Content -Path $config.AttckJsonPath | ConvertFrom-Json | Write-Output
                    }
                }
            }
            else{
                Write-Debug -Message 'Getting ATT&CK dataset json path based on config'

                if (-Not(Get-ChildItem -Path $config.AttckDatasetPath -ErrorAction SilentlyContinue)){
                    New-Item -Path $config.AttckDatasetPath -ItemType File -Force -ErrorAction SilentlyContinue | Out-Null
                    Invoke-RestMethod -Uri $attckDatasetUrl -OutFile $config.AttckDatasetPath | Out-Null
                    try{
                        Get-Content -Path $config.AttckDatasetPath | ConvertFrom-Json | Write-Output
                    }
                    catch{
                        Set-PSAttckConfiguration -AttckDatasetPath $config.AttckDatasetPath
                        Get-Content -Path $config.AttckDatasetPath | ConvertFrom-Json | Write-Output
                    }
                }
                else{
                    try{
                        Get-Content -Path $config.AttckDatasetPath | ConvertFrom-Json | Write-Output
                    }
                    catch{
                        Set-PSAttckConfiguration -AttckDatasetPath $config.AttckDatasetPath
                        $config
                        Get-Content -Path $config.AttckDatasetPath | ConvertFrom-Json | Write-Output
                    }
                }
            }
        }
        else{
            if ($PSBoundParameters.ContainsKey('AttckJson')){

                Write-Verbose -Message 'Downloading Mitre ATT&CK Json'
                Write-Debug -Message 'Downloading Mitre ATT&CK Json'

                if (-Not(Get-ChildItem -Path $attckJsonPath -ErrorAction SilentlyContinue)){
                    New-Item -Path $attckJsonPath -ItemType File -Force -ErrorAction SilentlyContinue | Out-Null
                    Invoke-RestMethod -Uri $attckJsonUrl -OutFile $attckJsonPath | Out-Null
                    Get-Content -Path $attckJsonPath | ConvertFrom-Json | Write-Output
                }
                else{
                    Get-Content -Path $attckJsonPath | ConvertFrom-Json | Write-Output
                }
                Set-PSAttckConfiguration -AttckJsonPath $attckJsonPath
            }
            else{
                Write-Verbose -Message 'Downloading Mitre ATT&CK dataset Json'
                Write-Debug -Message 'Downloading Mitre ATT&CK dataset Json'

                if (-Not(Get-ChildItem -Path $attckDatasetPath -ErrorAction SilentlyContinue)){
                    New-Item -Path $attckDatasetPath -ItemType File -Force -ErrorAction SilentlyContinue | Out-Null
                    Invoke-RestMethod -Uri $attckDatasetUrl -OutFile $attckDatasetPath | Out-Null
                    Get-Content -Path $attckDatasetPath | ConvertFrom-Json | Write-Output
                }
                else{
                    Get-Content -Path $attckDatasetPath | ConvertFrom-Json | Write-Output
                }
                Set-PSAttckConfiguration -AttckDatasetPath $attckDatasetPath
            }
        }
    }

    end {
    }
}