英文:
Check if a variable is a string list/array?
问题
以下代码返回True
。在PowerShell中正确检查类型的方式是什么?
$e = @(1,2)
$e -ne $null -and $e.GetType() -eq (@("")).GetType()
更新:
以下代码将返回False
。预期结果应为True
。
$e = @('1','2')
$e -is [string[]]
英文:
The following code returns True
. What's the correct way to check the type in PowerShell?
$e = @(1,2)
$e -ne $null -and $e.GetType() -eq (@("")).GetType()
Update:
The following code will return false. It's expected to be true.
$e = @('1','2')
$e -is [string[]]
答案1
得分: 3
您可以使用-is
运算符来检查类型,以确定它是否为数组:
$arr = 1, 2
$arr -is [array]
然而,更加谨慎的方法可能是检查对象是否实现了IEnumerable
接口,因为有许多集合类型不一定是数组,但是可以进行迭代:
$arr = 1, 2
$arr -is [System.Collections.IEnumerable]
还请注意,如果将cmdlet/function的结果分配给一个变量,该结果可以返回多个元素,但默认情况下,如果返回的集合只包含一个元素,它将被解开并分配为单个值。您可以使用以下技巧之一来强制返回的集合被评估/分配为一个数组(以Get-Process
作为示例):
$arr = @( Get-Process iexplore ) # 强制返回值作为集合的一部分,即使只返回单个进程。
$arr -is [System.Collections.IEnumerable] # true
或者,您还可以使用,
符号来强制返回的值被评估为集合(在这种情况下,您需要在cmdlet/function调用中使用子表达式):
$arr = , ( Get-Process iexplore )
$arr -is [System.Collections.IEnumerable]
如果您要检查一个泛型集合(其类型定义在System.Collections.Generic
命名空间中),您还可以使用System.Collections.Generic.IEnumerable[T]
来检查与集合相关联的类型,其中T
是数组中允许的元素类型。例如:
$list = New-Object System.Collections.Generic.List[string]
$list -is [System.Collections.Generic.IEnumerable[string]] # true
英文:
You can use the -is
operator to check the type to check if it's an array:
$arr = 1, 2
$arr -is [array]
However, it is probably more prudent to check that the object implements IEnumerable
, since there are many collection types that are not specifically arrays but are iterable:
$arr = 1, 2
$arr -is [System.Collections.IEnumerable]
Also note that if you assign the result of a cmdlet/function to a variable that can return more than one element, but it only returns a collection with a single element, by default it will be unrolled and assigned as a single value. You can force a returned collection to be evaluated/assigned as an array with one of the following techniques (using Get-Process
as an example of this):
$arr = @( Get-Process iexplore ) # ===========> Forces the returned value to be part of a collection,
# even if only a single process is returned.
$arr -is [System.Collections.IEnumerable] # ==> true
or you can use the ,
notation to force the returned values to be evaluated as a collection as well (you will need to sub-express your cmdlet/function call in this case):
$arr = , ( Get-Process iexplore )
$arr -is [System.Collections.IEnumerable]
If you are checking a generic collection (a collection whose type is defined within the System.Collections.Generic
namespace), you can also check against the collection's associated type using System.Collections.Generic.IEnumerable[T]
instead, where T
is the type of element allowed in the array. For example:
$list = New-Object System.Collections.Generic.List[string]
$list -is [System.Collections.Generic.IEnumerable[string] # ==> true
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论