PowerShell PSBoundParameters处理没有提供任何价值

时间:2018-04-19 07:09:33

标签: powershell parameters

对于我的脚本,我有一些类似的参数:

[Alias("f")]
[string]$file

当用户在命令行输入时:“./ script.ps1 -f”

出现错误>“缺少参数的参数......” 我想自己处理这个错误,默认错误是技术性的,而且很麻烦。

我想让用户友好和可读,无论如何? 我读过的每一条建议都说它是强制性的。

但它不是强制性命令,我想要完成的是如果有人提供参数标记(AKA“-file”),但无法为其提供值。

2 个答案:

答案 0 :(得分:2)

您可以使用[AllowNull()] paremeter属性,然后检查并处理您的自我。

Advanced Fuction parameter validation

[Cmdletbinding()]
Param
(
    [Alias("f")]
    [AllowNull()]
    [string]$file
)
Begin
{
    If($PSBoundParameters.ContainsKey('file') -and -not $file)
    { 
       Write-error 'ouch my user friendly error'
    }
}
Process{}
End{}

注意:不需要begin,process,end blocks,但这是一个很好的标准。详细了解他们herehere

缺点是仍需要传递$null''参数值。

如果你开始研究这个问题,那么有很多关于人们尝试类似目标的帖子。

1 - passing-null-to-a-mandatory-parameter-to-a-function

2 - PS Git Issue - 4616

3 - PS Git Issue - 4208

4 - powershell-param-statement-error-trap

5 - alternative-to-throwing-param-exceptions-in-powershell

答案 1 :(得分:0)

您想要的是使用 [Switch] 参数。开关参数是没有参数值的参数。它们只有在使用时才有效,而且只有一种效果。

您可以使用 get-help 验证您的脚本需求。在您的情况下,它会显示如下内容:

get-help .\script.ps1
script.ps1 [[-file] <Object>]

但是如果你像这样定义参数:

Param
(
    [Alias("f")]
    [Switch]$file
)

get-help 现在将显示不需要任何对象:

get-help .\script.ps1
script.ps1 [-file]

一个完整的例子看起来像这样:

Param
(
    [Alias("f")]
    [Switch]$file
)
If($file) { 
    Write-Host '-f Switch enabled'
}
Else {
    Write-Host 'Missing -f Switch'
}

您现在可以像 .\script.ps1 -file.\script.ps1 -f 一样调用您的脚本,并且控制台中的输出将是“-f Switch enabled”