仅在使用可选开关时如何指定必需参数

时间:2017-09-19 11:00:07

标签: powershell

我正在处理CSV文件以插入列。如果文件有字段名称的头记录(-hasheader),那么我还需要一个列名(-new_label)值。

我将这两个参数放入参数集中,但如果未使用-hasheader,则不需要-new_label。除非使用-hasheader,否则如何才能使-new_label不被要求?这是必须使用DynamicParam的吗?

[cmdletbinding()]
Param(
    [Parameter(Mandatory=$true, position=0)]
    [string]$csv_in
    ,[Parameter(Mandatory=$true, position=1)]
    [string]$csv_out
    ,[Parameter(Mandatory=$true, position=2)]
    [string]$column
    ,[Parameter(Mandatory=$true, position=3)]
    [string]$new_value
    ,[Parameter(Mandatory=$false, ParameterSetName="HeaderRecord")]
    [switch]$hasheader
    ,[Parameter(Mandatory=$true, ParameterSetName="HeaderRecord")]
    [string]$new_label
    ,[Parameter(Mandatory=$false)]
    [string]$delimiter = ','
    ,[Parameter(Mandatory=$false)]
    [string]$quote = '"'
)

我也尝试了以下内容。 PowerShell没有抱怨Mandatory值是一个脚本块,但它仍然需要new_label参数。

,[Parameter(Mandatory={$hasheader -eq $true}, ParameterSetName="HeaderRecord")]

1 个答案:

答案 0 :(得分:2)

使默认参数设置为HeaderRecord以外的其他内容:

[CmdletBinding(DefaultParameterSetName='foo')]
Param(
    [Parameter(Mandatory=$true, Position=0)]
    [string]$csv_in,

    [Parameter(Mandatory=$true, Position=1)]
    [string]$csv_out,

    [Parameter(Mandatory=$true, Position=2)]
    [string]$column,

    [Parameter(Mandatory=$true, Position=3)]
    [string]$new_value,

    [Parameter(Mandatory=$false, ParameterSetName="HeaderRecord")]
    [switch]$hasheader,

    [Parameter(Mandatory=$true, ParameterSetName="HeaderRecord")]
    [string]$new_label,

    [Parameter(Mandatory=$false)]
    [string]$delimiter = ',',

    [Parameter(Mandatory=$false)]
    [string]$quote = '"'
)