Я пытаюсь сделать твердую функцию PowerShell с параметрами. Теперь проблема, я не заставляю ParameterSetNames работать.
То, что я хочу получить, является этим
Я попробовал много различных настроек, но сохраняю, в случае неудачи была моя последняя попытка
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 набора параметров:
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-адрес.
это мое решение. благодаря 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
)