Powershell使用Where-Object获取内容

时间:2014-04-10 03:27:52

标签: powershell

我有一个这样的文件:

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 个答案:

答案 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
}