使用Where-Object的Powershell Get-Content

5

我有一个像这样的文件:

line one email1
line two email1
line three email2
line four email1

如果我想提取只包含“email1”的行,我会这样做:
$text = Get-Content -Path $path | Where-Object { $_ -like *email1* }
$text现在是一个包含这些行的3个元素的数组,我可以通过以下方式对其进行迭代:
for ($i = 0; $i -lt $text.Length; $i++)
{
#do stuff here
}

然而,如果我想获取包含"email2"的行。
$text = Get-Content -Path $path | Where-Object { $_ -like *email2* }

返回一个字符串,而不是一个只有一个元素的数组。当我遍历它时,它会遍历字符串中的每个字符。

我应该如何将其转换为只有一个元素的数组,而不是一个字符串?

4个回答

10
为了始终获得一个数组,即使只有1个(即不是字符串)或0个(即不是$null),请使用运算符@()
$text = @(Get-Content -Path $path | Where-Object { $_ -like *email1* })

5

已解决。

我需要将$text声明为类型[String[]]

[String[]]$logText = Get-Content -Path $path | Where-Object { $_ -like *email1* }

1
不错。请参考我的回答中的“更通用”的方法。 - Roman Kuzmin

3

不要让Length方法将单个元素语句当作数组处理,我认为更好的解决方案是使用foreach循环而不是for循环进行迭代:

foreach ($element in $text) {
    #stuff happens
}

即使 $text 只包含一个元素,也将始终逐个解析每个元素。


我的问题是$text有时是一个字符串,有时是一个字符串数组。在字符串上的foreach循环只会遍历每个字符,对吗? - David Klempfner
如果您使用foreach循环遍历字符串,由于字符串只包含单个元素(即字符串本身),因此该循环仅会运行一次。字符计数与此无关。 - Kohlbrr

2

你也可以使用 Select-String 命令,即使只选择一个结果,它也对我有效:

$text1 = Get-Content -Path $path | Select-String "email1"
$text1 | % { 
    # Do some stuff here
}

$text2 = Get-Content -Path $path | Select-String "email2"
$text2 | % { 
    # Do some stuff here
}

1
这是因为 %foreach 的别名,所以您只是依赖于 @Kohlbrr 所说的:foreach% 可以处理单个字符串或数组。 - Duncan
@gruntzy 谢谢 - 我找到了使用正则表达式选择字符串会返回我所需的对象数组的地方! - mbourgon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接