Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止Powershell筛选将数组转换为字符串?_Powershell - Fatal编程技术网

如何阻止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
有效。写下来作为答案,我会接受的。你能不能把提奥的答案作为你自己的答案,这样当人们访问这个问题时,他们就不需要查找参考资料了?你能不能把提奥的答案作为你自己的答案,这样当人们访问这个问题时,他们就不需要查找参考资料了?