Powershell参数集,如何从每个参数集中获取一个参数,但不能同时获取两者?

时间:2019-07-08 16:16:34

标签: powershell

我正在尝试写看起来很简单的东西,但是我已经花了几个小时了,但仍然无法获得我需要的东西。

我有一个PowerShell脚本,该脚本将用于启动或关闭虚拟机。我想让用户指定ResourceGroup名称,单个VM名称或带有VM名称的文本文件。

此脚本用于Azure,但问题特定于param()声明。

我尝试了在这里可以想到的每种组合,使参数成为参数集的一部分,使它们成为强制性的,而不是强制性的,等等。但是我无法做到这一点。

感谢您的帮助!

param (
    [Parameter (Mandatory = $true, ParameterSetName = 'ByResourceGroup')]
    [string]$ResourceGroup,

    [Parameter (Mandatory = $true, ParameterSetName = 'ByFile')]
    [string]$File,

    [Parameter (Mandatory = $true, ParameterSetName = 'ByName')]
    [string]$Name,

    [Parameter (Mandatory = $false, ParameterSetName = 'ByResourceGroup')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByFile')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByName')]
    [switch]$Start,

    [Parameter (Mandatory = $false, ParameterSetName = 'ByResourceGroup')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByFile')]
    [Parameter (Mandatory = $false, ParameterSetName = 'ByName')]
    [switch]$Stop
)

用户应该能够通过以下方式: -资源组 要么 -文件 要么 -名称

AND

传递以下任一项: -开始 要么 -停止

不是两者!

我认为我在第一组中就具有这种正确性,但是我不能让-Start和-Stop独占一面。

Get-help这样说:

SYNTAX
    C:\Set-AzureVM.ps1 -ResourceGroup <String> [-Start] [-Stop] [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> [-Start] [-Stop] [<CommonParameters>]

    C:\Set-AzureVM.ps1 -Name <String> [-Start] [-Stop] [<CommonParameters>]


I am looking for something more like this:

SYNTAX
    C:\Set-AzureVM.ps1 -ResourceGroup <String> -Start [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> -Start [<CommonParameters>]

    C:\Set-AzureVM.ps1 -Name <String> -Start [<CommonParameters>]

    C:\Set-AzureVM.ps1 -ResourceGroup <String> -Stop [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> -Stop [<CommonParameters>]

    C:\Set-AzureVM.ps1 -Name <String> -Stop [<CommonParameters>]

仅需结束此操作即可...我最终对此做了一些更改(需要更改,代码也更改了)。正如其他人所建议的那样,我同意我试图做的事情无论如何都是不可能的。另外,我正在处理用户将在代码中同时选择-Start和-Stop或都不选择的可能性。感谢大家的评论!

SYNTAX
    C:\Set-AzureVM.ps1 -Name <String> -ResourceGroup <String> [-Start] [-Stop] [<CommonParameters>]

    C:\Set-AzureVM.ps1 -File <String> [-Start] [-Stop] [<CommonParameters>]

1 个答案:

答案 0 :(得分:2)

我认为您尝试做的事是不可能的。您可以考虑将功能分解为两个单独的脚本。

  • Start-AzureVM.ps1
  • Stop-AzureVM.ps1

或者,您可以使用开关-stop进行启动和停止。默认情况下,-stop在您的脚本或函数中的值为$false

# implicitly start the vm
Set-AzureVM.ps1 -Name <String>

# explicitly stop the vm
Set-AzureVM.ps1 -Name <String> -stop
function Set-AzureVM () {
    param(
        [Parameter (Mandatory, ParameterSetName = 'ByFile')]
        [string]$File,

        [Parameter (Mandatory, ParameterSetName = 'ByName')]
        [string]$Name,

        [switch]$Stop
    )
    if($Stop){
        Write-Host 'Stopping VM'
    }
    if(!$stop){
        Write-Host 'Starting VM'
    }
}

Get-Command Set-AzureVM -Syntax
Set-AzureVM -File <string> [-Stop] [<CommonParameters>]

Set-AzureVM -Name <string> [-Stop] [<CommonParameters>]