我正在尝试使用参数创建一个可靠的 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
)
Run Code Online (Sandbox Code Playgroud)
bri*_*ist 10
嗯,我觉得你的参数集太多了。也不确定为什么你有单独的用户/密码参数和 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.
Run Code Online (Sandbox Code Playgroud)
我也去掉[switch]
了你的IP地址参数;不知道为什么会在那里。您可能需要考虑使用[System.Net.IPAddress]
for 该参数而不是[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
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12593 次 |
最近记录: |