传递可选参数

时间:2016-11-11 13:43:46

标签: powershell parameters

我有一个PowerShell脚本 v space "123 456" v comma "123,456" v negative sign "123-456" ,代码如下:

CSV2JSON.ps1

如果我将其称为param( [String]$FieldSeparator=",", [String[]]$Header ) $input | ConvertFrom-Csv -Delimiter $FieldSeparator -Header $Header | ConvertTo-JSON ,则可以正常使用。但是,如果我删除可选参数.\CSV2JSON.ps1 -FieldSeparator "|" -Header "name|age",则Header cmdlet会抱怨ConvertFrom-Csv不能为空:

Header

如果没有提供,我根本不想传递ConvertFrom-Csv : Cannot validate argument on parameter 'Header'. The argument is null. Supply a non-null argument and try the command again. 参数。是否有一种简洁的方法来传递可选参数而无需进入-Header语句?

4 个答案:

答案 0 :(得分:5)

我很惊讶没有人建议splatting $PSBoundParameters自动变量。

$PSBoundParameters是一个哈希表,包含传递给命令的所有参数参数。

只需将$FieldSeparator参数重命名为$Delimiter,即可开始使用。 如果需要,您可以提供FieldSeparator名称作为参数别名:

param(
        [Alias('FieldSeparator')]
        [String]$Delimiter=",",
        [String[]]$Header
)

$input | ConvertFrom-Csv @PSBoundParameters | ConvertTo-JSON

如果在执行调用函数/脚本时省略-Header参数,则在调用ConvertFrom-Csv

时也会省略它

答案 1 :(得分:2)

Martin Brandl是对的,您必须使用if,但我建议将其与splatting合并,以便您只拨打一次电话:

param(
        [String]$FieldSeparator=",",
        [String[]]$Header
)

$params = @{
    Delimeter = $FieldSeparator
}
if ($Header) {
    $params.Header = $Header
}

$input | ConvertFrom-Csv @params | ConvertTo-JSON

答案 2 :(得分:1)

好的,根据Martin的反馈我还有其他选择。当参数名称匹配时,这很有效:

param(
    $Path,
    $Delimiter,
    $Header
)

$params = @{}
$MyInvocation.BoundParameters.Keys | Where {$_} |
    % {$params.Add($_, (Get-Variable $_).Value )}

Import-Csv @params

答案 3 :(得分:0)

不幸的是没有。您必须利用if语句。这样可以用于布尔值或开关值,例如:

param(
        [String]$FieldSeparator=",",
        [String[]]$Header,
        [switch]$Compress        
)

$input | ConvertFrom-Csv -Delimiter $FieldSeparator | ConvertTo-JSON -Compress:$Compress

注意:您可以使用MyInvocation.BoundParameter和splatting进行此操作,但我怀疑这会使您的脚本更具可读性。