我目前正在使用以下方法检查传入我脚本的参数:
$CommandName = $PSCmdlet.MyInvocation.InvocationName
$ParameterList = (Get-Command -Name $CommandName).Parameters
$Values = Get-Variable -Name $ParameterList.Values.Name -EA SilentlyContinue
这很好用。现在我想删除特定元素,所以我创建了一个集合:
[System.Collections.ArrayList]$Array = $Values
并调用remove方法:
$Array = $Array.Remove('TestParameter')
输出$Array
现在什么都不返回。
我错过了什么?
答案 0 :(得分:1)
尝试此选项仅获取与'TestParameter'
不匹配的参数:
$Array = $Array | Where-Object { $_.Name -ne 'TestParameter' }
您无法从固定宽度集合中删除项目,您必须创建所需项目的选择并覆盖旧集合(示例中为$Array
)。
答案 1 :(得分:1)
$Array.Remove('TestParameter')
不返回数组。它只删除匹配的第一个项目。
尝试:
[System.Collections.ArrayList]$Array = $Values
$Array.Remove('TestParameter')
示例:
PS C:\> [System.Collections.ArrayList]$Array = @(1,1,2,3,5,8)
PS C:\> $Array.Remove(1)
PS C:\> $Array
1
2
3
5
8
请注意,Remove()
函数仅删除第一个匹配值,因此请注意它与重复项的工作原理。
但是,如上所示,您的代码无法正常工作,因为Parameters是HashTable,而不是Array。 HashTable有时不被视为IEnumerable,因此有时候HashTable不会被视为集合而是作为单个对象。这是HashTables的一个怪癖。这意味着Get-Variable
没有看到它获得了一整套名称,而是认为它只是获得一个带有回车符的名称。
试试这个:
$ParameterList = @((Get-Command -Name $CommandName).Parameters.Keys)
$Values = Get-Variable -Name $ParameterList -ErrorAction SilentlyContinue;
[System.Collections.ArrayList]$Array = $Values
$Array.Remove('TestParameter')
$Array
您可以检查the documentation,也可以直接使用PowerShell查看功能定义:
PS C:\> ,$x | Get-Member | Where-Object Name -eq 'Remove'
TypeName: System.Collections.ArrayList
Name MemberType Definition
---- ---------- ----------
Remove Method void Remove(System.Object obj), void IList.Remove(System.Object value)
了解两个定义如何从void
开始?这意味着该方法没有返回值。请注意,$x
中的逗号是为了获取arraylist对象而不是arraylist中的基础项。