组合默认参数和参数集

Combining Default Parameter and Parameter Sets

我有一个 PowerShell 脚本可以获取 csv 中指定主机的数据,如果给定一个开关 reboot,也会尝试重新启动主机。因此,只有在重新启动的情况下,才需要凭据。

我的参数块是这样的:

[CmdletBinding(DefaultParametersetName = 'None')] 
Param(
  [Parameter(Mandatory = $false)]
  [ValidateNotNullOrEmpty()]
  [ValidateScript( {
      if ( -Not ($_ | Test-Path) ) {
        throw "Source $_ does not exist"
      }
      return $true
    })]
  $path= $(Join-Path $PWD.Path "sources.csv"),
  [Parameter(ParameterSetName = 'Extra', Mandatory = $false)]
  [switch]$reboot,
  [Parameter(ParameterSetName = 'Extra', Mandatory = $true)]
  [ValidateNotNullOrEmpty()]
  [System.Management.Automation.PSCredential] $credential = $(Get-Credential -UserName myUser)

)

我的期望:只有在给出 reboot 时,系统才会提示用户输入凭据。 但是无论给定什么参数,都会显示凭据弹出窗口。

我假设这与默认值有关。

您在这里根本不需要参数集。只需使用 Empty 凭据来初始化 $credential 参数:

[CmdletBinding()] 
Param(
  [ValidateNotNullOrEmpty()]
  [ValidateScript( {
      if ( -Not ($_ | Test-Path -PathType Leaf) ) {
            throw "Source $_ does not exist"
      }
    return $true
    })]
    $path = $(Join-Path $PWD.Path "sources.csv"),

    [switch]$reboot,

    [ValidateNotNullOrEmpty()]
    [System.Management.Automation.PSCredential]$credential = [System.Management.Automation.PSCredential]::Empty
)

# if no credential is given prompt for it
if ($credential -eq [System.Management.Automation.PSCredential]::Empty) {
    $credential = Get-Credential -UserName myUser -Message 'Please enter your username and password'
}

# rest of your code goes here

希望对您有所帮助