如何使ValidateSet根据以前的参数显示不同的数据

库尔比茨

我想在脚本中验证用户输入,该脚本在Active Directory中设置公司,部门和办公室的属性。

到目前为止,这是我得到的:

$ApprovedLocations = #A table with known Company,Department,Office values
Class Company : System.Management.Automation.IValidateSetValuesGenerator {
    [String[]] GetValidValues(){
        return $global:ApprovedLocations.Company
    }
}
Class Department : System.Management.Automation.IValidateSetValuesGenerator {
    [String[]] GetValidValues(){
        return $global:ApprovedLocations.Department
    }
}
Class Office : System.Management.Automation.IValidateSetValuesGenerator {
    [String[]] GetValidValues(){
        return $global:ApprovedLocations.Office
    }
}    
function Set-AttributeTest{
    param (
        [Parameter(Mandatory)][string]$Name,
        [ValidateSet([Company])][string]$Company,
        [ValidateSet([Department])][string]$Department,
        [ValidateSet([Office])][string]$Office
    )
#Do stuff
}

这可以防止输入错误。但是由于并非所有公司都拥有相同的部门和办公室,因此我希望ValidateSet根据先前的参数允许不同的值。例如,只允许在不同公司中实际存在的办公室和部门组合。

例子:

Company A
      |-- HR
      |    |-- Office A
      |    |-- Office B
      |
      |-- IT
           |-- Office C
           |-- Office D

Company B
      |-- Design
      |    |-- Office E
      |    |-- Office F
      |
      |-- Finance
// ...etc

有没有办法在Powershell中使用参数来执行此操作,还是我应该重新考虑整个过程?

Filimonic

有变体:


动态参数用于单个动态参数的示例

$global:CompanyDepts = @{ 
    'Contoso' = @('Sales', 'IT')
    'Adatum' = @('HR', 'Shipping')
}

function Test-DynParam {
  [CmdletBinding()]
  Param(
      [Parameter(Mandatory=$true)]
      [ValidateSet('Contoso', 'Adatum')]
      [String]$Company
  )

  DynamicParam {
    if (-not [String]::IsNullOrWhiteSpace($Company) -and $global:CompanyDepts.ContainsKey($Company) )
    {
      $attrDept = [System.Management.Automation.ParameterAttribute]::new()
      $attrDept.ParameterSetName = 'CompanySet'
      $attrDept.Mandatory = $true
            
      $attrDeptValidation = [System.Management.Automation.ValidateSetAttribute]::new([String[]]$global:CompanyDepts[$Company])

      $attributeCollection = [System.Collections.ObjectModel.Collection[System.Attribute]]::new()
      $attributeCollection.Add($attrDept)
      $attributeCollection.Add($attrDeptValidation )

      $param = [System.Management.Automation.RuntimeDefinedParameter]::new('Department', [String], $attributeCollection)
      $paramDict = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
      $paramDict.Add('Department', $param)
      return $paramDict
    }
  }

  process {
    $PSBoundParameters.Keys | % { Write-Host "$($_)=$($PSBoundParameters[$_])" }
  }
}

请注意,您应该帮助用户获得最佳使用体验,因此请记住,一个用户可以开始键入My-Cmdlet -Company ...假定Department自动完成,而另一个用户更喜欢键入My-Cmdlet -Department ...假定Company自动完成,因此应该将ParameterSets和DynamicParams组合在一起

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何隐藏ngFor的div并根据以前的ngFor显示

如何根据以前的值显示选中的单选按钮?

如何根据以前的状态在熊猫数据框中创建一列?

如何根据以前的类别在熊猫数据框中创建一个新类别?

根据以前的选择显示选择选项

如何根据商店计划过滤核心数据以仅显示未清的那些数据?

如何根据以前的过滤结果简化流搜索?

如何根据以前下载的信息获取图像列表?

如何根据以前的连续行过滤出行?

如何根据以前的值更新MongoDB文档?

根据参数显示不同的消息

如何格式化JSON数据以在不同的div中显示结果对象

如何根据合并数据使Mail Merge显示不同或删除TEXT?

根据参数显示json数据

根据以前的值将列添加到pandas数据框

根据以前的数据获取时间段内唯一值的数量

根据以前的记录更新列

根据以前的评分创建顺序排名

根据以前的 ID 获取记录 - Laravel

如何准备数据加载的数据以显示在UI接口中?

如何根据以前的值将当前级别的值设置为零

如何根据以前和将来的值填充缺失或空值?

我如何根据以前的答案呈现下一个问题

如何根据以前的日期以编程方式对 R 中的日期进行子集化?

UIPICKERVIEW 根据选择的行显示不同的数据

如何过滤 JSON 数据以按某些单词显示字段?

如何透视时间序列数据以显示每月的总和/计数

React-如何获取更新的数据以显示在表中?

如何从Controller获取计算的数据以查看并显示(laravel)?