How to use PowerShell to search through files for matching strings

Black and White PDQ logo
Kris Powell|July 31, 2014
PowerShell: Searching Through Files for Matching Strings
PowerShell: Searching Through Files for Matching Strings

It can be very time-consuming and tedious to sift through many files. Unless you’re a fan of working over a weekend and opening file after file while being slumped in a chair, then I would suggest making use of the information from today’s PowerShell blog post!

Consider a directory, “C:\Temp” with many text files created. Each of the files has random text data inside. We’re looking for only the files that contain one particular string. Additionally, since we don’t know how many matches we are going to find, we’re going to create an array to store the found matches. In order to search for strings or string patterns, we’re going to use the cmdlet Select-String.

########################################################### $Path = "C:\temp" $Text = "This is the data that I am looking for" $PathArray = @() $Results = "C:\temp\test.txt" # This code snippet gets all the files in $Path that end in ".txt". Get-ChildItem $Path -Filter "*.txt" | Where-Object { $_.Attributes -ne "Directory"} | ForEach-Object { If (Get-Content $_.FullName | Select-String -Pattern $Text) { $PathArray += $_.FullName $PathArray += $_.FullName } } Write-Host "Contents of ArrayPath:" $PathArray | ForEach-Object {$_} ##########################################################

Here’s the breakdown

This will search the directory $Path for any items that include “.txt” in their names and that are not directories.

Get-ChildItem $Path -Filter "*.txt" | Where-Object { $_.Attributes -ne "Directory"}

For every match it finds, it will check the contents of the match using Get-Content and verify any matches with $Text by using Select-String. If it finds a match, it puts the full name of the match into the $PathArray array.

ForEach-Object { If (Get-Content $_.FullName | Select-String -Pattern $Text) { $PathArray += $_.FullName $PathArray += $_.FullName } }

There you have it.

Bonus options

Exporting results to file

If you want to export that all to a file instead of on the screen, then simply pipe it into an Out-File cmdlet. For example:

$PathArray | % {$_} | Out-File "C:\Some Folder\Some File.txt"

Searching through all subfolders

If you want to search all subfolders for additional *.txt files as well, then add “-recurse” to the original Get-ChildItem command:

Get-ChildItem $Path -Filter "*.txt" -Recurse

Did you know that PDQ Deploy has a PowerShell step you can use to deploy your scripts?

Black and White PDQ logo
Kris Powell

Kris was an employee at PDQ.

Related articles