如何阻止Powershell筛选将数组转换为字符串?
观察这个例子:如何阻止Powershell筛选将数组转换为字符串?,powershell,Powershell,观察这个例子: PS C:\> $list=("A","B") PS C:\> $list.GetType().Name Object[] PS C:\> ($list | ? {$_ -ne "C"}).GetType().Name Object[] PS C:\> ($list | ? {$_ -ne "B"}).GetType().Name String 当只剩下一个元素时,Power
PS C:\> $list=("A","B")
PS C:\> $list.GetType().Name
Object[]
PS C:\> ($list | ? {$_ -ne "C"}).GetType().Name
Object[]
PS C:\> ($list | ? {$_ -ne "B"}).GetType().Name
String
当只剩下一个元素时,Powershell究竟为什么要将我的数组转换为字符串?它中断了脚本中变量的进一步处理,我假设输出是一个数组。如何防止它?解释为什么Powershell似乎将数组转换为字符串是由
Where Object/%
的筛选结果及其返回的数据引起的
当第一个版本过滤不等于“C”的元素时,结果是一个集合。有不止一个匹配的成员:“A”和“B”。因此,需要一个集合来包含这两个值
第二个版本只返回一个对象“a”,因此它是一个字符串而不是集合。因为只有一个对象,所以不需要返回包含一个元素的数组——只返回对象本身
西奥的答案是将对象的输出设置为数组。@()
可用于创建数组。这样,
# Convert where-object's output into an array,
# even if there is only a single object.
@($list | ? {$_ -ne "B"})
解释为什么Powershell似乎将数组转换为字符串是由
Where Object/%
的筛选结果及其返回的数据引起的
当第一个版本过滤不等于“C”的元素时,结果是一个集合。有不止一个匹配的成员:“A”和“B”。因此,需要一个集合来包含这两个值
第二个版本只返回一个对象“a”,因此它是一个字符串而不是集合。因为只有一个对象,所以不需要返回包含一个元素的数组——只返回对象本身
西奥的答案是将对象的输出设置为数组。@()
可用于创建数组。这样,
# Convert where-object's output into an array,
# even if there is only a single object.
@($list | ? {$_ -ne "B"})
补充我的评论和 当从函数或脚本块返回到单个标量(在本例中为字符串)时,PowerShell将“分解”一个元素数组 为了防止它干扰需要数组的其余代码,不管它是空的还是只有一个元素,您可以通过将其包装在
@()
中来强制输出成为数组
就你而言
($list | ? {$_ -ne "B"})
将返回单个元素A
,转换为标量字符串
,而
@($list | ? {$_ -ne "B"}).GetType().Name
返回一个数组(
对象[]
),其中只有一个元素。以补充我的注释和
当从函数或脚本块返回到单个标量(在本例中为字符串)时,PowerShell将“分解”一个元素数组
为了防止它干扰需要数组的其余代码,不管它是空的还是只有一个元素,您可以通过将其包装在@()
中来强制输出成为数组
就你而言
($list | ? {$_ -ne "B"})
将返回单个元素A
,转换为标量字符串
,而
@($list | ? {$_ -ne "B"}).GetType().Name
返回一个数组(
Object[]
),其中只有一个元素。强制它成为一个带有@(…)
的数组。我将第1行更改为$list=@(“A”,“B”)
,但这没有帮助。啊,@($list |?{$\ne“B”)。GetType().Name
可以工作。把它写下来作为答案,我会接受它强制它成为一个带有@(..)
的数组。我将第1行更改为$list=@(“A”,“B”)
,但这没有帮助。啊,@($list |?{$$ne“B”)。GetType()。Name
有效。写下来作为答案,我会接受的。你能不能把提奥的答案作为你自己的答案,这样当人们访问这个问题时,他们就不需要查找参考资料了?你能不能把提奥的答案作为你自己的答案,这样当人们访问这个问题时,他们就不需要查找参考资料了?