powershell 正在验证默认值

vsdwdz23  于 5个月前  发布在  Shell
关注(0)|答案(2)|浏览(41)

我试图验证变量$var1$var2的null或空值。有人能告诉我哪里做错了吗?
testing.ps1

Param (
    [ValidateNotNullOrEmpty()][String]$var1 = $defaultvar1,
    [ValidateNotNullOrEmpty()][String]$var2 = $defaultvar2
)
Write-Host "Value of Variable 1 : $var1 "
Write-Host "Value of Variable 2 : $var2 "

字符串
输出量:

PS> **.\testing.ps1**
Value of Variable 1 :
Value of Variable 2 :
PS> **$defaultvar1=123**
PS> **$defaultvar2=678**
PS> **.\testing.ps1**
Value of Variable 1 : 123
Value of Variable 2 : 678
PS> **$defaultvar2=""**
PS> **.\testing.ps1**
Value of Variable 1 : 123
Value of Variable 2 :

m2xkgtsf

m2xkgtsf1#

正如Lee_Daily指出的那样:

参数 * 默认值不 * 验证**-假设您作为函数作者,将确保值是有效的。

一个简单的例子:

PS> & { param([ValidateNotNullOrEmpty()] $foo = '') "foo: [$foo]" }
foo: []

字符串
也就是说,''被愉快地接受为默认值,即使它与[ValidateNotNullOrEmpty()]相矛盾。
另外,你通常不应该使用 * 函数外部变量值 * 作为参数默认值,因为这会使函数的行为难以预测。
相反,用途:

  • 文字(例如,$foo = 'bar'

  • 表达式(例如,$foo = (Get-Date)

也就是说,正如Mike Shepard指出的,*引用变量 * 是 * 一个选项, 如果 *:

  • 你的函数是在模块中定义的,
  • 而被引用的变量都是在同一个模块中定义的。
ohtdti5x

ohtdti5x2#

我遇到了同样的问题。我的解决方案是验证两次:

Param (
    [ValidateNotNullOrEmpty()][String]$var1 = $script:defaultVar1,
    [ValidateNotNullOrEmpty()][String]$var2 = $script:defaultVar2
)
if([string]::IsNullOrEmpty($var1)){ throw "var1 was not provided and defaultVar1 is null or empty" }
if([string]::IsNullOrEmpty($var2)){ throw "var2 was not provided and defaultVar2 is null or empty" }

Write-Host "Value of Variable 1 : $var1 "
Write-Host "Value of Variable 2 : $var2 "

字符串
ValidateNotNullOrEmpty属性负责验证入站参数,而IsNullOrEmpty处理defaultVar1defaultVar2为空的边缘情况
我发现这种模式在编写一个模块时很有用,在这个模块中,用户可以为常用的选项配置默认值。

相关问题