我有一个这样的文件:
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* }
返回一个字符串,而不是一个元素的数组。 当我遍历它时,它会迭代字符串中的每个字符。
如何将其作为包含一个元素而不是字符串的数组?
答案 0 :(得分:7)
为了获得数组,即使使用1(即非字符串)或0(即不是$null
)项,请使用运算符@()
:
$text = @(Get-Content -Path $path | Where-Object { $_ -like *email1* })
答案 1 :(得分:3)
我认为更好的解决方案是使用Length
循环而不是foreach
循环来迭代,而不是让for
方法将单个元素语句视为数组:
foreach ($element in $text) {
#stuff happens
}
将始终解析$text
中的每个元素,即使它是单个元素。
答案 2 :(得分:3)
完成了工作。
我需要将$ text声明为[String[]]
类型。
[String[]]$logText = Get-Content -Path $path | Where-Object { $_ -like *email1* }
答案 3 :(得分:1)
您也可以使用Select-String
Cmdlet,即使在选择中只有一个结果,它也适用于我:
$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
}