C#Binary PowerShell模块中的ValidateScript ParameterAttribute

时间:2015-01-12 18:31:02

标签: c# powershell binary powershell-module

我最近开始尝试使用C#进行二进制PowerShell编程,我在使用ParameterValidationAttributes时遇到了一些问题,主要是ValidateScript属性。基本上,我想创建一个名为" ComputerName"并验证计算机当时是否在线。在PowerShell中很容易:

    [Parameter(ValueFromPipeLine = $true)]
    [ValidateScript({ if (Test-Connection -ComputerName $_ -Quiet -Count 1) { $true } else { throw "Unable to connect to $_." }})]
    [String]
    $ComputerName = $env:COMPUTERNAME,

但我无法弄清楚如何在C#中复制它。 ValidateScript属性采用ScriptBlock对象http://msdn.microsoft.com/en-us/library/system.management.automation.scriptblock(v=vs.85).aspx我只是不确定如何在C#中创建它,我真的找不到任何示例。

[Parameter(ValueFromPipeline = true)]
[ValidateScript(//Code Here//)]
public string ComputerName { get; set; }

C#对我来说很新,所以如果这是一个愚蠢的问题,我会道歉。这是ValidateScript属性类的链接:http://msdn.microsoft.com/en-us/library/system.management.automation.validatescriptattribute(v=vs.85).aspx

2 个答案:

答案 0 :(得分:3)

在C#中是不可能的,因为.NET只允许编译时常量,typeof表达式和属性参数的数组创建表达式,而只有string之外的引用类型的常量可用{{1 }}。相反,您应该从null派生并覆盖ValidateArgumentsAttribute来执行验证:

Validate

答案 1 :(得分:0)

只是用一个更完整的示例扩展上述user4003407的答案。

从ValidateArgumentsAttribute派生新的验证器,并覆盖Validate以执行验证。验证是无效的,因此在您选择的情况下,您实际上只会引发异常。

Kevin Marquette具有出色的article,但功能强大。这是一个c#示例:

[Cmdlet(VerbsCommon.Get, "ExampleCommand")]
public class GetSolarLunarName : PSCmdlet
{   
    [Parameter(Position = 0, ValueFromPipeline = true, Mandatory = true)]
    [ValidateDateTime()]
    public DateTime UtcDateTime { get; set; }

    protected override void ProcessRecord()
    {

        var ExampleOutput = //Your code
        this.WriteObject(ExampleOutput);
        base.EndProcessing();
    }
}

class ValidateDateTime:ValidateArgumentsAttribute {
protected override void Validate(object arguments,EngineIntrinsics engineIntrinsics) {
    var date = (DateTime)arguments;
    if( date.Year < 1700 || date.Year > 2082){
        throw new ArgumentOutOfRangeException();
    }

}
相关问题