Functions/New-PSModule.ps1
function New-PSModule { param( [Parameter(Mandatory)] [string]$ModuleName, [parameter(Mandatory, HelpMessage='Enter the tags comma separated (i.e. tag1,tag2,tag3')] [string]$Tags, [parameter(Mandatory, HelpMessage='Module description')] [string]$Description, [switch]$Force, [array]$Extension = ('.pstemplate','.psm1','.psd1','.txt'), [Version]$TemplatizerVersion = '1.0.20', [String]$ConfigPath, [String]$Source = ([io.path]::Combine($PSScriptRoot,'..','MODULE_TEMPLATE')), [String]$Destination = (Join-Path (Get-Location) $ModuleName) ) <# .SYNOPSIS Creates a new module from a template module 'MODULE_TEMPLATE' #> $null = Get-PSRepository -ErrorAction SilentlyContinue $pst = Get-Module PSTemplatizer -ListAvailable | Where { $_.Version -gt $TemplatizerVersion } if(-not $pst) { Install-Module PSTemplatizer -RequiredVersion $TemplatizerVersion -Force } Import-Module PSTemplatizer -Verbose -RequiredVersion $TemplatizerVersion $params = @{ RegExDynamicReplacements = @{ "MODULE_TEMPLATE" = '$TemplateModuleName'; }; Author = "Axian, Inc."; CompanyName = "Axian, Inc."; Copyright = '� [[[DateTime]::Now.Year]] [[$CompanyName]]'; IconUri = ''; LicenseUri = "http://LICENSE_URI"; ModuleGuid = '[[[guid]::NewGuid().ToString()]]'; TemplateModuleName = $ModuleName; ProjectUri = 'http://PROJECT_URI'; Tags = ($Tags -split ',' | % { "'" + $_.Trim(@("'",'"')) + "'"}) -join ','; Description = $Description } if(-not $ConfigPath) { #Convention based location of parameters $ConfigPath = Join-Path $Source "template_parameters.json" if(!(Test-Path $ConfigPath -ErrorAction SilentlyContinue)) { Convert-HashTableToObject $params | ConvertTo-Json | Out-File -Encoding utf8 $ConfigPath } } Import-TemplateConfiguration -Path $configPath -Verbose if(Test-Path $Destination) { if($Force) { del $Destination -force -Recurse } else { throw "The destination module path '$Destination' already exists" } } copy $Source $Destination -Recurse -Force #Perform any token replacements in directory names Expand-TemplatesInDirectoryNames -SearchDirectory $Destination #Perform token replacments in files Expand-TemplateFileContent -SearchDirectory $Destination -Extension $Extension #Perform synamic regex replacements Expand-TemplateFileContent -SearchDirectory $Destination -Extension $Extension ` -Transform { param([Parameter(ValueFromPipeline=$true)][string]$Text, [string]$Path, [string]$Destination, [ref]$TotalExpansions) Replace-RegExDynamicContent -Replacements $params.RegExDynamicReplacements @PSBoundParameters } } |