Private/Get-AtwsPSParameter.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
<# .COPYRIGHT Copyright (c) ECIT Solutions AS. All rights reserved. Licensed under the MIT license. See https://github.com/ecitsolutions/Autotask/blob/master/LICENSE.md for license information. #> Function Get-AtwsPSParameter { <# .SYNOPSIS This function creates a Powershell parameter definition as text. .DESCRIPTION Based on parameter values this function creates Powershell code as text that can be converted to a scriptblock and executed. .INPUTS Multiple parameters representing the various parameter options. .OUTPUTS Text .EXAMPLE Get-AtwsPSParameter -Name 'Filter' -SetName 'Filter' -Type 'string' -Mandatory -Remaining -NotNull -Array -Comment $Comment Returns as text: # <value of $comment> [Parameter( Mandatory = $true, ValueFromRemainingArguments = $true, ParametersetName = 'Filter' )] [ValidateNotNullOrEmpty()] [string[]] $Filter .NOTES NAME: Get-AtwsPSParameter .LINK #> [CmdLetBinding()] [Outputtype([string])] Param ( [Parameter(Mandatory = $true)] [string]$Name, [string[]]$Alias, [Parameter(Mandatory = $true)] [string]$type, [switch]$Mandatory, [Alias('Remaining')] [switch]$ValueFromRemainingArguments, [Alias('setName')] [string[]]$ParametersetName, [Alias('Pipeline')] [switch]$valueFromPipeline, [Alias('NotNull')] [switch]$ValidateNotNullOrEmpty, [string[]]$ValidateSet, [Alias('Length')] [int]$ValidateLength, [string]$Comment, [switch]$Array, [switch]$nullable ) begin { Write-Debug ('{0}: Begin of function' -F $MyInvocation.MyCommand.Name) if ($Comment) { [string]$text = "# {0}`n" -F $Comment } else { [string]$text = '' } # Set up regex and replacement variables for curly single quote $pattern = [Char]8217 $replacement = [Char]8217, [Char]8217 -join '' } process { foreach ($setName in $parametersetName) { # Make an array of properties that goes inside the Parameter clause $paramProperties = @() # Hardcoded filter against requiring parameters for 'Input_Object' if ($Mandatory.IsPresent -and $setName -in 'By_parameters', 'Filter') { $paramProperties += " Mandatory = `$true" } if ($valueFromRemainingArguments.IsPresent) { $paramProperties += " ValueFromRemainingArguments = `$true" } if ($parametersetName) { $paramProperties += " ParametersetName = '$setName'" } if ($valueFromPipeline.IsPresent) { $paramProperties += " ValueFromPipeline = `$true" } # Create the [Parameter()] clause if ($paramProperties.Count -gt 0) { $text += " [Parameter(`n" $text += $paramProperties -join ",`n" $text += "`n )]`n" } } # Add any aliases if ($Alias.Count -gt 0) { $text += " [Alias('{0}')]`n" -F $($Alias -join "','") } # Add validate not null if present if ($ValidateNotNullOrEmpty.IsPresent) { $text += " [ValidateNotNullOrEmpty()]`n" } # Add validate length if present if ($ValidateLength -gt 0) { $text += " [ValidateLength(0,$ValidateLength)]`n" } # Add Validateset if present if ($ValidateSet.Count -gt 0) { # Fix quote characters for labels $labels = foreach ($Label in $ValidateSet) { # Use literal string with escaped literal quotes, both straight and curly "'{0}'" -F $($Label -replace "'", "''" -replace $pattern, $replacement) } $text += " [ValidateSet($($labels -join ', '))]`n" } # Add the correct variable type for the parameter $type = switch ($type) { 'Integer' { 'Int' } 'Short' { 'Int16' } default { $type } } if ($nullable.IsPresent) { $type = "Nullable[$type]" } $text += " [$type" if ($Array.IsPresent) { $text += '[]' } $text += "]`n` `$$Name" } end { Return $text } } |