PowerShell Param()语句+错误陷阱

时间:2013-12-05 14:46:49

标签: powershell parameters

我们使用以下语句使TeamCity能够识别PowerShell部署脚本中的错误:

trap { $host.SetShouldExit(1) }

然而,这很好,因为Param(...)需要成为我们使用此顺序的第一个声明:

Param(
    ...
)

Set-StrictMode -Version 2.0
$ErrorActionPreference = "Stop"
trap { $host.SetShouldExit(1) }

在Param()评估过程中是否有任何方法可以捕获错误?例如。如果我们省略了一个强制参数,TeamCity目前无法检测到这一点。

4 个答案:

答案 0 :(得分:3)

这是对Powershell的另一个恼人的疏忽。我发现解决此Powershell错误的最佳方法是推出自己的强制验证。这是更多的代码,但清晰,简单且无故障安全。

首先从param声明中删除强制标志,并在脚本开头检查null或empty。

param (
    [string] $required_param
)
# Check required params
if ([string]::IsNullOrEmpty($required_param)) {
    Write-Host "The required_param is required."
    exit 1;
}

另外,您可以使用常规File参数调用脚本:

powershell -File foo.ps1

希望这有帮助。

答案 1 :(得分:1)

尝试将陷阱放入TeamCity字符串中以执行。例如,假设我在脚本顶部有一个带有param块的脚本(foo.ps1),其中包含一个我不提供的强制参数,例如:

param([Parameter(Mandatory)][int]$num, [bool]$bool)

然后我可以从CMD执行它并获得错误退出代码:

C:\> cmd /c Powershell.exe -NonInteractive -Command "& {trap {exit 1}; c:\foo.ps1}"
C:\> %ERRORLEVEL%
1

顺便说一下,你可能会发现this blog post一个有趣的读物。

答案 2 :(得分:0)

如果我理解正确,您需要执行PowerShell脚本,并让TeamCity看到返回的错误。我认为这与我捕获并返回需要与计划任务一起运行的脚本中的错误非常类似。

我是如何做的首先是为你想做的一切制作函数/ cmdlts。然后在try..catch块中执行这些函数。 e.g。

#My test function
Function test{
Param( [Parameter(Mandatory=$true)] [int]$a )
Process
    {
        Write-Host "Hi $a"
    }
}

#Execute Function
Try{
    test 1234 -ErrorAction "Stop"
}
Catch
{
    #Error encountered
    Write-Host "Error Encountered: exiting"
    #Return Bad error code
    Exit 1
}

这应该捕获任何不正确的参数。

这可能不适用,但是其他人的参考,对于计划任务,我使用以下命令运行我的计划任务:

powershell.exe -Command ". C:\Scripts\Run_PS1.ps1 ; exit $LASTEXITCODE"

这将运行powershell,执行脚本,然后将最后一个退出代码正确地返回到计划任务。

希望这可以帮助你。

答案 3 :(得分:0)

实际上,我有同样的问题,最终将两种方法结合在一起:

  1. 使用-Command调用powershell.exe来捕获参数错误
  2. 在Powershell脚本中使用trap来处理-中的错误,并使用$LASTEXITCODE来平衡Powershell's behavior

BAT / CMD中的呼叫方:

@echo off
powershell -NoLogo -NonInteractive -Command "& {trap {Write-Error $_; exit 2}; scipt.ps1 %1 %2 %3 %4 %5 %6 %7 %8 %9 ; exit $LASTEXITCODE}"
IF %ERRORLEVEL% NEQ 0 Exit /B %ERRORLEVEL%
Goto :EOF

:EOF

PowerShell脚本

Param(
    ...
)

Set-StrictMode -Version 2.0
$ErrorActionPreference = "Stop"
trap { Exit(1) }

...

通过这种方式,可以在Param错误(退出代码2)和脚本本身的错误(退出代码1)之间做出决定