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' } } |