New-CommentHelp.ps1

#requires -version 4.0

# Comments: This will generate comment based help based on a loaded command.
#This works best in the ISE with your function already loaded.

Function New-CommentHelp {

Param(
[Parameter(Position=0,Mandatory,HelpMessage = "What is the name of your function or command?" )]
[ValidateNotNullorEmpty()]
[string]$Name,

[Parameter(Position=1,Mandatory,HelpMessage = "Enter a brief synopsis" )]
[ValidateNotNullorEmpty()]
[string]$Synopsis,

[Parameter(Position=2,Mandatory,HelpMessage = "Enter a description. You can expand and edit later" )]
[ValidateNotNullorEmpty()]
[string]$Description
)

#define beginning of comment based string

$comment=@"
<#
.SYNOPSIS
{0}
.DESCRIPTION
{1}
 
"@



#Create comment based help string
$help = $comment -f $synopsis,$description

#test if command is loaded and if so get parameters
#ignore common:
$common = "VERBOSE|DEBUG|ERRORACTION|WARNINGACTION|ERRORVARIABLE|WARNINGVARIABLE|OUTVARIABLE|OUTBUFFER|PIPELINEVARIABLE|WHATIF|CONFIRM|INFORMATIONVARIABLE|INFORMATIONACTION"
Try {
    $command = Get-Command -Name $name -ErrorAction Stop
    $params = $command.parameters.keys | where {$_ -notmatch $common} 
}
Catch {
    #otherwise prompt
    $scriptname = Read-Host "If your command is a script file, enter the full file name with extension. Otherwise leave blank"
    if ($scriptname)     {
        Try   {
            $command = Get-Command -Name $scriptname -ErrorAction Stop
            $params = $command.parameters.keys | where {$_ -notmatch $common} 
        }
        Catch
        {
            Write-Warning "Failed to find $scriptname"
            #BAIL OUT
            Return 
        }

    } #if $scriptname
    else
    {
        #prompt for a comma separated list of parameter names
        $EnterParams = Read-Host "Enter a comma separated list of parameter names"
        $Params = $EnterParams.Split(",")
    }
}

#get parameters from help or prompt for comma separated list
if ($params) {
 Foreach ($param in $params) {
   #get aliases from the command
   $aliases =    $command.parameters[$param].aliases
   #get parameter attribute
   $pa = $command.parameters[$param].Attributes  | where {$_.GetType().name -eq "ParameterAttribute"}
   #extract any parameter help messages
   if ($pa.HelpMessage) {
    [string]$paramDesc =  $pa.HelpMessage
   }
   if ($aliases) {
     $paramDesc+= " This command has aliases of: $($aliases -join ",")"
   }
    #define a new line
#this must be left justified to avoid a parsing error
$paramHelp=@"
.PARAMETER $Param
$paramDesc
 
"@

               
    #append the parameter to the help comment
    $help+=$paramHelp
    } #foreach param
} #if $params
    
#Define a default example using the command name
#this must be left justified to avoid a parsing error
$exHelp=@"
.EXAMPLE
PS C:\> $Name
 
 
"@
    
    
#add the example to the help comment
$help+=$exHelp

#stuff for the Notes section
$version = "1.0" 
$verDate=(Get-Date).ToShortDateString()


#construct a Notes section
$NoteHere=@"
.NOTES
NAME : {0}
VERSION : {1}
LAST UPDATED: {2}
AUTHOR : {3}\{4}
 
Learn more about PowerShell:
http://jdhitsolutions.com/blog/essential-powershell-resources/
 
  ****************************************************************
  * DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED *
  * THOROUGHLY IN A LAB ENVIRONMENT. USE AT YOUR OWN RISK. IF *
  * YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, *
  * DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING. *
  ****************************************************************
 
"@


#insert the values
$Notes = $NoteHere -f $Name,$version,$verDate,$env:userdomain,$env:username

#add the section to help
$help+= $Notes

#define a here string for any links you might want to add
$linkHelp=@"
.LINK
 
"@


#add the section to help
$help+= $linkHelp

#}

#Inputs
$inputHelp=@"
.INPUTS
 
"@


$help+= $InputHelp

#outputs
$outputHelp=@"
.OUTPUTS
 
"@


$help+= $OutputHelp

#close the help comment
$help+= "#>"

#if ISE insert into current file
if ($psise) {
    $psise.CurrentFile.Editor.InsertText($help) | Out-Null
}
else {
    #else write to the pipeline
    $help
}

} #end function