Public/New-PSPackage.ps1

<#
.SYNOPSIS
Creates a new powershell module structure
 
.DESCRIPTION
This function will create the required structure needed for your own powershell module.
 
.PARAMETER RootPath
The path of the where you would like to save your module. This is required.
 
.PARAMETER ModuleName
The name of the module that you would like to create. This is required.
 
.PARAMETER Author
The name of the module's author. This is required.
 
.PARAMETER Description
The description what the module will do. This is not required.
 
.INPUTS
None. You cannot pipe objects to Add-Extension.
 
.OUTPUTS
None unless you add the -Verbose parmeter.
 
.EXAMPLE
PS> New-PSPackage -RootPath 'C:\Users\admin\Powershell Modules' -ModuleName 'ADLink' -Author 'Dylan M'
 
.EXAMPLE
PS> New-PSPackage -RootPath 'C:\Users\admin\Powershell Modules' -ModuleName 'ADLink' -Author 'Dylan M' -Description "This is a cool module that links to AD!" -Verbose
The ADLink module has been successfuly created.
#>


function New-PSPackage
{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [string] $RootPath,
        [string] $ModuleName,
        [string] $Author,
        [Parameter(Mandatory=$false)]
        [string] $Description = ""
    )

    Begin
    {
        $SystemLocaleCode = (Get-WinSystemLocale).Name
        
        $PSM1Content = Get-Content -Raw -Path "$($PSModuleRoot)\bin\psm1.content"
        $TemplateFunction = Get-Content -Raw -Path "$($PSModuleRoot)\bin\template-function.ps1.content"

        if (Test-Path "$($RootPath)\$($ModuleName)") {

            Write-Error "Unable to create the '$($ModuleName)' module as the directory is dirty. Please delete the '$($ModuleName)' folder from '$($RootPath)' or specify a different path."
            break;

        }
        
    }

    Process
    {
        # Create Root Directory
        [void](New-Item -Path $RootPath -Name $ModuleName -ItemType "directory")
        [void](New-Item -Path "$($RootPath)\$($ModuleName)" -Name $ModuleName -ItemType "directory")

        # Create Sub Directory's
        [void](New-Item -Path "$($RootPath)\$($ModuleName)" -Name "Tests" -ItemType "directory")
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name $SystemLocaleCode -ItemType "directory")
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name "bin" -ItemType "directory")
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name "lib" -ItemType "directory")
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name "Private" -ItemType "directory")
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name "Public" -ItemType "directory")

        # Create Required Files
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\Tests\$($ModuleName).Tests.ps1" -ItemType File)
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name "$($ModuleName).Format.ps1xml" -ItemType File)
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name "$($ModuleName).psd1" -ItemType File)
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)" -Name "$($ModuleName).psm1" -ItemType File -Value $PSM1Content)
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)\Public" -Name "Template-Function.ps1" -ItemType File -Value $TemplateFunction)
        [void](New-Item -Path "$($RootPath)\$($ModuleName)\$($ModuleName)\$($SystemLocaleCode)" -Name "about_$($ModuleName).help.txt" -ItemType File)

        # Create Manifest
        New-ModuleManifest -Path "$($RootPath)\$($ModuleName)\$($ModuleName)\$($ModuleName).psd1" `
                   -RootModule "$($ModuleName).psm1" `
                   -Description $Description `
                   -Author $Author `
                   -FormatsToProcess "$ModuleName.Format.ps1xml"

        Write-Verbose "The $($ModuleName) module has been successfuly created."
    }
}