Я пытаюсь создать надежную функцию 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.
Я также удалил [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
)