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'

    }

}