New-Function.psm1


<#
.SYNOPSIS
    Create a Global Function from input string, file or clipboard data
.DESCRIPTION
    Create a Global Function from input string, file or clipboard data
.NOTES
    Authors : Simon Godefroy - Simon.Godefroy@FocusedIT.co.uk
    Version : 1.0.3
    Date : 2022.05.07
        Update : 1.0.3
                    SG - 2022.05.07
                    Updated Description to include file
        Update : 1.0.2
                    SG - 2022.05.07
                    Added -File Parameter, Fixed ProcessFromClipboard
        Update : 1.0.1
                    SG - 2022.05.07
                    Initial Publish
        Update : 1.0.0
                    SG - 2022.05.07
                    Initial Script
.LINK
    http://www.FocusedIT.co.uk
#>



function New-Function{
    <#
    .SYNOPSIS
        Create a Global Function from input string, file or clipboard data
    .DESCRIPTION
        Create a Global Function from input string, file or clipboard data
    .EXAMPLE
        New-Function -Name "Invoke-TestScript" -Script `$Scriptblock
        Create a Global Function "Invoke-TestScript" from the data in variable Scriptblock
    .EXAMPLE
        New-Function -Name "Invoke-TestScript" -ProcessFromClipboard
        Create a Global Function "Invoke-TestScript" from the data in the clipboard
    .NOTES
        Author : Simon Godefroy - Simon.Godefroy@FocusedIT.co.uk
        Version : 1.0.0
        Date : 2022.05.07
            Update : 1.0.0
                        SG - 2022.05.07
                        Initial Script
    .LINK
        http://www.FocusedIT.co.uk
    #>

    [CmdletBinding(DefaultParameterSetName='String')]
    Param(
        [Parameter(ParameterSetName='String', Mandatory=$true)]
        [Parameter(ParameterSetName='Clipboard', Mandatory=$true)]
        [string]$Name ,
        [Parameter(ParameterSetName='String', Mandatory=$true)]
        [string]$ScriptString,
        [string]$Description,
        [Parameter(ParameterSetName='Clipboard', Mandatory=$true)]
        [switch]$ProcessFromClipboard,
        [Parameter(ParameterSetName='File', Mandatory=$true)]
        [string]$File,
        [string]$Alias,
        [switch]$Quiet
    )
    process{
        if($ProcessFromClipboard){
            
            try{
                if(Get-Clipboard){
                    $ClipData = Get-Clipboard
                }else{
                    throw "Clipboard Empty or not text"
                }
            }catch{
                Write-Error $global:Error[0] -ErrorAction Stop
            }
            $ClipData = $ClipData |?{$_ -notlike $null}
            $CommandData = $ClipData | Out-String
            $CmdScriptBlock = [Scriptblock]::Create($CommandData)
        }
        if($File){
            try{
                if($File -notlike "*.ps1"){
                    throw "File not PS1"
                }
            } catch {
                Write-Error $Error[0] -ErrorAction Stop
            }
            try{
                if(!(Test-Path $File)){
                    throw "File not found ($File)"
                }
            } catch {
                Write-Error $Error[0] -ErrorAction Stop
            }
            
            $FileDetails = Get-Item $File
            $CommandName = (($FileDetails.Name).SubString(0,$FileDetails.Name.LastIndexOf('.')))
            $CommandString = Get-Content $File -Raw
            $CmdScriptBlock = [Scriptblock]::Create($CommandString)
            
        }
        if($ScriptString){
            $CmdScriptBlock = [Scriptblock]::Create($ScriptString)
        }
        
        Set-Item Function:global:$Name -Value $CmdScriptBlock -Force
        if($Alias){
            Set-Alias $Alias $Name -Scope Global -Force
        }
        if(!($Quiet)){
        Write-Output $Name
            if($Description){
                Write-Output "($Description)"
            }
        }
    }

}