两个强制参数之一

due*_*uez 6 powershell

我正在尝试使用参数创建一个可靠的 PowerShell 函数。现在的问题是我没有让 ParameterSetNames 工作。

我想得到的是

  1. 计算机名或 ipaddress 始终是必需的
  2. 必须设置计算机名或 IP 地址,但不能同时设置(如果可能)
  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
)
Run Code Online (Sandbox Code Playgroud)

bri*_*ist 10

嗯,我觉得你的参数集太多了。也不确定为什么你有单独的用户/密码参数和 PSCredential 参数。您真的应该只使用 PSCredential。但我假设您出于某种原因需要这个(请考虑更改它)。

4个参数集:

  1. 计算机名信用
  2. 普通计算机名
  3. IP地址信用
  4. 普通IP地址
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,则转换将失败。


due*_*uez 6

这是我的解决方案,感谢 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)