I wrote a script to retrieve VM metrics from VMware vCenter.
A user needs to provide 2 arguments/parameters. One is the vCenter server and the other is 1 of the following : Single VM name or a file containing a list of VMs.
The script works fine, but if someone tries to run this script at the PS console without providing any arguments, it throws an exception. (shown below)
Questions :
- Is the exception pointing to an issue I don't know ?
- I would rather, the user be shown the Syntax instead of an exception. Is that possible ?
[CmdletBinding()]Param (
<span class="pun">[</span><span class="typ">Parameter</span><span class="pun">(</span> <span class="typ">Mandatory</span> <span class="pun">=</span><span class="pln"> $true</span><span class="pun">,</span> <span class="typ">ParameterSetName</span> <span class="pun">= </span><span class="str">'List'</span> <span class="pun">)]</span> <span class="pun">[</span><span class="typ">Parameter</span><span class="pun">(</span> <span class="typ">Mandatory</span> <span class="pun">=</span><span class="pln"> $true</span><span class="pun">,</span> <span class="typ">ParameterSetName</span> <span class="pun">= </span><span class="str">'OneVM'</span> <span class="pun">)]</span> <span class="pun">[</span><span class="pln">string</span><span class="pun">]</span><span class="pln">$vCenterServer</span><span class="pun">,</span> <span class="pun">[</span><span class="typ">Parameter</span><span class="pun">(</span> <span class="typ">Mandatory</span> <span class="pun">=</span><span class="pln"> $true</span><span class="pun">,</span> <span class="typ">ParameterSetName</span> <span class="pun">= </span><span class="str">'List'</span> <span class="pun">)]</span> <span class="pun">[</span><span class="typ">ValidateNotNullOrEmpty</span><span class="pun">()]</span> <span class="pun">[</span><span class="typ">ValidateScript</span><span class="pun">(</span> <span class="pun">{</span> <span class="typ">Test</span><span class="pun">-</span><span class="typ">Path</span> <span class="pun">-</span><span class="typ">LiteralPath</span><span class="pln"> $_ </span><span class="pun">-</span><span class="typ">Type</span> <span class="typ">Leaf</span> <span class="pun">})]</span> <span class="pun">[</span><span class="pln">string</span><span class="pun">]</span><span class="pln">$vmListFile</span><span class="pun">,</span> <span class="pun">[</span><span class="typ">Parameter</span><span class="pun">(</span> <span class="typ">Mandatory</span> <span class="pun">=</span><span class="pln"> $true</span><span class="pun">,</span> <span class="typ">ParameterSetName</span> <span class="pun">= </span><span class="str">'OneVM'</span> <span class="pun">)]</span> <span class="pun">[</span><span class="pln">string</span><span class="pun">]</span><span class="pln">$MyVM
)
When I run this without providing arguments/parameters, here is what I see.
PS> c:\Temp\vCenter_RT_PerfData.ps1 C:\Temp\vCenter_RT_PerfData.ps1 : Parameter set cannot be resolved using the specified named parameters. + CategoryInfo : InvalidArgument: (:) [vCenter_RT_PerfData.ps1], ParentContainsErrorRecordException + FullyQualifiedErrorId : AmbiguousParameterSet,vCenter_RT_PerfData.ps1
Here is what I wish they would see.
SYNTAX C:\Temp\vCenter_RT_PerfData.ps1 -vCenterServer <String> -MyVM <String> [<CommonParameters>] C:\Temp\vCenter_RT_PerfData.ps1 -vCenterServer <String> -vmListFile <String> [<CommonParameters>]
Any suggestions on presenting this another/better way are also welcome.