Assistance with Pipeline handling dynamic parameters with a dynamic validateset

%3CLINGO-SUB%20id%3D%22lingo-sub-2368959%22%20slang%3D%22en-US%22%3EAssistance%20with%20Pipeline%20handling%20dynamic%20parameters%20with%20a%20dynamic%20validateset%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2368959%22%20slang%3D%22en-US%22%3E%3CDIV%3E%3CSPAN%3EI%3CSPAN%3E'%3CSPAN%3Em%3CSPAN%3E%26nbsp%3Bwriting%26nbsp%3Ba%26nbsp%3B%3CSPAN%3Emodule%3CSPAN%3E%26nbsp%3B%3CSPAN%3Efor%3CSPAN%3E%26nbsp%3Bwhich%26nbsp%3BI%26nbsp%3Bhave%26nbsp%3Ba%26nbsp%3B%3CSPAN%3Efunction%3CSPAN%3E%26nbsp%3Bthat%26nbsp%3BI%26nbsp%3Bwant%20to%20handle%26nbsp%3Bboth%26nbsp%3Bpipeline%26nbsp%3Band%26nbsp%3Bprovided%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3CDIV%3Eparameters%3CSPAN%3E%26nbsp%3Bat%26nbsp%3Bruntime%26nbsp%3Bwith%26nbsp%3Bone%20parameter%26nbsp%3B%3CSPAN%3E'prefix'%3CSPAN%3E%26nbsp%3Bwith%26nbsp%3Ba%26nbsp%3Bdynamic%26nbsp%3B%3CSPAN%3Evalidateset.%3CSPAN%3E%26nbsp%3B%26nbsp%3BOn%26nbsp%3B%3CSPAN%3EModule%3CSPAN%3E%26nbsp%3Bload%3CSPAN%3E%2C%3CSPAN%3E%26nbsp%3Ba%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3CDIV%3E%3CSPAN%3Esettings%3CSPAN%3E%26nbsp%3Bhash%26nbsp%3Btable%26nbsp%3Bis%26nbsp%3Bbuilt%26nbsp%3B(%3CSPAN%3EScript%3CSPAN%3E%26nbsp%3BScope)%26nbsp%3B%3CSPAN%3Efrom%3CSPAN%3E%26nbsp%3Bwhich%26nbsp%3Bthe%26nbsp%3B%3CSPAN%3Efunction%3CSPAN%3E%26nbsp%3Bis%26nbsp%3Bto%26nbsp%3Bload%26nbsp%3Bits%26nbsp%3Bvalidateset%26nbsp%3B%3CSPAN%3Efrom%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CDIV%3E%3CSPAN%3EI%3CSPAN%3E'%3CSPAN%3Eve%3CSPAN%3E%26nbsp%3Bprovided%26nbsp%3Ba%26nbsp%3Bcopy%26nbsp%3Bof%26nbsp%3Bthe%26nbsp%3Bworking%26nbsp%3Bcode%26nbsp%3Bwith%26nbsp%3Ba%26nbsp%3B%3CSPAN%3Estatic%3CSPAN%3E%26nbsp%3Bvalidateset%26nbsp%3Bthat%26nbsp%3Bworks%26nbsp%3Bas%26nbsp%3Bexpected%26nbsp%3Band%26nbsp%3Ba%26nbsp%3Bcopy%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3CDIV%3E%3CSPAN%3Eattempting%3CSPAN%3E%26nbsp%3Bto%26nbsp%3Butilize%26nbsp%3Bthe%26nbsp%3Bbuilding%26nbsp%3Bof%26nbsp%3Bdynamic%26nbsp%3Bparameters%20(based%20on%20research%20from%20%3CA%20href%3D%22https%3A%2F%2Fadamtheautomator.com%2Fpowershell-parameter-validation%2F%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%3Ehere%3C%2FA%3E%2C%20%3CA%20href%3D%22https%3A%2F%2Fpowershellmagazine.com%2F2014%2F05%2F29%2Fdynamic-parameters-in-powershell%2F%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%3Ehere%3C%2FA%3E%20and%20%3CA%20href%3D%22https%3A%2F%2Fblog.cpolydorou.net%2F2018%2F03%2Fpowershell-dynamic-validate-set.html%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%3Ehere%3C%2FA%3E)%20that%20isn't.%3C%2FSPAN%3E%3C%2FSPAN%3E%3CDIV%3E%26nbsp%3B%3CDIV%3E%3CSPAN%3EBased%26nbsp%3Bon%26nbsp%3B%3CSPAN%3Efeedback%2Fcorrections%3CSPAN%3E%2C%3CSPAN%3E%26nbsp%3BI%26nbsp%3Bwould%26nbsp%3Blike%26nbsp%3Bto%26nbsp%3BHandle%26nbsp%3B%3CSPAN%3Emissing%3CSPAN%3E%26nbsp%3Bprefix%26nbsp%3Bproperty%26nbsp%3Bby%26nbsp%3Bthrowing%26nbsp%3Ba%26nbsp%3B%3CSPAN%3Enon-terminating%3CSPAN%3E%26nbsp%3Berror%26nbsp%3Bindicating%26nbsp%3Bmissing%26nbsp%3Bproperty%26nbsp%3B(%3CSPAN%3Eand%3CSPAN%3E%26nbsp%3Bnot%26nbsp%3Bthe%26nbsp%3B%3CSPAN%3Ehashtable%26nbsp%3Blookup%26nbsp%3Berror).%3CBR%20%2F%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FDIV%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E%23Settings%20Hashtable%0A%24SettingsHash%20%3D%20%40%7B%7D%0A%0A%24SettingsHash.Add(%22Prefix1%22%2C%5BPSCustomObject%5D%40%7B%0A%20%20Desc%20%3D%20%22Prefix1%22%0A%20%20Prefix%20%3D%20%22P1_%22%0A%20%20Option%20%3D%201%0A%7D)%0A%24SettingsHash.Add(%22Prefix2%22%2C%5BPSCustomObject%5D%40%7B%0A%20%20Desc%20%3D%20%22Prefix2%22%0A%20%20Prefix%20%3D%20%22P2_%22%0A%20%20Option%20%3D%20123%0A%7D)%0A%0A%23Works%20(static%20validateset%20collection)%0Afunction%20New-Example%20%7B%0A%20%20%5BCmdletBinding(DefaultParameterSetName%20%3D%20'NonPipeline')%5D%0A%20%20%5BOutputType(%5BPSCustomObject%5D)%5D%0A%20%20param%20(%0A%20%20%20%20%20%20%5BParameter(%0A%20%20%20%20%20%20%20%20ParameterSetName%20%3D%20'NonPipeline'%2C%0A%20%20%20%20%20%20%20%20Mandatory%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20Position%20%3D%200%2C%0A%20%20%20%20%20%20%20%20ValueFromPipeline%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20ValueFromPipelineByPropertyName%20%3D%20%24true%0A%20%20%20%20%20%20)%5D%0A%20%20%20%20%20%20%5BParameter(%0A%20%20%20%20%20%20%20%20ParameterSetName%20%3D%20'Pipeline'%2C%0A%20%20%20%20%20%20%20%20Mandatory%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20Position%20%3D%200%2C%0A%20%20%20%20%20%20%20%20ValueFromPipeline%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20ValueFromPipelineByPropertyName%20%3D%20%24true%0A%20%20%20%20%20%20)%5D%0A%20%20%20%20%20%20%5BValidateLength(1%2C16)%5D%0A%20%20%20%20%20%20%5BAlias(%22Computername%22)%5D%0A%20%20%20%20%5Bstring%5D%24Servername%2C%0A%20%20%20%20%20%20%5BParameter(%0A%20%20%20%20%20%20%20%20ParameterSetName%20%3D%20'NonPipeline'%2C%0A%20%20%20%20%20%20%20%20Mandatory%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20Position%20%3D%201%0A%20%20%20%20%20%20)%5D%0A%20%20%20%20%20%20%5BParameter(%0A%20%20%20%20%20%20%20%20ParameterSetName%20%3D%20'Pipeline'%2C%0A%20%20%20%20%20%20%20%20Mandatory%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20Position%20%3D%201%2C%0A%20%20%20%20%20%20%20%20ValueFromPipelineByPropertyName%20%3D%20%24true%0A%20%20%20%20%20%20)%5D%0A%20%20%20%20%20%20%5BValidateSet(%22Prefix1%22%2C%22Prefix2%22)%5D%0A%20%20%20%20%5Bstring%5D%24Prefix%0A%20%20)%0A%0A%20%20begin%20%7B%0A%20%20%20%20%24ParameterName%20%3D%20'Prefix'%0A%20%20%7D%0A%0A%20%20process%20%7B%0A%20%20%20%20foreach%20(%24Server%20in%20%24Servername)%20%7B%0A%20%20%20%20%20%20%24PrefixSelection%20%3D%20%24PsBoundParameters%5B%24ParameterName%5D%0A%20%20%20%20%20%20return%20%5BPSCustomObject%5D%5Bordered%5D%40%7B%0A%0A%20%20%20%20%20%20%20%20Servername%20%3D%20(%24(%24SettingsHash.Item(%24PrefixSelection).prefix)%20%2B%20%24Server).ToLower()%0A%20%20%20%20%20%20%20%20Prefix%20%3D%20%24PrefixSelection%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20end%20%7B%0A%0A%20%20%7D%0A%7D%0A%0A%0A%23Test%20Data%0A%24t%20%3D%20%40(%5BPSCustomObject%5D%40%7B%0A%20%20Servername%20%3D%20%22Server1%22%0A%20%20Prefix%20%3D%20%22Prefix1%22%0A%7D%2C%0A%5BPSCustomObject%5D%40%7B%0A%20%20Servername%20%3D%20%22Server2%22%0A%20%20Prefix%20%3D%20%22Prefix2%22%0A%7D)%0A%23Tests%0A%26gt%3B%20New-Example%20-Servername%20blah%20-Prefix%20Prefix1%0A%0AServername%20Prefix%0A----------%20------%0Ap1_blah%20%20%20%20Prefix1%0A%0A%23%23%23%0A%26gt%3B%20%22blah%22%2C%22blgr%22%20%7C%20New-Example%20-Prefix%20Prefix2%0A%0AServername%20Prefix%0A----------%20------%0Ap2_blah%20%20%20%20Prefix2%0Ap2_blgr%20%20%20%20Prefix2%0A%0A%0A%23%23%23%0A%26gt%3B%20%24t%20%7C%20New-Example%0A%0AServername%20%20%20Prefix%0A--------%20%20%20------%0Ap1_server1%20Prefix1%0Ap2_server2%20Prefix2%0A%0AHere%20is%20an%20attempt%20with%20using%20Dynamic%20Parameters%20that%20doesn't%20function%20as%20expected%3A%0A%0A%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%0A%23Doesn't%20Work%20(dynamic%20validateset%20collection)%0Afunction%20New-Example%20%7B%0A%20%20%5BCmdletBinding(DefaultParameterSetName%20%3D%20'NonPipeline')%5D%0A%20%20%5BOutputType(%5BPSCustomObject%5D)%5D%0A%20%20param%20(%0A%20%20%20%20%20%20%5BParameter(%0A%20%20%20%20%20%20%20%20ParameterSetName%20%3D%20'NonPipeline'%2C%0A%20%20%20%20%20%20%20%20Mandatory%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20ValueFromPipeline%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20Position%20%3D%200%2C%0A%20%20%20%20%20%20%20%20ValueFromPipelineByPropertyName%20%3D%20%24true%0A%20%20%20%20%20%20)%5D%0A%20%20%20%20%20%20%5BParameter(%0A%20%20%20%20%20%20%20%20ParameterSetName%20%3D%20'Pipeline'%2C%0A%20%20%20%20%20%20%20%20Mandatory%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20ValueFromPipeline%20%3D%20%24true%2C%0A%20%20%20%20%20%20%20%20Position%20%3D%200%2C%0A%20%20%20%20%20%20%20%20ValueFromPipelineByPropertyName%20%3D%20%24true%0A%20%20%20%20%20%20)%5D%0A%20%20%20%20%20%20%5BValidateLength(1%2C16)%5D%0A%20%20%20%20%20%20%5BAlias(%22Computername%22)%5D%0A%20%20%20%20%5Bstring%5B%5D%5D%24Servername%0A%20%20)%0A%20%20DynamicParam%20%7B%0A%20%20%20%20%23%20Set%20the%20dynamic%20parameters'%20name%0A%20%20%20%20%24ParameterName%20%3D%20'Prefix'%0A%0A%20%20%20%20%23%20Create%20the%20dictionary%0A%20%20%20%20%24RuntimeParameterDictionary%20%3D%20New-Object%20System.Management.Automation.RuntimeDefinedParameterDictionary%0A%0A%20%20%20%20%23%20Create%20the%20collection%20of%20attributes%0A%20%20%20%20%24AttributeCollection%20%3D%20New-Object%20System.Collections.ObjectModel.Collection%5BSystem.Attribute%5D%0A%0A%20%20%20%20%23%23%23%0A%20%20%20%20%23%20ParameterSet%20'NonPipeline'%0A%20%20%20%20%23%23%23%0A%20%20%20%20%23%20Create%20and%20set%20the%20parameters'%20attributes%0A%20%20%20%20%24ParameterAttribute%20%3D%20New-Object%20System.Management.Automation.ParameterAttribute%0A%20%20%20%20%24ParameterAttribute.Mandatory%20%3D%20%24true%0A%20%20%20%20%24ParameterAttribute.Position%20%3D%201%0A%20%20%20%20%24ParameterAttribute.ParameterSetName%20%3D%20'NonPipeline'%0A%0A%0A%20%20%20%20%23%23%23%0A%20%20%20%20%23%20ParameterSet%20'Pipeline'%0A%20%20%20%20%23%23%23%0A%20%20%20%20%23%20Create%20and%20set%20the%20parameters'%20attributes%0A%20%20%20%20%24ParameterAttribute1%20%3D%20New-Object%20System.Management.Automation.ParameterAttribute%0A%20%20%20%20%24ParameterAttribute1.Mandatory%20%3D%20%24true%0A%20%20%20%20%24ParameterAttribute.Position%20%3D%201%0A%20%20%20%20%24ParameterAttribute1.ParameterSetName%20%3D%20'Pipeline'%0A%20%20%20%20%24ParameterAttribute1.ValueFromPipelineByPropertyName%20%3D%20%24true%0A%0A%0A%20%20%20%20%23%20Add%20the%20attributes%20to%20the%20attributes%20collection%0A%20%20%20%20%24AttributeCollection.Add(%24ParameterAttribute)%0A%20%20%20%20%26lt%3B%23%24AttributeCollection.Add(%24ParameterAttribute1)%23%26gt%3B%0A%0A%20%20%20%20%23%20Generate%20and%20set%20the%20ValidateSet%0A%20%20%20%20%24arrSet%20%3D%20%24SettingsHash.Keys%20%7C%20Sort-Object%0A%20%20%20%20%24ValidateSetAttribute%20%3D%20New-Object%20System.Management.Automation.ValidateSetAttribute(%24arrSet)%0A%0A%20%20%20%20%23%20Add%20the%20ValidateSet%20to%20the%20attributes%20collection%0A%20%20%20%20%24AttributeCollection.Add(%24ValidateSetAttribute)%0A%0A%20%20%20%20%23%20Create%20and%20return%20the%20dynamic%20parameter%0A%20%20%20%20%24RuntimeParameter%20%3D%20New-Object%20System.Management.Automation.RuntimeDefinedParameter(%24ParameterName%2C%20%5Bstring%5D%2C%20%24AttributeCollection)%0A%20%20%20%20%24RuntimeParameterDictionary.Add(%24ParameterName%2C%20%24RuntimeParameter)%0A%0A%20%20%20%20return%20%24RuntimeParameterDictionary%0A%0A%20%20%7D%0A%20%20begin%20%7B%0A%20%20%20%20%24ParameterName%20%3D%20'Prefix'%0A%20%20%7D%0A%0A%20%20process%20%7B%0A%20%20%20%20foreach%20(%24Server%20in%20%24Servername)%20%7B%0A%20%20%20%20%20%20%24PrefixSelection%20%3D%20%24PsBoundParameters%5B%24ParameterName%5D%0A%0A%20%20%20%20%20%20return%20%5BPSCustomObject%5D%5Bordered%5D%40%7B%0A%0A%20%20%20%20%20%20%20%20Servername%20%3D%20(%24(%24SettingsHash.Item(%24PrefixSelection).prefix)%20%2B%20%24Server).ToLower()%0A%20%20%20%20%20%20%20%20Prefix%20%3D%20%24PrefixSelection%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20end%20%7B%0A%0A%20%20%7D%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3ETest%20Results%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E%23Tests%20that%20work%0A%26gt%3B%20New-Example%20-Servername%20blah%20-Prefix%20Prefix1%0A%26gt%3B%20%22blah%22%2C%22blgr%22%20%7C%20New-Example%20-Prefix%20Prefix2%0A%0A%23Test%20That%20doesn't%20work%0A%26gt%3B%20%24t%20%7C%20New-Example%0A%0AException%20getting%20%22Item%22%3A%20%22Key%20cannot%20be%20null.%0AParameter%20name%3A%20key%22%0AAt%20line%3A83%20char%3A25%0A%2B%20...%20%20%20Servername%20%3D%20(%24(%24SettingsHash.Item(%24PrefixSelection).prefix)%20%2B%20%24Ser%20...%0A%2B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%0A%20%20%20%20%2B%20CategoryInfo%20%20%20%20%20%20%20%20%20%20%3A%20NotSpecified%3A%20(%3A)%20%5B%5D%2C%20GetValueInvocationException%0A%20%20%20%20%2B%20FullyQualifiedErrorId%20%3A%20ExceptionWhenGetting%0A%0A%0A%0AServername%20Prefix%0A----------%20------%0Aserver1%0AException%20getting%20%22Item%22%3A%20%22Key%20cannot%20be%20null.%0AParameter%20name%3A%20key%22%0AAt%20line%3A83%20char%3A25%0A%2B%20...%20%20%20Servername%20%3D%20(%24(%24SettingsHash.Item(%24PrefixSelection).prefix)%20%2B%20%24Ser%20...%0A%2B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%0A%20%20%20%20%2B%20CategoryInfo%20%20%20%20%20%20%20%20%20%20%3A%20NotSpecified%3A%20(%3A)%20%5B%5D%2C%20GetValueInvocationException%0A%20%20%20%20%2B%20FullyQualifiedErrorId%20%3A%20ExceptionWhenGetting%0A%0Aserver2%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2368959%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EWindows%20PowerShell%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E
New Contributor
I'm writing a module for which I have a function that I want to handle both pipeline and provided
parameters at runtime with one parameter 'prefix' with a dynamic validateset.  On Module load, a
settings hash table is built (Script Scope) from which the function is to load its validateset from

 

I've provided a copy of the working code with a static validateset that works as expected and a copy
attempting to utilize the building of dynamic parameters (based on research from here, here and here) that isn't.
 
Based on feedback/corrections, I would like to Handle missing prefix property by throwing a non-terminating error indicating missing property (and not the hashtable lookup error).

 

#Settings Hashtable
$SettingsHash = @{}

$SettingsHash.Add("Prefix1",[PSCustomObject]@{
  Desc = "Prefix1"
  Prefix = "P1_"
  Option = 1
})
$SettingsHash.Add("Prefix2",[PSCustomObject]@{
  Desc = "Prefix2"
  Prefix = "P2_"
  Option = 123
})

#Works (static validateset collection)
function New-Example {
  [CmdletBinding(DefaultParameterSetName = 'NonPipeline')]
  [OutputType([PSCustomObject])]
  param (
      [Parameter(
        ParameterSetName = 'NonPipeline',
        Mandatory = $true,
        Position = 0,
        ValueFromPipeline = $true,
        ValueFromPipelineByPropertyName = $true
      )]
      [Parameter(
        ParameterSetName = 'Pipeline',
        Mandatory = $true,
        Position = 0,
        ValueFromPipeline = $true,
        ValueFromPipelineByPropertyName = $true
      )]
      [ValidateLength(1,16)]
      [Alias("Computername")]
    [string]$Servername,
      [Parameter(
        ParameterSetName = 'NonPipeline',
        Mandatory = $true,
        Position = 1
      )]
      [Parameter(
        ParameterSetName = 'Pipeline',
        Mandatory = $true,
        Position = 1,
        ValueFromPipelineByPropertyName = $true
      )]
      [ValidateSet("Prefix1","Prefix2")]
    [string]$Prefix
  )

  begin {
    $ParameterName = 'Prefix'
  }

  process {
    foreach ($Server in $Servername) {
      $PrefixSelection = $PsBoundParameters[$ParameterName]
      return [PSCustomObject][ordered]@{

        Servername = ($($SettingsHash.Item($PrefixSelection).prefix) + $Server).ToLower()
        Prefix = $PrefixSelection
      }
    }
  }

  end {

  }
}


#Test Data
$t = @([PSCustomObject]@{
  Servername = "Server1"
  Prefix = "Prefix1"
},
[PSCustomObject]@{
  Servername = "Server2"
  Prefix = "Prefix2"
})
#Tests
> New-Example -Servername blah -Prefix Prefix1

Servername Prefix
---------- ------
p1_blah    Prefix1

###
> "blah","blgr" | New-Example -Prefix Prefix2

Servername Prefix
---------- ------
p2_blah    Prefix2
p2_blgr    Prefix2


###
> $t | New-Example

Servername   Prefix
--------   ------
p1_server1 Prefix1
p2_server2 Prefix2

Here is an attempt with using Dynamic Parameters that doesn't function as expected:

############################################################
#Doesn't Work (dynamic validateset collection)
function New-Example {
  [CmdletBinding(DefaultParameterSetName = 'NonPipeline')]
  [OutputType([PSCustomObject])]
  param (
      [Parameter(
        ParameterSetName = 'NonPipeline',
        Mandatory = $true,
        ValueFromPipeline = $true,
        Position = 0,
        ValueFromPipelineByPropertyName = $true
      )]
      [Parameter(
        ParameterSetName = 'Pipeline',
        Mandatory = $true,
        ValueFromPipeline = $true,
        Position = 0,
        ValueFromPipelineByPropertyName = $true
      )]
      [ValidateLength(1,16)]
      [Alias("Computername")]
    [string[]]$Servername
  )
  DynamicParam {
    # Set the dynamic parameters' name
    $ParameterName = 'Prefix'

    # Create the dictionary
    $RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary

    # Create the collection of attributes
    $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]

    ###
    # ParameterSet 'NonPipeline'
    ###
    # Create and set the parameters' attributes
    $ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
    $ParameterAttribute.Mandatory = $true
    $ParameterAttribute.Position = 1
    $ParameterAttribute.ParameterSetName = 'NonPipeline'


    ###
    # ParameterSet 'Pipeline'
    ###
    # Create and set the parameters' attributes
    $ParameterAttribute1 = New-Object System.Management.Automation.ParameterAttribute
    $ParameterAttribute1.Mandatory = $true
    $ParameterAttribute.Position = 1
    $ParameterAttribute1.ParameterSetName = 'Pipeline'
    $ParameterAttribute1.ValueFromPipelineByPropertyName = $true


    # Add the attributes to the attributes collection
    $AttributeCollection.Add($ParameterAttribute)
    <#$AttributeCollection.Add($ParameterAttribute1)#>

    # Generate and set the ValidateSet
    $arrSet = $SettingsHash.Keys | Sort-Object
    $ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($arrSet)

    # Add the ValidateSet to the attributes collection
    $AttributeCollection.Add($ValidateSetAttribute)

    # Create and return the dynamic parameter
    $RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
    $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)

    return $RuntimeParameterDictionary

  }
  begin {
    $ParameterName = 'Prefix'
  }

  process {
    foreach ($Server in $Servername) {
      $PrefixSelection = $PsBoundParameters[$ParameterName]

      return [PSCustomObject][ordered]@{

        Servername = ($($SettingsHash.Item($PrefixSelection).prefix) + $Server).ToLower()
        Prefix = $PrefixSelection
      }
    }
  }

  end {

  }
}

 

Test Results

 

#Tests that work
> New-Example -Servername blah -Prefix Prefix1
> "blah","blgr" | New-Example -Prefix Prefix2

#Test That doesn't work
> $t | New-Example

Exception getting "Item": "Key cannot be null.
Parameter name: key"
At line:83 char:25
+ ...   Servername = ($($SettingsHash.Item($PrefixSelection).prefix) + $Ser ...
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], GetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenGetting



Servername Prefix
---------- ------
server1
Exception getting "Item": "Key cannot be null.
Parameter name: key"
At line:83 char:25
+ ...   Servername = ($($SettingsHash.Item($PrefixSelection).prefix) + $Ser ...
+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], GetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenGetting

server2

 

0 Replies