powershell - 我应该使用 [ValidateNotNullOrEmpty()] 然后在函数中查找空格,还是使用 [ValidateScript(...)]?

标签 powershell

因为在 PowerShell 中没有

[ValidateNotNullOrWhiteSpace()]

参数属性,是不是更好用
[ValidateNotNullOrEmpty()]

作为参数属性,然后在函数内部寻找空格,或者我应该使用
[ValidateScript({ -not ([String]::IsNullOrWhiteSpace($_)) })]

作为参数属性。

我不确定 NotNullOrEmpty 属性的真正用处是什么,因为 99% 的时间,我都不希望它起作用:
My-Cmdlet -ParameterName " "

但因为 ""仍然是一个字符串,它会传递 NotNullOrEmpty 属性。

最佳答案

[ValidateNotNullOrEmpty()]有利于完全按照它所说的去做。

要回答您的第一个问题,我将使用 [ValidateScript(...)]你概述的方法。

要记住的一件事是 [ValidateScript()] 的错误消息通常很糟糕,对最终用户没有帮助。作为一种解决方法,您可以执行以下操作:

[ValidateScript( { 
    ![String]::IsNullOrWhiteSpace($_) -or throw 'Your string is null or contains whitespace' 
} )]

您还可以在 throw 中包含一个异常类,例如:

throw [System.ArgumentException]'Blah blah whitespace'

为什么-or throw语法有效

PowerShell 中的 bool 运算符的工作方式与许多其他语言一样,因为它们执行“快捷方式”。一旦结果确定,他们就停止评估表达式。所以对于 $false -and $(sleep -min 10)不需要 10 分钟,因为从不评估第二个 expr。

同样,$true -or $(something)不会评估第二个,因为如果第一个表达式为真,它将始终为真。

所以在这种情况下它是相似的。 ValidateScript需要一个 bool 值。如果我们关心的条件为真,它就会停在那里。如果不是,则计算第二个表达式,因为这是一个 throw它只会失败,但在这种情况下,您可以控制失败消息(如果需要,还可以控制异常类)。

关于powershell - 我应该使用 [ValidateNotNullOrEmpty()] 然后在函数中查找空格,还是使用 [ValidateScript(...)]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29903955/

相关文章:

c# - 在 ProcessRecord 中停止执行 cmdlet

mysql - 如何使用 Powershell 和 MySQL 打印受影响行的输出?

powershell - 同一个模块再次导入后,从模块导入的变量变为$null

powershell - 带有德国变音符号的导入-CSV/导出-Csv (ä,ö,ü)

sql-server - 用BulkCopy覆盖SQL Server表数据

json - 从xml文档/Powershell/控制数组格式生成JSON

c# - 在 powershell 和 C# 之间共享变量

regex - 正则表达式中 (?s) 的含义

powershell - 如何使用 PowerShell 在 Azure 存储表中获取行?

python - 从 Python 脚本运行 PowerShell 函数