PowerShell正则表达式如何使用多行字符串?

时间:2012-06-13 13:23:57

标签: regex powershell

好吧,这让我疯了,因为我的正则表达式正在研究Rubular,但是PowerShell并没有像我期望的那样工作。

  1. 我在网络目录上做了一个Get-ChildItem,然后将输出定向到一个txt文件。
  2. 我从文本文件中删除了目录信息,如下所示:
  3. enter image description here

    1. 当我使用PowerShell尝试编写正则表达式来删除目录信息时,我遇到了一些问题。
    2. 当我使用时:

      $var = Get-Contnet "file path"
      $var -match "Directory.*"
      

      PowerShell抓取我正在寻找的文本,但它没有抓住从新行开始的文本,我得到:

      Directory: \\Drive\Unit\Proposals\Names\Location\crazy folder path\even crazier folder path\unbelievable folder path\
      

      所以...当我使用时:

      $var -match "Directory.*\n.*"
      

      我一无所获......

      当我在Rublar上尝试时,它工作得很好,我在这里缺少什么?任何帮助都会很棒,谢谢!

3 个答案:

答案 0 :(得分:19)

Filburt的答案很好,看起来正则表达式不是最好的工具。但是,你遇到了一个可能在未来再次引起混淆的问题。这里的问题是您使用Get-Content填充的变量不是多行字符串。它是一个字符串数组:

$var = Get-Content "file path"
$var.GetType() # Shows 'Object[]'

当您对$var运行正则表达式匹配时,它会分别匹配数组中的每个对象(文件中的每一行)。它不能匹配一行的结尾,因为下一行是一个新对象。

这里的一个解决方法是将该字符串数组展平为单个字符串,如下所示:

$var = (Get-Content "file path" | Out-String)
$var.GetType() # Shows 'String' now

在Powershell中,当你处理单个String对象和一个字符串数组时,有时候很难说。如果将它们输出到控制台,它们看起来是相同的。在这些情况下,GetType()Out-String可能是有用的工具。

修改:从Powershell 3.0开始,Filesystem提供商为-Raw添加Get-Content转换。该开关指示Get-Content一次性读取文件而不将其拆分为块。它比使用Out-String解决方法要快得多,因为它不会浪费时间将碎片拆开,只是为了将它们重新组合在一起。

答案 1 :(得分:6)

为什么不在将它们输出到文件之前选择所需的属性?

Get-ChildItem | Select-Object Mode, LastWriteTime, Length, Name | Out-File Result.txt

答案 2 :(得分:1)

这些行可能不会以\n结尾。我相信Windows中的标准行终止字符是\r\n。尝试重写你的正则表达式以匹配它。