Назад | Перейти на главную страницу

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

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

Я хочу получить то, что

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

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

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
)

Хм, я думаю, у вас слишком много наборов параметров. Также не уверен, почему у вас есть отдельные параметры пользователя / пароля и параметр 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.

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

это мое решение благодаря бриантисту

[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
)