Question:
I need a little help on how I can enforce the following constraints on the arguments to a powershell script. Can I specify these constraints with in the param
section.
- At least one argument constraint
- At most one argument constraint
For example, (just an example, it’s not what I am doing) to a script called ReadPlainText.ps1
, I would like to give only either of the two arguments: Lines
or Chars
, but not both. The command ReadPlainText.ps1 Sample.txt -Lines 20 -Chars 10
should result in an error. Similarly, the command ReadPlainText.ps1 Sample.txt
should result in error.
Answer:
You can, in PSH V2, do this will parameter attributes and by putting the two parameters into different parameter sets.
A parameter set is a group of parameters that go together, a command can have multiple parameter sets and only one is available. Parameters not assigned to a parameter group are available across all parameters. This can be seen in the standard cmdlets (removing the common parameters):
1 2 3 4 |
PS> gcm -syn get-content Get-Content [-Path] … Get-Content [-LiteralPath] … |
To achive this in a script or function:
- Add
[CmdletBinding]
as the first non-comment. (A default parameter set can be specified here.) - In the
param
block decorate parameters with theParameter
attribute to specify mandatory and the parameter set.
Thus:
1 2 3 4 5 6 7 |
[CmdletBinding] param ( [parameter(mandatory=$true,ParameterSetName='lines') [int]$Lines, [parameter(mandatory=$true,ParameterSetName='chars') [int]$|Chars ) |
To access the parameter set in use $PSCmdlet
which gives access to the same information available within cmdlets written C# or VB.