我有一个具有许多高级功能的模块。我需要使用一长串验证参数列表。我想将可能参数的整个列表放在数组中,然后在函数本身中使用该数组。如何从数组中删除整个集合的列表?
New-Variable -Name vars3 -Option Constant -Value @("Banana","Apple","PineApple")
function TEST123 {
param ([ValidateScript({$vars3})]
$Fruit)
Write-Host "$Fruit"
}
问题是,当我使用该函数时,它不会从常数中拉出内容。
TEST123 -Fruit
如果我指定常数的索引值,则可以工作。
TEST123 -Fruit $vars3[1]
它返回苹果。
您正在误解验证方式...
验证验证验证属性
验证性属性属性指定了一个用于的脚本 验证参数或变量值。Powershell将价值输送到 脚本,如果脚本返回$ false或 脚本抛出异常。
当您使用验证属性属性时 验证的映射到$ _变量。您可以使用$ _变量来引用脚本中的值。
...工作。正如其他人指出的那样。您没有使用脚本使用静态变量。
为了得到我相信您所追求的目标,您会这样做。
(注意,也不需要写入 - ,因为输出到屏幕是powershell中的默认值。即使这样,避免使用写入主机,除了在目标方案中,例如使用颜色屏幕输出。然而,即使那样,您也不需要它。可以使用几种CMDLET,以及具有更灵活的颜色的方法。请参阅这些列出的MS PowerShelgallery.com模块(*
Find-Module -Name '*Color*'
调整您发布的代码,并合并Ansgar Wiechers向您展示。
$ValidateSet = @('Banana','Apple','PineApple') # (Get-Content -Path 'E:TempFruitValidationSet.txt')
function Test-LongValidateSet
{
[CmdletBinding()]
[Alias('tlfvs')]
Param
(
[Validatescript({
if ($ValidateSet -contains $PSItem) {$true}
else { throw $ValidateSet}})]
[String]$Fruit
)
"The selected fruit was: $Fruit"
}
# Results - will provide intellisense for the target $ValidateSet
Test-LongValidateSet -Fruit Apple
Test-LongValidateSet -Fruit Dog
# Results
The selected fruit was: Apple
# and on failure, spot that list out. So, you'll want to decide how to handle that
Test-LongValidateSet -Fruit Dog
Test-LongValidateSet : Cannot validate argument on parameter 'Fruit'. Banana Apple PineApple
At line:1 char:29
只需添加到文本数组/文件中,但这也意味着,该文件必须在每个主机上您使用此代码,或者至少能够达到UNC共享。
现在,您可以使用其他已记录的"动态参数验证集"。lee_daily指向您查找,但这在牙齿中要长一些。
示例:
function Test-LongValidateSet
{
[CmdletBinding()]
[Alias('tlfvs')]
Param
(
# Any other parameters can go here
)
DynamicParam
{
# Set the dynamic parameters' name
$ParameterName = 'Fruit'
# Create the dictionary
$RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
# Create the collection of attributes
$AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
# Create and set the parameters' attributes
$ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
$ParameterAttribute.Mandatory = $true
$ParameterAttribute.Position = 1
# Add the attributes to the attributes collection
$AttributeCollection.Add($ParameterAttribute)
# Generate and set the ValidateSet
$arrSet = Get-Content -Path 'E:TempFruitValidationSet.txt'
$ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($arrSet)
# Add the ValidateSet to the attributes collection
$AttributeCollection.Add($ValidateSetAttribute)
# Create and return the dynamic parameter
$RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
$RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
return $RuntimeParameterDictionary
}
begin
{
# Bind the parameter to a friendly variable
$Fruit = $PsBoundParameters[$ParameterName]
}
process
{
# Your code goes here
$Fruit
}
}
# Results - provide intellisense for the target $arrSet
Test-LongValidateSet -Fruit Banana
Test-LongValidateSet -Fruit Cat
# Results
Test-LongValidateSet -Fruit Banana
Banana
Test-LongValidateSet -Fruit Cat
Test-LongValidateSet : Cannot validate argument on parameter 'Fruit'. The argument "Cat" does not belong to the set "Banana,Apple,PineApple"
specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.
At line:1 char:29
再次,只需将文本添加到文件中,这也意味着,该文件必须在每个主机上,您在每个主机上使用此代码,或者至少能够达到UNC共享以获取该代码。<<<<<<
我不确定您的用例是什么,但是如果您使用PowerShell 5.x或更新的情况是创建类,或者您正在使用您可以在代码中嵌入一些c#的旧版本,以创建可以使用的枚举:
Add-Type -TypeDefinition @"
public enum Fruit
{
Strawberry,
Orange,
Apple,
Pineapple,
Kiwi,
Blueberry,
Raspberry
}
"@
Function TestMe {
Param(
[Fruit]$Fruit
)
Write-Output $Fruit
}