Functions/FilesandFolders/Find-StringInPath.ps1
function Find-StringInPath { <# .SYNOPSIS Find a string in one or multiple files .DESCRIPTION Find a string in one or multiple files. The search is performed recursively from the start folder. .EXAMPLE Find-StringInFile -Path "C:\Scripts\FolderWithFiles" -Search "Test01" Filename Path LineNumber IsBinary Matches -------- ---- ---------- -------- ------- File_01.txt E:\Temp\Files\File_01.txt 1 False {Test01} File_02.txt E:\Temp\Files\File_02.txt 1 False {TEST01} File_03.txt E:\Temp\Files\File_03.txt 1 False {TeST01} .EXAMPLE Find-StringInFile -Path "C:\Scripts\FolderWithFiles" -Search "TEST01" -CaseSensitive Filename Path LineNumber IsBinary Matches -------- ---- ---------- -------- ------- File_02.txt E:\Temp\Files\File_02.txt 1 False {TEST01} #> [CmdletBinding()] param( [Parameter( Position=0, Mandatory=$true, ValueFromPipeline=$true, HelpMessage='String to find')] $Search, [Parameter( Position=1, HelpMessage='Folder where the files are stored (search is recursive)')] [ValidateScript({ if(Test-Path -Path $_) { return $true } else { throw 'Enter a valid path!' } })] [String]$Path = (Get-Location), [Parameter( Position=2, HelpMessage='String must be case sensitive (Default=false)')] [switch]$CaseSensitive ) Begin{ } Process{ # Files with string to find $Strings = Get-ChildItem -Path $Path -Recurse | Select-String -Pattern ([regex]::Escape($Search)) -CaseSensitive:$CaseSensitive | Group-Object -Property Path # Go through each file foreach($String in $Strings) { $IsBinary = Test-IsFileBinary -FilePath $String.Name # Go through each group foreach($Group in $String.Group) { [pscustomobject] @{ Filename = $Group.Filename Path = $Group.Path LineNumber = $Group.LineNumber IsBinary = $IsBinary Matches = $Group.matches } } } } End{ } } |