8

好吧,这让我发疯了,因为我的正则表达式正在使用 Rubular,但 PowerShell 没有按我预期的那样工作。

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

在此处输入图像描述

  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 上尝试这个时,它工作正常,我在这里错过了什么?任何帮助都会很棒,谢谢!

4

3 回答 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

In Powershell it can sometimes be tricky to tell when you're dealing with a single String object versus an array of Strings. If you output them to the console they appear identical. In those cases, GetType() and Out-String can be useful tools.

Edit: As of Powershell 3.0, the Filesystem provider includes a -Raw switch for Get-Content. That switch instructs Get-Content to read the file all at once without splitting it into chunks. It is significantly quicker than using the Out-String workaround, because it doesn't waste time pulling pieces apart only to put them back together again.

于 2012-06-13T14:11:06.207 回答
6

为什么不在将它们传送到您的文件之前选择所需的属性呢?

Get-ChildItem | Select-Object Mode, LastWriteTime, Length, Name | Out-File Result.txt
于 2012-06-13T13:37:54.927 回答
1

It's possible that the lines don't end with \n. I believe the standard line termination characters in Windows is \r\n. Try re-writing your regex to match that.

于 2012-06-13T15:00:22.253 回答