互斥的 powershell 参数
场景
- 我正在使用 Visual Studio 2008 和 .NET 3.5 为 Powershell 2.0 编写一个 cmdlet,
- 该 cmdlet 需要 3 个参数。
我想要的 cmdlet 语法是这样的:
cmdletname [foo|bar] p1, p2
- 这意味着用户必须为“-foo”或“-bar”提供一个值,但不能同时提供两者。
有效输入的示例
cmdletname -foo xxx -p1 hello -p2 world
cmdletname -bar yyy -p1 hello -p2 world
无效输入的示例
cmdletname -foo xxx -bar yyy -p1 hello -p2 world
我的问题
- 我的问题是如何在 powershell 中执行此操作,以便它为我完成所有检查 - 或者如果这可能的话。
- 我知道我可以只使用 foo 和 bar 的两个可选参数,然后手动进行错误检查。这就是我目前实施的方式。
- 另外,我对不同方法的建议感兴趣。
SCENARIO
- I'm writing a cmdlet for Powershell 2.0 using Visual Studio 2008 and .NET 3.5
- the cmdlet requires 3 arguments.
my intended grammar of the cmdlet is something like this:
cmdletname [foo|bar] p1, p2
- That reads as the user must give a value for "-foo" or "-bar" but can't give both together.
EXAMPLE OF VALID INPUT
cmdletname -foo xxx -p1 hello -p2 world
cmdletname -bar yyy -p1 hello -p2 world
EXAMPLE OF INVALID INPUT
cmdletname -foo xxx -bar yyy -p1 hello -p2 world
MY QUESTION
- My question is on how to do this in powershell so that it does all the checking for me - or if that is possible at all.
- I know I can use just have two optional parameters for foo and bar and simply do the error checking manually. That's how I have it implemented currently.
- Alternatively, I am interested in suggestions for different approaches.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用参数属性来声明多个参数套。然后,您只需将互斥的参数分配给不同的参数集即可。
编辑:
这也记录在“about_Functions_Advanced_Parameters”中的“ParameterSetName 命名参数”部分下。这是使用
Get-Random
(具有互斥参数)等 cmdlet 处理不同参数集的方式:以下是在函数中执行此操作的示例:
参数
one
和two
位于不同的参数集中,因此它们不能一起指定:这与我使用 Get-Random 遇到的错误相同。但我可以独立使用参数:
...或者:
You can use the parameter attribute to declare multiple parameter sets. You then simply assign parameters that are mutually exclusive to different parameter sets.
EDIT:
This is also documented in 'about_Functions_Advanced_Parameters', under the section "ParameterSetName Named Argument". This is how different sets of parameters is handled with cmdlets like
Get-Random
(which has mutually exclusive parameters):Here's an example of doing it in a function:
The parameters
one
andtwo
are in different parameter sets, so they cannot be specified together:Which is the same error I got with Get-Random. But I can use the parameters independently:
...or:
以下是使用从 PowerShell 社区扩展 中的 cmdlet 获取的 ParameterSetName 的示例。顺便说一句,对于想法,您可以浏览 PSCX 源代码 。
请注意,cmdlet 通常会声明一个默认的 ParameterSetName,以帮助 PowerShell 确定在存在歧义时要使用的“默认”参数集。稍后,如果需要,您可以通过查询 this.ParameterSetName 来确定哪个参数集有效,就像上面 EndProcessing() 覆盖中的 switch 语句所做的那样。
Here's an example of using ParameterSetName taken from a cmdlet in the PowerShell Community Extensions. BTW, for ideas you can browse the PSCX source code.
Note that the cmdlet typically declares a default ParameterSetName that helps PowerShell determine the "default" parameter set to use when there is ambiguity. Later on, if needed, you can determine which parameter set is in force by querying this.ParameterSetName as the switch statement does above in the EndProcessing() override.
我来到这里,但有一个额外的要求:可选的互斥参数。
这篇文章帮助我找到了一半的答案。所以我想在这里发布完整的答案,以防有人有相同的要求。
下面的代码可以在 Powershell 脚本的顶部使用,以具有 4 个可选参数,其中 LaunchAsAdmin 和 LaunchAsCouponBrowser 是互斥的,而 token 和 WorkstationName 也是可选的,但可以与任何其他参数组合。
I came here but with an additional requirement: Optional mutual exclusive parameters.
This post here helped me to find half of the answer. So I thought to post here the full answer in case someone has the same requirements.
The code below can be used at the top of a Powershell script to have 4 optional parameters of which LaunchAsAdmin and LaunchAsCouponBrowser are mutually exclusive while token and WorkstationName are also optional but can be combined with any other parameter.