PSProfile-Tools.psm1

function Install-PSProfileTools
{
    <#
        .SYNOPSIS
        Creates ProfileTools Config
 
        .DESCRIPTION
        The ProfileTools Config saves the import- and exportpaths for your PowerShell Profile.
 
        .PARAMETER ConfigPath
        The Path to the ProfileTools Config
 
        .PARAMETER ExportPath
        The Path the module will use to save your PowerShell Profile to.
 
        .EXAMPLE
        C:\PS> Install-PSProfileTools -ConfigPath "C:\Temp\" -ConfigName "ProfileSettings.json" -ExportPath "C:\Setup\Profile"
 
        .EXAMPLE
        C:\PS> Install-PSProfileTools -ExportPath "C:\Setup\Profile"
    #>

    [CMDletBinding()]
    param
    (
        [Parameter()]
        [string]$ConfigPath = "$env:USERPROFILE\ProfileTools",
        [Parameter()]
        [string]$ConfigName = "ProfileSettings.json",
        [Parameter(Mandatory)]
        [string]$ExportPath
    )

    if(!(Test-Path -Path $ConfigPath))
    {
        New-Item -ItemType Directory -Path $ConfigPath -Force
    }

    $Config = New-Object -TypeName psobject
    Add-Member -InputObject $Config -MemberType NoteProperty -Name "ExportPath" -Value $ExportPath
    Add-Member -InputObject $Config -MemberType NoteProperty -Name "ConsoleProfile" -Value "Microsoft.PowerShell_profile.ps1"
    Add-Member -InputObject $Config -MemberType NoteProperty -Name "ISEProfile" -Value "Microsoft.PowerShellISE_profile.ps1"

    $Config = $Config | Convertto-json -Depth 100 
    New-Item -ItemType File -Path "$ConfigPath\$ConfigName" -Value $Config -Force | Out-Null
    New-Item -Path HKLM:\Software\ProfileTools -Value "$ConfigPath\$ConfigName" -Force | Out-Null
}

function Get-PSProfile
{
    <#
        .SYNOPSIS
        Gets PSProfile from export path.
 
        .DESCRIPTION
        Gets PSProfile from the export path saved in the Profile Config.
 
        .PARAMETER Force
        Automatically replaces existing Profiles.
 
        .EXAMPLE
        C:\PS> Get-PSProfile
 
        .EXAMPLE
        C:\PS> Get-PSProfile -Force
    #>

    [CMDletBinding()]
    param
    (
        [Parameter()]
        [switch]$Force
    )

   
    $Config = Get-PSProfileConfig
    
    $Path = $Config.ExportPath
    $ConsoleProfileName = $Config.ConsoleProfile
    $ISEProfileName = $Config.ISEProfile

    $ProfilePath = "$env:USERPROFILE\Documents\WindowsPowerShell\"
    $ProfilePathConsole = "$ProfilePath\$ConsoleProfileName"
    $ProfilePathISE = "$ProfilePath\$ISEProfileName"

    $ConsolePath = "$Path\$ConsoleProfileName"
    $ISEPath = "$Path\$ISEProfileName"

    $CanCopyISE = $true
    $CanCopyConsole = $true
    if(!(Test-Path -Path $ConsolePath))
    {
        Write-Host "No Console Profile found in ExportPath. Make sure to save Profile first." -ForegroundColor Red
        $CanCopyConsole = $true
    }

    if(!(Test-Path -Path $ISEPath))
    {
        Write-Host "No ISE Profile found in ExportPath. Make sure to save Profile first." -ForegroundColor Red
        $CanCopyISE = $false
    }

    if($Force)
    {
        if($CanCopyISE -eq $true)
        {
            Copy-Item -Path $ISEPath -Destination $ProfilePathISE -Force
        }
        else 
        {
            break
        }
        if($CanCopyConsole -eq $true)
        {
            Copy-Item -Path $ConsolePath -Destination $ProfilePathConsole -Force
        }
        else 
        {
            break
        }
    }
    else
    {
        if($CanCopyISE -eq $true)
        {
            Copy-Item -Path $ISEPath -Destination $ProfilePathISE
        }
        else 
        {
            break
        }
        if($CanCopyConsole -eq $true)
        {
            Copy-Item -Path $ConsolePath -Destination $ProfilePathConsole
        }
        else 
        {
            break
        }
    }    
}

function New-PSProfile
{
    <#
        .SYNOPSIS
        Creates New PSProfile.
 
        .DESCRIPTION
        Creates empty PSProfile for Console and ISE.
 
        .PARAMETER OnlyConsole
        Only creates PSProfile for PS Console.
 
        .PARAMETER OnlyISE
        Only creates PSProfile for PS ISE.
 
        .PARAMETER Force
        Overrides existing PSProfile.
 
        .EXAMPLE
        C:\PS> New-PSProfile
 
        .EXAMPLE
        C:\PS> New-PSProfile -OnlyConsole
 
        .EXAMPLE
        C:\PS> New-PSProfile -OnlyISE -Force
    #>

    [CMDletBinding()]
    param
    (
        [Parameter()]
        [switch]$OnlyConsole,
        [Parameter()]
        [switch]$OnlyISE,
        [Parameter()]
        [switch]$Force
    )

    $Config = Get-PSProfileConfig
    
    $Path = $Config.ExportPath
    $ConsoleProfileName = $Config.ConsoleProfile
    $ISEProfileName = $Config.ISEProfile

    $ProfilePath = "$env:USERPROFILE\Documents\WindowsPowerShell\"
    $ProfilePathConsole = "$ProfilePath\$ConsoleProfileName"
    $ProfilePathISE = "$ProfilePath\$ISEProfileName"

    $ConsolePath = "$Path\$ConsoleProfileName"
    $ISEPath = "$Path\$ISEProfileName"

    if($Force)
    {
        if($OnlyConsole)
        {
            New-Item -Path $ProfilePathConsole -Force | Out-Null
        }
        elseif($OnlyISE)
        {
            New-Item -Path $ProfilePathISE -Force | Out-Null
        }
        else 
        {
            New-Item -Path $ProfilePathConsole -Force | Out-Null
            New-Item -Path $ProfilePathISE -Force | Out-Null
        }
    }
    else 
    {
        if($OnlyConsole)
        {
            New-Item -Path $ProfilePathConsole | Out-Null
        }
        elseif($OnlyISE)
        {
            New-Item -Path $ProfilePathISE | Out-Null
        }
        else 
        {
            New-Item -Path $ProfilePathConsole | Out-Null
            New-Item -Path $ProfilePathISE | Out-Null
        }
    }
}

function Save-PSProfile
{
    <#
        .SYNOPSIS
        Copies local PSProfile into ExportPath.
 
        .DESCRIPTION
        Copies local PSProfile into ExportPath.
 
        .PARAMETER Force
        Overrides existing PSProfile in ExportPath.
 
        .EXAMPLE
        C:\PS> Save-PSProfile
 
        .EXAMPLE
        C:\PS> Save-PSProfile -Force
    #>

    [CMDletBinding()]
    param
    (
        [Parameter()]
        [switch]$Force
    )

    $Config = Get-PSProfileConfig
    
    $Path = $Config.ExportPath
    $ConsoleProfileName = $Config.ConsoleProfile
    $ISEProfileName = $Config.ISEProfile

    $ProfilePath = "$env:USERPROFILE\Documents\WindowsPowerShell\"
    $ProfilePathConsole = "$ProfilePath\$ConsoleProfileName"
    $ProfilePathISE = "$ProfilePath\$ISEProfileName"

    $ConsolePath = "$Path\$ConsoleProfileName"
    $ISEPath = "$Path\$ISEProfileName"

    if(!(Test-Path -Path $ProfilePathISE))
        {
            Write-Host "No local ISE Profile found. Creating empty ISE Profile."
            New-Item -Path $ProfilePathISE | Out-Null
        }

        if(!(Test-Path -Path $ProfilePathConsole))
        {
            Write-Host "No local Console Profile found. Creating empty Console Profile."
            New-Item -Path $ProfilePathConsole | Out-Null
        }

    if($Force)
    {
        Copy-Item -Path $ProfilePathConsole -Destination $ConsolePath -Force
        Copy-Item -Path $ProfilePathISE -Destination $ISEPath -Force
    }
    else
    {
        Copy-Item -Path $ProfilePathConsole -Destination $ConsolePath
        Copy-Item -Path $ProfilePathISE -Destination $ISEPath
    }
}

function Edit-PSProfile
{
    <#
        .SYNOPSIS
        Opens PS ISE with PSProfile.
 
        .DESCRIPTION
        Opens PS ISE with PSProfile. Creates new one if no Profile exists.
 
        .PARAMETER Console
        Opens PS ISE with Console PSProfile. Default behaviour.
 
        .PARAMETER ISE
        Opens PS ISE with ISE PSProfile.
 
        .PARAMETER Admin
        Opens PS ISE with Console PSProfile as Admin.
 
        .PARAMETER All
        Opens PS ISE with Console and ISE PSProfile.
 
        .EXAMPLE
        C:\PS> Edit-PSProfile
 
        .EXAMPLE
        C:\PS> Edit-PSProfile -ISE
 
        .EXAMPLE
        C:\PS> Edit-PSProfile -All
 
        .EXAMPLE
        C:\PS> Edit-PSProfile -All -Admin
    #>

    [CMDletBinding(DefaultParameterSetName="Console")]
    param
    (
        [Parameter(ParameterSetName="Console")]
        [switch]$Console,
        [Parameter(ParameterSetName="ISE")]
        [switch]$ISE,
        [Parameter()]
        [switch]$Admin,
        [Parameter(ParameterSetName="All")]
        [switch]$All
    )

    $Config = Get-PSProfileConfig

    $Path = "$env:USERPROFILE\Documents\WindowsPowerShell\"
    $ConsoleProfileName = $Config.ConsoleProfile
    $ISEProfileName = $Config.ISEProfile

    $ConsoleProfilePath = "$Path\$ConsoleProfileName"
    $ISEProfilePath = "$Path\$ISEProfileName"

    if($ISE)
    {
        $Path = $ISEProfilePath
        if(!(Test-Path -Path $ISEProfilePath))
        {
            Write-Host "No local ISE Profile found. Creating empty ISE Profile."
            New-Item -Path $ISEProfilePath | Out-Null
        }
    }
    else
    {
        $Path = $ConsoleProfilePath
        if(!(Test-Path -Path $ConsoleProfilePath))
        {
            Write-Host "No local Console Profile found. Creating empty Console Profile."
            New-Item -Path $ConsoleProfilePath | Out-Null
        }
    }

    if($All)
    {
        if(!(Test-Path -Path $ISEProfilePath))
        {
            Write-Host "No local ISE Profile found. Creating empty ISE Profile."
            New-Item -Path $ISEProfilePath | Out-Null
        }

        if(!(Test-Path -Path $ConsoleProfilePath))
        {
            Write-Host "No local Console Profile found. Creating empty Console Profile."
            New-Item -Path $ConsoleProfilePath | Out-Null
        }
    }

    if($Admin)
    {
        if($All)
        {
            Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" -ArgumentList "-File $ConsoleProfilePath" -Verb runAs
            Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" -ArgumentList "-File $ISEProfilePath" -Verb runAs
        }
        else
        {
            Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" -ArgumentList "-File $Path" -Verb runAs
        }
    }
    else
    {
        if($All)
        {
            Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" -ArgumentList "-File $ConsoleProfilePath"
            Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" -ArgumentList "-File $ISEProfilePath"
        }
        else
        {
            Start-Process -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" -ArgumentList "-File $Path"
        }
    }
}

function Get-PSProfileConfig
{
    if(!(Test-Path -Path HKLM:\Software\ProfileTools))
    {
        Write-Host "PSProfileConfig not found. Create a Config with command 'Install-PSProfileTools'." -ForegroundColor Red
        break
    }

    if(!(Test-Path -Path ((Get-ItemProperty -Path HKLM:\Software\ProfileTools).psobject.properties.value[0])))
    {
        Write-Host "PSProfileConfig not found. Create a Config with command 'Install-PSProfileTools'." -ForegroundColor Red
        break
    }

    $PSProfileConfig = (Get-Content -Path ((Get-ItemProperty -Path HKLM:\Software\ProfileTools).psobject.properties.value[0]) | ConvertFrom-Json)

    return $PSProfileConfig
}