PowerShell正则表达式如何处理多行字符串?

8

好的,这让我发疯了,因为我的正则表达式在Rubular上有效,但PowerShell的效果并不如我所预期。

  1. 我在网络目录上执行了Get-ChildItem操作,然后将输出导出到了一个txt文件中。
  2. 接着我试图从文本文件中删除如下所示的目录信息:

enter image description here

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

我使用了以下代码:

$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个回答

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中,有时很难区分你正在处理单个字符串对象还是一组字符串。如果将它们输出到控制台,它们看起来是相同的。在这种情况下,GetType()Out-String可能会是有用的工具。 编辑:从PowerShell 3.0开始,Filesystem提供程序包括-Raw开关以用于Get-Content。该开关指示Get-Content一次性读取文件而不将其分割成块。它比使用Out-String解决方法要快得多,因为它不浪费时间将部分内容拆开仅仅再组合它们。

1
谢谢!我完全同意Filburt的想法,但我想了解我所缺少的东西。非常感激! - Steve

6

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

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

先生,那太疯狂了!我在思考了一会儿后想到了这个问题,但我想了解为什么我的正则表达式不像我认为的那样工作,以便将来参考。 - Steve

1

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


感谢回复。使用$var -match“Directory.*\r\n.*”或任何组合的\r\n都没有起作用。 - Steve

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