один из двух обязательных параметров

Я пытаюсь сделать твердую функцию PowerShell с параметрами. Теперь проблема, я не заставляю ParameterSetNames работать.

То, что я хочу получить, является этим

  1. имя компьютера ИЛИ ipaddress всегда обязательны
  2. имя компьютера или ipaddress должны быть установлены, но не оба одновременно (Если возможный)
  3. если adminuser или adminpassword дают, другой обязателен

Я попробовал много различных настроек, но сохраняю, в случае неудачи была моя последняя попытка

CmdletBinding(DefaultParameterSetName="IpAddress")]  
[CmdletBinding()]
Param
(
     # computername: Name of the host you want to connect to.
     [Parameter(Mandatory=$true,ParameterSetName="ComputerName", Position=0)]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddress")]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNameCredentials", Position=0)]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddressCredentials")]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddressUser")]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNameUser", Position=0)]
     [String]$computername,

     # ipAddress: Ip Address of the host you want to connect to.
     [Parameter(Mandatory=$false,ParameterSetName="ComputerName")]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddress", Position=0)]
     [Parameter(Mandatory=$false,ParameterSetName="ComputerNameCredentials")]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressCredentials", Position=0)]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressUser", Position=0)]
     [Parameter(Mandatory=$false,ParameterSetName="ComputerNameUser")]
     [switch]
     [String]$ipAddress,

     # credentials: PowerShell credentials use to connect to the host.
     [Parameter(Mandatory=$false,ParameterSetName="ComputerName")]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddress")]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNameCredentials")]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressCredentials")]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddressUser")]
     [Parameter(Mandatory=$false,ParameterSetName="ComputerNameUser")]
     [PSCredential]$credentials,

     # adminUser: Username to use to connect to the host.
     [Parameter(Mandatory=$false,ParameterSetName="ComputerName")]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddress")]
     [Parameter(Mandatory=$false,ParameterSetName="ComputerNameCredentials")]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddressCredentials")]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressUser")]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNameUser")]
     [String]$adminUser,

     # adminPassword: Password to use to connect to the host.
     [Parameter(Mandatory=$false,ParameterSetName="ComputerName")]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddress")]
     [Parameter(Mandatory=$false,ParameterSetName="ComputerNameCredentials")]
     [Parameter(Mandatory=$false,ParameterSetName="IpAddressCredentials")]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressUser")]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNameUser")]
     [String]$adminPassword
)
6
задан 23 March 2015 в 17:30
2 ответа

Хм, я думаю, у вас слишком много наборов параметров. Также не уверен, почему у вас есть отдельные параметры пользователя / пароля и параметр PSCredential. Вам действительно стоит просто использовать PSCredential. Но я предполагаю, что вам это нужно по какой-то причине (рассмотрите возможность его изменения).

4 набора параметров:

  1. ComputerNameCred
  2. ComputerNamePlain
  3. IpAddressCred
  4. IpAddressPlain
function Thing {
    [CmdletBinding(DefaultParameterSetName="ComputerNameCred")]  
    Param
    (
         # computername: Name of the host you want to connect to.
         [Parameter(Mandatory=$true,ParameterSetName="ComputerNameCred", Position=0)]
         [Parameter(Mandatory=$true,ParameterSetName="ComputerNamePlain", Position=0)]
         [String]$computername,

         # ipAddress: Ip Address of the host you want to connect to.
         [Parameter(Mandatory=$true,ParameterSetName="IpAddressCred", Position=0)]
         [Parameter(Mandatory=$true,ParameterSetName="IpAddressPlain", Position=0)]
         [String]$ipAddress,

         # credentials: PowerShell credentials use to connect to the host.
         [Parameter(Mandatory=$true,ParameterSetName="ComputerNameCred")]
         [Parameter(Mandatory=$true,ParameterSetName="IpAddressCred")]
         [PSCredential]$credentials,

         # adminUser: Username to use to connect to the host.
         [Parameter(Mandatory=$true,ParameterSetName="IpAddressPlain")]
         [Parameter(Mandatory=$true,ParameterSetName="ComputerNamePlain")]
         [String]$adminUser,

         # adminPassword: Password to use to connect to the host.
         [Parameter(Mandatory=$true,ParameterSetName="IpAddressPlain")]
         [Parameter(Mandatory=$true,ParameterSetName="ComputerNamePlain")]
         [String]$adminPassword
    )
}

Get-Help Thing # use this to make sure your parameter sets are as they should be.

Я также удалил [переключатель] из параметра вашего IP-адреса; не уверен, почему это было там. Вы можете рассмотреть возможность использования [System.Net.IPAddress] для этого параметра вместо [String] . Он по-прежнему будет принимать строки (они будут преобразованы), но автоматически проверяет параметр, поскольку преобразование не будет выполнено, если это не действительный IP-адрес.

10
ответ дан 3 December 2019 в 00:06

это мое решение. благодаря briantist

[CmdletBinding(DefaultParameterSetName="ComputerName")]  
Param
(
     # computername: Name of the host you want to connect to.
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNameCred", Position=0)]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNamePlain", Position=0)]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerName", Position=0)]
     [String]$computername,
     # ipAddress: Ip Address of the host you want to connect to.
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressCred", Position=0)]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressPlain", Position=0)]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddress", Position=0)]
     [String]$ipAddress,

     # credentials: PowerShell credentials use to connect to the host.
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNameCred")]
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressCred")]
     [PSCredential]$credentials,

     # adminUser: Username to use to connect to the host.
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressPlain")]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNamePlain")]
     [String]$adminUser,

     # adminPassword: Password to use to connect to the host.
     [Parameter(Mandatory=$true,ParameterSetName="IpAddressPlain")]
     [Parameter(Mandatory=$true,ParameterSetName="ComputerNamePlain")]
     [String]$adminPassword,

     # writeLog: Boolean that enables or disables log-writing.
     [Parameter(Mandatory=$false)]
     [Boolean]$writeLog=$true
)
4
ответ дан 3 December 2019 в 00:06

Теги

Похожие вопросы