我想在脚本中验证用户输入,该脚本在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中使用参数来执行此操作,还是我应该重新考虑整个过程?
有变体:
将动态参数用于单个动态参数的示例。
$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] 删除。
我来说两句