使用Powershell搜索文件中的多行文本

时间:2018-06-27 10:53:35

标签: powershell

我不是PowerShell的专家。我正在尝试在文件中搜索多行字符串,但没有得到想要的结果。

这是我的代码:

$search_string = @("This is the first line`nThis is the second line`nThis is the third line")
$file_path = "log.txt"
$ret_string = @(Get-Content -Path $file_path | Where-Object{$_.Contains($search_string)}).Count
Write-Host $ret_string

$ret_string设置为0,尽管"log.txt"包含与$search_string完全相同的内容。

2 个答案:

答案 0 :(得分:4)

这里有几个问题:

  1. 您正在搜索的是行数组,而不是包含换行符的字符串
  2. 如果您使用的是Windows,则需要使用\r\n作为新行
  3. .Contains函数将返回布尔值,因此不会帮助您获取计数
  4. 您的$search_string不必是数组

您可以使用-Raw参数以字符串的形式获取整个文件的内容。您也最好使用正则表达式在此处搜索。试试:

$search_string = "This is the first line`r`nThis is the second line`r`nThis is the third line"
$file_path = "log.txt"
$ret_string = (Get-Content -raw -Path $file_path | Select-String $search_string -AllMatches | % { $_.matches}).count

这将返回文件中所有$search_string出现次数的计数

答案 1 :(得分:3)

Get-Content返回一个字符串数组(每行一个),在您的Where-Object条件下分别检查每个字符串。您需要以单个字符串形式读取文件,以使检查工作正常:

Get-Content $file_path | Out-String | Where-Object { ... }

在PowerShell v3或更高版本上,该cmdlet具有用于读取原始文件的参数:

Get-Content $file_path -Raw | Where-Object { ... }

但是,请注意,您可能需要调整条件以检查`r`n而不是`n,尤其是第一种方法。