【问题标题】:Is it possible to force PowerShell script to throw if a required parameter is omitted?如果省略必需的参数,是否可以强制 PowerShell 脚本抛出?
【发布时间】:2012-02-29 20:24:45
【问题描述】:

我希望此脚本中的第二个函数调用引发错误:

function Deploy
{

param(

    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$BuildName

    )
    Write-Host "Build name is: $BuildName"

}

Deploy "Build123"

Deploy #Currently prompts for input

提示非常适合以交互方式使用脚本,但这也将由我们的构建服务器执行。

我最好的选择是使用if 或其他东西进行一些自定义验证吗?

【问题讨论】:

  • 请注意,如果您使用 -NonInteractive 标志运行 powershell.exe,缺少强制参数将导致错误并导致进程的退出代码为非零。
  • 查看这个问答,我在其中发布了一个不涉及手动调用 PowerShell 可执行文件的解决方案,而是使用后台作业。 stackoverflow.com/questions/45935954/…

标签: powershell


【解决方案1】:

一旦参数被标记为强制,PowerShell 将提示输入值。也就是说,如果您删除了强制属性,那么您可以使用 throw 语句设置默认值:

function Deploy
{
    param(
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]$BuildName=$(throw "BuildName is mandatory, please provide a value.")
    )

    Write-Host "Build name is: $BuildName"
}

【讨论】:

  • 奇怪的是,对于管道绑定的参数,默认值仍然会被评估,这似乎使得这种技术在参数丢失时无法用于抛出错误......至少如果你正在使用管道参数。
  • This question 讨论了如果您使用管道参数,这种解决方法的不幸缺点。
【解决方案2】:

@Emperor XLII 对这个问题有一个很好的评论,我认为这对于某些用例可能是一个更好的答案:

如果您使用-NonInteractive 标志运行powershell.exe,则缺少 强制参数将导致错误并导致非零退出 进程代码。

使用它的原因可能是:

  1. 您有很多这样的Mandatory=$true 参数,并且转换所有这些参数的成本很高。
  2. 该脚本将以交互方式和非交互方式使用,并且当以交互方式运行时,您确实希望收到缺少参数的提示。

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2014-03-21
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多