PowerShell中[ValidateSet]验证参数为何不设置$LASTEXITCODE?
ValidateSet参数验证时$LASTEXITCODE未设置的原因及解决方法
为什么传入无效参数时$LASTEXITCODE未被设置?
ValidateSet的参数验证逻辑在脚本实际执行前触发:PowerShell会先完成所有参数的绑定与校验,只有校验通过后才会执行脚本主体代码(包括exit 0这类退出语句)。如果参数校验失败,脚本根本没进入执行阶段,自然不会触发任何exit指令,而$LASTEXITCODE仅记录进程或脚本正常执行结束后的退出码,因此此时该变量不会被设置。
如何让无效参数输入时返回$LASTEXITCODE=1?
可以通过trap语句捕获参数验证失败抛出的ParameterBindingValidationException异常,在异常处理逻辑中直接设置退出码并退出,无需额外用if-else手动验证参数值。修改后的脚本如下:
[CmdletBinding()] Param( [Parameter(Mandatory)] [ValidateSet("a", "b")] [string] $first_param, [Parameter(Mandatory)] [ValidateSet("c", "d")] [string] $second_param ) trap [ParameterBindingValidationException] { $LASTEXITCODE = 1 exit $LASTEXITCODE } exit 0
当传入无效参数触发验证错误时,trap会捕获对应的异常,将$LASTEXITCODE设为1并终止脚本,此时外部就能获取到预期的退出码。
内容的提问来源于stack exchange,提问作者Felix Waltl
相关产品推荐
相关产品推荐

