PowerShell Select-String: Find Text in Files
This guide shows you how to use PowerShell’s Select-String cmdlet to search for text inside files. You’ll learn to find matching lines, show context, and refine your searches with regular expressions. No prior PowerShell experience is needed, but you should know how to open a PowerShell window.
What You’ll Need
- A Windows computer with PowerShell 5.1 or later (included with Windows 10/11).
- Access to the files you want to search (local drive, network share, etc.).
- Basic familiarity with opening a terminal: press Win, type
powershell, and press Enter.
Step-by-Step
- Open PowerShell – Press Win, type
powershell, and select Windows PowerShell (or Terminal if you have it). - Navigate to your folder – Use
Set-Location(alias:cd) to go to the directory containing your files. For example:cd C:\Users\YourName\Documents - Run a basic search – Type
Select-String -Path *.txt -Pattern "error"and press Enter. This searches all.txtfiles in the current folder for the word “error”. - Understand the output – Each match shows the filename, line number, and the entire line that matched. The matched text is highlighted in red.
- Search recursively – To include subfolders, add the
-Recurseparameter:Select-String -Path .\* -Pattern "error" -Recurse. This searches all files in the current folder and subfolders. - Use wildcards for file types – You can specify multiple patterns:
Select-String -Path *.log, *.txt -Pattern "warning". - Show context lines – Use
-Contextto see lines before and after the match. Example:-Context 2,1shows 2 lines before and 1 line after each match. - Use regular expressions – By default,
-Patterntreats the pattern as a regular expression. For example,Select-String -Path *.txt -Pattern "^\d{3}-"finds lines starting with three digits followed by a hyphen. - Make it case-insensitive (or sensitive) – Add
-CaseSensitiveto make the search case-sensitive. Without it, searches are case-insensitive. - Output only the matching text – Use
-AllMatchesand.Matches.Valueto extract just the matched text, not the whole line. For example:(Select-String -Path *.txt -Pattern "\d{4}" -AllMatches).Matches.Value. - Pipe to other commands – You can pass results to
ForEach-ObjectorOut-Fileto process or save them. Example:Select-String -Path *.log -Pattern "error" | Out-File errors.txt
Common Mistakes
- Forgetting the path – If you omit
-Path,Select-Stringreads from the pipeline, not the filesystem. Always specify a path or pipe in file contents. - Using single quotes with variables – In PowerShell, single quotes create literal strings. If you want to expand a variable inside the pattern, use double quotes. Example:
"$myVar". - Assuming case-insensitivity – The default is case-insensitive, but if you accidentally use
-CaseSensitiveand expect matches, you’ll get fewer results. - Misunderstanding regex special characters – Characters like
.and*have special meanings. To match them literally, escape with a backslash:\.. - Not using
-SimpleMatchwhen needed – If your pattern contains many regex characters but you want a literal search, use-SimpleMatchto treat it as plain text.
Tips
- Use
-List– This returns only the first match per file, which is useful when you just want to know which files contain the pattern. - Search multiple file types at once – Use a comma-separated list or a wildcard like
*.config. - Filter by encoding – If files are not UTF-8, add
-Encodingto specify the correct encoding (e.g.,-Encoding UTF8). - Use
-Quietfor a Boolean result – This returnsTrueif any match is found,Falseotherwise. Useful in scripts. - Combine with
Get-ChildItem– Pipe files intoSelect-Stringfor more control:Get-ChildItem -Recurse -Filter *.log | Select-String "error".
Troubleshooting
No matches found – Check your pattern for typos. Try a simple word first. Verify the file path is correct and that the files exist. If you’re using regex, test with -SimpleMatch to rule out regex issues.
Access denied – Ensure you have read permissions for the files or folders. Run PowerShell as Administrator if needed.
Output is too long – Pipe to Select-Object -First 20 to see the first 20 results, or use -List to get one match per file.
Binary files appear – Select-String treats all files as text. If you’re searching binary files, you may see garbage. Use -Exclude to skip certain file types.
Slow search on large directories – Limit the search with -Include or -Filter to specific file types. Avoid searching the entire C: drive.
Frequently Asked Questions
Can I search for multiple patterns at once?
Yes, pass an array of patterns: -Pattern "error", "warning". It will match lines containing any of them.
How do I search for a literal string like “cost*” without regex?
Use the -SimpleMatch parameter: Select-String -Path *.txt -Pattern "cost*" -SimpleMatch.
Why does my output show the whole line instead of just the match?
By default, Select-String outputs the entire line. To get only the matched text, use -AllMatches and access the .Matches.Value property.
Can I search files in a zip archive?
No, Select-String cannot read inside zip files directly. You’d need to extract the archive first or use a different tool.
How do I include hidden files in the search?
Use Get-ChildItem -Force to include hidden files, then pipe to Select-String. Example: Get-ChildItem -Force -Recurse | Select-String "pattern".
Is there a way to search for a pattern across all files in a directory without specifying the path each time?
Yes, you can set a default location with Set-Location and then run Select-String -Path * -Pattern "pattern". This searches all files in the current directory.
Related
Method: the standard formula for this calculation, rounded as each result states. See how the calculators work or report an error.