从PSCmdlet参数数组中删除元素

时间:2018-02-05 17:34:54

标签: powershell

我目前正在使用以下方法检查传入我脚本的参数:

$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现在什么都不返回。

我错过了什么?

2 个答案:

答案 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中的基础项。