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

我用的时候:
$var = Get-Contnet "file path"
$var -match "Directory.*"
Run Code Online (Sandbox Code Playgroud)
PowerShell抓取我正在寻找的文本,但它没有抓住从新行开始的文本,我得到:
Directory: \\Drive\Unit\Proposals\Names\Location\crazy folder path\even crazier folder path\unbelievable folder path\
Run Code Online (Sandbox Code Playgroud)
所以...当我使用时:
$var -match "Directory.*\n.*"
Run Code Online (Sandbox Code Playgroud)
我一无所获......
当我在Rublar上尝试这个时它工作正常,我在这里缺少什么?任何帮助都会很棒,谢谢!
ajk*_*ajk 19
Filburt的答案是一个很好的答案,它看起来不像正则表达式是这里使用的最佳工具.但是,你遇到了一个可能在未来再次引起混淆的问题.这里的问题是您填充的变量Get-Content不是多行字符串.它是一个字符串数组:
$var = Get-Content "file path"
$var.GetType() # Shows 'Object[]'
Run Code Online (Sandbox Code Playgroud)
当您运行正则表达式匹配时$var,它将分别匹配数组中的每个对象(文件中的每一行).它不能匹配超过一行的结尾,因为下一行是一个新对象.
这里的一个解决方法是将该字符串数组展平为单个字符串,如下所示:
$var = (Get-Content "file path" | Out-String)
$var.GetType() # Shows 'String' now
Run Code Online (Sandbox Code Playgroud)
在Powershell中,当你处理单个String对象和一个字符串数组时,有时候很难说.如果将它们输出到控制台,它们看起来是相同的.在这种情况下,GetType()并且Out-String可以成为有用的工具.
编辑:从Powershell 3.0开始,Filesystem提供商包括一个-Raw开关Get-Content.该开关指示Get-Content一次读取文件而不将其分成块.它比使用Out-String变通方法快得多,因为它不会浪费时间将碎片拉开,只是为了将它们重新组合在一起.
为什么不在将它们输出到文件之前选择所需的属性?
Get-ChildItem | Select-Object Mode, LastWriteTime, Length, Name | Out-File Result.txt
Run Code Online (Sandbox Code Playgroud)