Как проверить зависимые параметры в командлете PowerShell

Как лучше всего выполнить проверку командлета PowerShell для зависимых параметров? Например, в приведенном ниже примере командлета мне нужно выполнить проверку того, что Low больше, чем High, но это кажется невозможным с атрибутами проверки.

[Cmdlet(VerbsCommon.Get, "FakeData")]
public class GetFakeData : PSCmdlet
{
    [Parameter(Mandatory = true)]
    [ValidateNotNullOrEmpty]
    public int Low { get; set; }

    [Parameter(Mandatory = true)]
    [ValidateNotNullOrEmpty]
    public int High { get; set; }

    protected override void BeginProcessing()
    {
        if (Low >= High)
        {
            // Is there a better exception to throw here?
            throw new CmdletInvocationException("Low must be less than High");
        }

        base.BeginProcessing();
    }

    protected override void OnProcessRecord()
    {
       // Do stuff...
    }
}

Есть ли лучший способ сделать это? Главное, что мне не нравится в приведенном выше решении, это то, что я не могу выдать ParameterBindingException, как это сделали бы атрибуты проверки, поскольку это внутренний класс. Я мог бы выбросить ArgumentException или PSArgumentException, но это действительно для методов, а не для командлетов.


person Scott Lerch    schedule 12.09.2013    source источник


Ответы (1)


Вам нужно что-то вроде командлета get-random. Поскольку вы не можете использовать атрибут [validatescript()] в командлете, потому что он действителен только для функции/скрипта powershell во время выполнения, вам нужно украсть идею из microsoft.powershell.utility\get-random:

Проверка значения выполняется в BeginProcessing() и использует пользовательскую ошибку ThrowMinGreaterThanOrEqualMax

protected override void BeginProcessing()
    {
      using (GetRandomCommand.tracer.TraceMethod())
      {
        if (this.SetSeed.HasValue)
          this.Generator = new Random(this.SetSeed.Value);
        if (this.EffectiveParameterSet == GetRandomCommand.MyParameterSet.RandomNumber)
        {
          if (this.IsInt(this.Maximum) && this.IsInt(this.Minimum))
          {
            int minValue = this.ConvertToInt(this.Minimum, 0);
            int maxValue = this.ConvertToInt(this.Maximum, int.MaxValue);
            if (minValue >= maxValue)
              this.ThrowMinGreaterThanOrEqualMax((object) minValue, (object) maxValue);
            this.WriteObject((object) this.Generator.Next(minValue, maxValue));
          }
          else
          {
            double min = this.ConvertToDouble(this.Minimum, 0.0);
            double max = this.ConvertToDouble(this.Maximum, double.MaxValue);
            if (min >= max)
              this.ThrowMinGreaterThanOrEqualMax((object) min, (object) max);
            this.WriteObject((object) this.GetRandomDouble(min, max));
          }
        }
        else
        {
          if (this.EffectiveParameterSet != GetRandomCommand.MyParameterSet.RandomListItem)
            return;
          this.chosenListItems = new List<object>();
          this.numberOfProcessedListItems = 0;
          if (this.Count != 0)
            return;
          this.Count = 1;
        }
      }
    }

...

private void ThrowMinGreaterThanOrEqualMax(object min, object max)
    {
      if (min == null)
        throw GetRandomCommand.tracer.NewArgumentNullException("min");
      if (max == null)
        throw GetRandomCommand.tracer.NewArgumentNullException("max");
      string errorId = "MinGreaterThanOrEqualMax";
      this.ThrowTerminatingError(new ErrorRecord((Exception) new ArgumentException(this.GetErrorDetails(errorId, min, max).Message), errorId, ErrorCategory.InvalidArgument, (object) null));
    }

Вы можете использовать декомпилятор ( dotPeak ), чтобы увидеть остальную часть кода и узнать больше о пользовательских ошибках для командлет

person CB.    schedule 12.09.2013
comment
Это именно то, что я искал спасибо. Я нашел этот документ MSDN о том, как правильно создать ErrorRecord: msdn.microsoft.com/en-us/library/ms714465(v=vs.85).aspx, и раздел примечаний ThrowTerminatingError здесь, в MSDN, подкрепил использование, отображаемое в вашем ответе: msdn.microsoft.com/en -нас/библиотека/ - person Scott Lerch; 12.09.2013
comment
@ScottLerch Рад помочь! - person CB.; 13.09.2013