PSTemplateMaker.psm1


#
#
# PSTemplateMaker
#
#

$ErrorActionPreference = 'Stop'


Function New-PSModuleTemplate {

    <#
 
    .SYNOPSIS
    Create a new module template
 
    .DESCRIPTION
    Create a new module template and choose the type of structure, single or dynamic.
    Single means one module (psm1) containing all the functions, dynamic means dot-sourcing
    indvidual functions (ps1).
 
    .PARAMETER ModuleName
    The name of the new module
 
    .PARAMETER Path
    The location where the module (psm1) will be created
 
    .PARAMETER FunctionName
    The list of functions to be created
 
    .PARAMETER Dynamic
    Use this switch to create a dynamic module
 
    .EXAMPLE
    New-PSModuleTemplate -ModuleName MyAwesomeModule -Path C:\MyPowershellProjects
 
    .EXAMPLE
    New-PSModuleTemplate -ModuleName MyAwesomeModule -Path C:\MyPowershellProjects -Dynamic
 
    .EXAMPLE
    New-PSModuleTemplate -ModuleName MyAwesomeModule -Path C:\MyPowershellProjects -FunctionName Get-MyInfo, Set-MyInfo, Update-MyInfo
 
    .EXAMPLE
    New-PSModuleTemplate -ModuleName MyAwesomeModule -Path C:\MyPowershellProjects -FunctionName Get-MyInfo, Set-MyInfo, Update-MyInfo -Dynamic
 
    .NOTES
    - If a list of functions is entered, these will be added to the body of the module
    but if the -Dynamic switch is used then individual scripts will be created in the 'Scripts' directory
 
    - This cmdlet will also create a basic module manifest (psd1)
 
    .LINK
    N/A
 
    #>


    [CmdletBinding ()]

    Param (

        [Parameter (Mandatory = $True,
                    ValueFromPipeline = $False,
                    ValueFromPipelineByPropertyName = $False,
                    HelpMessage = 'Enter module name'
                   )
        ]

        [String]$ModuleName,

        [Parameter (Mandatory = $True,
                    ValueFromPipeline = $False,
                    ValueFromPipelineByPropertyName = $False,
                    HelpMessage = 'Enter module path'
                   )
        ]

        [String]$Path,

        [Parameter (Mandatory = $False,
                    ValueFromPipeline = $False,
                    ValueFromPipelineByPropertyName = $False,
                    HelpMessage = 'Enter function name'
                   )
        ]

        [String[]]$FunctionName,

        [Switch]$Dynamic

    )

    BEGIN {

        [String]$ModuleDynamicTemplate = @('
#
#
# [NAME] module description
#
#
 
 
$ErrorActionPreference = ''Stop''
 
 
# Get all the scripts
$ScriptsPath = Get-ChildItem -Path $PSScriptRoot\Scripts\*.ps1
 
# Dot-source the scripts
ForEach ($Script In $ScriptsPath) {
 
    . $Script.FullName
 
}'

        )

        [String]$ModuleSingleTemplate = @('
#
#
# [NAME] module description
#
#
 
 
$ErrorActionPreference = ''Stop''
 
 
#
# Module functions
#
 
'

        )

        [String]$FunctionTemplate = @('
Function [NAME] {
 
    <#
 
    .SYNOPSIS
 
    .DESCRIPTION
 
    .PARAMETER
 
    .EXAMPLE
 
    .NOTES
 
    .LINK
 
    #>
 
    [CmdletBinding ()]
 
    Param ()
 
    BEGIN {}
 
    PROCESS {}
 
    END {}
 
}'

        )

    }

    PROCESS {

        If ((Test-Path $Path\$ModuleName) -eq $False) {

            $FunctionToExport = @()

            Write-Verbose -Message "Created $ModuleName module directory"
            New-Item -Path $Path\$ModuleName -ItemType Directory | Out-Null

            If ($Dynamic) {

                Write-Verbose -Message "Created Scripts directory"
                New-Item -Path $Path\$ModuleName\Scripts -ItemType Directory | Out-Null

                If ($FunctionName) {

                    ForEach ($Function In $FunctionName) {

                        Write-Verbose -Message "Created script template $Function"
                        $TempCode = $FunctionTemplate.Replace('[NAME]', $Function)
                        Set-Content -Path $Path\$ModuleName\Scripts\$Function.ps1 -Value $TempCode

                        $FunctionToExport += $Function

                    }

                }

                Write-Verbose -Message "Created $ModuleName module template"
                $TempCode = $ModuleDynamicTemplate.Replace('[NAME]', $ModuleName)
                Set-Content -Path $Path\$ModuleName\$ModuleName.psm1 -Value $TempCode

            }

            Else {

                If ($FunctionName) {

                    $TempCode = @()

                    ForEach ($Function In $FunctionName) {

                        Write-Verbose -Message "Added function template $Function to module $ModuleName"
                        $TempCode += $FunctionTemplate.Replace('[NAME]', $Function) + "`r`n"

                        $FunctionToExport += $Function

                    }

                }

                Write-Verbose -Message "Created $ModuleName module template"
                $TempCode = $ModuleSingleTemplate.Replace('[NAME]', $ModuleName) + $TempCode
                Set-Content -Path $Path\$ModuleName\$ModuleName.psm1 -Value $TempCode

            }

        }

        Else {

            Write-Warning -Message "Module $ModuleName ($Path\$ModuleName) already exists"

            Break

        }

    }

    END {

        Write-Verbose -Message "Created $ModuleName module manifest"
        New-ModuleManifest -Path $Path\$ModuleName\$ModuleName.psd1 -RootModule $ModuleName'.psm1' -ModuleVersion 1.0.0 -FunctionsToExport $FunctionToExport -CmdletsToExport '' -AliasesToExport ''

        Write-Verbose -Message 'Creation complete'

    }

}


Function New-PSFunctionTemplate {

    <#
 
    .SYNOPSIS
    Create a new function template
 
    .DESCRIPTION
    Create a new function template (ps1)
 
    .PARAMETER FunctionName
    The name of the function
 
    .PARAMETER Path
    The location where the function (ps1) will be created
 
    .EXAMPLE
    New-PSFunctionTemplate -FunctionName Get-SomeStuff -Path C:\MyPowershellProjects\MyCoolModule
 
    .NOTES
    If you are creating a dynamic module the path for the functions must be 'Scripts' directory
 
    e.g:
    New-PSFunctionTemplate -FunctionName Get-SomeStuff -Path C:\MyPowershellProjects\MyCoolModule\Scripts
 
    .LINK
    N/A
 
    #>


    [CmdletBinding ()]

    Param (

        [Parameter (Mandatory = $True,
                    ValueFromPipeline = $False,
                    ValueFromPipelineByPropertyName = $False,
                    HelpMessage = 'Enter function name'
                   )
        ]

        [String[]]$FunctionName,

        [Parameter (Mandatory = $True,
                    ValueFromPipeline = $False,
                    ValueFromPipelineByPropertyName = $False,
                    HelpMessage = 'Enter function path'
                   )
        ]

        [String]$Path

    )

    BEGIN {

        [String]$FunctionTemplate = @('
Function [NAME] {
 
    <#
 
    .SYNOPSIS
 
    .DESCRIPTION
 
    .PARAMETER
 
    .EXAMPLE
 
    .NOTES
 
    .LINK
 
    #>
 
    [CmdletBinding ()]
 
    Param ()
 
    BEGIN {}
 
    PROCESS {}
 
    END {}
 
}'


         )

    }

    PROCESS {

        ForEach ($Function In $FunctionName) {

            $FunctionPath = $Path + '\' + $Function + '.ps1'

            If ((Test-Path $FunctionPath) -eq $False) {

                $FunctionCode = $FunctionTemplate.Replace('[NAME]', $Function)

                Write-Verbose -Message "Created $FunctionPath template"
                Set-Content -Path $FunctionPath -Value $FunctionCode.Trim()

            }

            Else {

                Write-Warning -Message "Function $FunctionPath already exists"

                Break

            }

        }

    }

    END {

        Write-Verbose -Message 'Creation complete'

    }

}