New-WebJEACommand.ps1

function New-WebJEACommand {
<#
.SYNOPSIS
Create a new command in the current, in-memory configuration.
 
.DESCRIPTION
Add a new script to the config, specifying name, script path, optional id, permittedgroups, onload script, and if the parameters should be logged during execution.
 
.EXAMPLE
new-webjeacommand -displayname 'new script' -script 'c:\webjea\script.ps1' -permittedgroups @('domain\group1')
 
.EXAMPLE
new-webjeacommand -displayname 'new script' -script 'c:\webjea\script.ps1' -permittedgroups @('domain\group1') -onloadscript 'c:\webjea\onload.ps1'
 
.PARAMETER CommandId
Optional. Assign a custom id to this command. Useful for linking to this command directly via url (?id=<value>)
 
.PARAMETER DisplayName
Optional. This is the friendly name presented to users. Not technically required, as a default value will be generated if not specified.
 
.PARAMETER OnloadScript
Optional. If specified, this script will execute on page load.
Notes: This script should not require any parameters. This script should also run quickly as long running scripts will impact the user's experience.
 
.PARAMETER Script
Optional. Not technically required, this is the script that will be parsed to generate the form and eventually executed.
Notes: This can be omitted to run only an onloadscript. It is also possible to have no script or onloadscript and specify a synopsis.
 
.PARAMETER Synopsis
Optional. This should only be specified if no script or onloadscript is specified and is intended for use on the default script as a landing page. It will override the parsed value from script.
 
.PARAMETER LogParameters
Optional. This will override the Config setting on this command. When true, the parameters will be logged to the usage log. When false, this script will only log the script run and not the parameters and their values.
 
.PARAMETER PermittedGroups
Optional. This is the list of domain users and groups that will see and can execute this script. Machine local groups work as well, but aren't recommended. Users/Groups specified at the config level always have access.
Groups and users should be specified in winnt format (domain\group).
 
.NOTES
Version: 1.0
Author: Mark Domansky
Creation Date: 2018-01-13
Purpose/Change: Initial release
 
#>

#requires -version 3
#r#equires -pssnapin <snapin> -version X.x
#r#equires -modules {<module-name>}
#r#equires -shellid <shellid>
#r#equires -runasadministrator

[CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Low')]

param
(
    #id, displayname, description, synopsis, onloadscript, script, permittedgroups, parameters
    [Parameter(Position=0, HelpMessage='What CommandId do you want to use?')]
    [ValidateNotNullOrEmpty()]
    [Alias('Id')]
    [string]$CommandId = (new-guid).tostring(), 

    [Parameter(Mandatory, HelpMessage='What do you want the DisplayName to be?')]
    [ValidateNotNullOrEmpty()]
    [Alias('Name')]
    [string]$DisplayName, 
        
    [Parameter(HelpMessage='What do you want the Onload Script to be?')]
    [string]$OnloadScript, 
        
    [Parameter(HelpMessage='What do you want the Script to be?')]
    [string]$Script, 
    
    [Parameter(HelpMessage='What do you want the Synopsis to be?')]
    [ValidateNotNullOrEmpty()]
    [string]$Synopsis, 
    
    [Parameter(HelpMessage='Do you want to log parameters? (if not specified, will inherit from config)')]
    [ValidateNotNullOrEmpty()]
    [boolean]$LogParameters, 
        
    [Parameter(HelpMessage='What do you want the Permitted Groups to be? (domain\usergroup)')]
    [string[]]$PermittedGroups
        
) #/param

begin {
    #do pre script checks, etc
    $WJConfig = Get-WJPrivateData -key "WJConfig"

} #/begin

process {
    $ErrorActionPreference = "Stop"

    $cmds = $null
    $cmds = $WJConfig.commands | where-object -FilterScript {$_.id -eq $CommandId}

    if (($cmds | measure).count -eq 0) {
        $newcmd = New-WJCommandObject
        $newcmd.id = $CommandId

        [pscustomobject[]]$wjconfig.commands += $newcmd
        Set-WJPrivateData -Key "WJConfig" -Value $WJConfig

        Set-WebJEACommand @PSBoundParameters

    } elseif (($cmds | measure).count -ge 1) {
        write-error "CommandId already exists. Cannot continue."
    }

    return Get-WebJEACommand -CommandId $CommandId
    
} #/process

end {

} #/end
} #/function