【问题标题】:Powershell Get-Content with Where-ObjectPowershell 使用 Where-Object 获取内容
【发布时间】:2014-04-10 15:22:51
【问题描述】:

我有一个这样的文件:

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* }

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

如何使它成为一个包含一个元素而不是字符串的数组?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    为了始终获得 数组,即使有 1(即不是字符串)或 0(即不是 $null)项,请使用运算符 @()

    $text = @(Get-Content -Path $path | Where-Object { $_ -like *email1* })
    

    【讨论】:

      【解决方案2】:

      解决了。

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

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

      【讨论】:

      • 好一个。另请参阅我的回答中的“更通用”的方法。
      【解决方案3】:

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

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

      将始终解析$text 中的每个元素,即使它是单个元素。

      【讨论】:

      • 我的问题是 $text 有时是一个字符串,有时是一个字符串数组。字符串上的 Foreach 只会遍历每个字符,不是吗?
      • 否 - 如果你 foreach 一个字符串,循环只会运行一次,因为字符串只包含一个元素(字符串本身)。字符数与它无关。
      【解决方案4】:

      您也可以使用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
      }
      

      【讨论】:

      • 那是因为%foreach 的别名,所以你真的只是依赖@Kohlbrr 所说的:foreach% 将适用于单个字符串或数组。
      • @gruntzy 谢谢 - 发现在哪里使用带有正则表达式的选择字符串会返回我需要的对象数组!
      猜你喜欢
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 2020-06-25
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多