3

我有一个参数如下:

[Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true)]
[AllowEmptyString()]
[ValidateSet("1", "2", "3", "4", "5", "6", "Critical", "Important", "High", "Medium", "Low", "Lowest")]
public string Priority { get; set; }

当我使用 运行命令时-Priority "",它不起作用

我知道我可以跳过参数,但对我来说真正的问题是当我使用 import-csv 中的管道执行命令时

如果我的 csv 没有任何值,Import-Csv 会将我的参数值更新为空,因此我收到以下错误:

Cannot validate argument on parameter 'Priority'. The argument "" does not belong to the set "1,2,3,4,5,6,Critical,Important,High,Med
ium,Low,Lowest" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.

如果我扩展我的验证集以包含“”,则如果单独调用该命令会成功运行,但是如果我将它通过管道传输到Import-Csv

我也尝试过AllowNull属性,但仍然是同样的错误

更新: 在与 Garath 讨论后,我似乎认为

  1. AllowEmptyString 不起作用,而是在 ValidateSet 中使用“”

    这个问题仍然没有答案 - 为什么[AllowEmptyString()]不起作用?

  2. 即使没有值,CSV 文件也必须有逗号

    在这里,如果不存在尾随逗号,则将Import-Csvnull 传递给命令,并且验证失败ValidateSet

    当存在尾随逗号时,似乎将空传递给可接受的参数,因为该集合包括“”

4

2 回答 2

2

我在简单的 ps1 脚本中模拟了您的问题,并且它正在工作(另存为 fun2.ps1):

param(
[Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$true)]
[string]
[ValidateSet("","1", "2", "3", "4", "5", "6")]
$a
)

Write-Host $a

CSV 如下所示(doc.txt):

"ColName"
"2"
""
"3"

Powershell命令是:

Import-Csv .\doc.txt | %{.\fun2.ps1 $_.ColName}

上述命令的输出为:

PS C:\ps> Import-Csv .\doc.txt | %{.\fun2.ps1 $_.ColName}
2

3

所以只需删除[AllowEmptyString()]并将您的验证集更改为:

[ValidateSet("", "1", "2", "3", "4", "5", "6", "Critical", "Important", "High", "Medium", "Low", "Lowest")]
于 2013-05-21T06:45:52.710 回答
1

AllowEmptyString 正在工作。如果不是,您将收到一条错误消息,例如

无法将参数绑定到参数“优先级”,因为它是一个空字符串。

ValidateSet是导致问题的验证,因为您的集合不包含空字符串

我认为您不需要两个验证。删除AllowEmptyString()验证并添加""为您设置的元素。

[Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true)]
[ValidateSet("", "1", "2", "3", "4", "5", "6", "Critical", "Important", "High", "Medium", "Low", "Lowest")]
[string] Priority
于 2015-08-05T22:19:48.220 回答