• No results found

Finding text with Select_String

Select_String not only opens a file but also checks for a word, a phrase, or in fact, any pattern match.

Topics for PowerShell Select_String

• Introduction to: Select_String

• Example 1a Select_String (Pure no extra commands) • Example 1b Select_String using variable $Location • Example 1c Select_String (Wildcards *. *)

• Example 1d Select_String (Guy's indulgence) • Traps with Select-String

• Summary of Powershell Select_String Introduction to: Select_String

The first objective is to set the -pattern parameter, which defines the string we are seeking. Next comes the -path parameter, as the name indicates, it directs select-string to the file location. As you are reading this introduction I expect you are thinking of possible application for this select- string construction. Perhaps you wish to discover which documents contain a particular word; alternatively, you may be seeking a more complex search-and-replace operation. My point is that while select-string may be a bit-part in a bigger drama, you still need to master its syntax and switches.

Example 1 Select_String -path -pattern

The key to understanding select_String is studying the two main switches -path and -pattern. They say to me, 'Where is the input?' and, 'What pattern do you want to match?'

To ensure that my examples work, we need to agree on the file location and the pattern to search. To be successful you need to embrace one of two tactics, either mimic my folder structure and patterns, or amend my script to fit in with your environment.

My folder happens to be called : D: \powershell\stuff. My working technique is to navigate in powershell to the folder where I store the files with the cmdlet examples I am testing. Then I just issue the .\filename command (. Dot slash followed by the name of cmdlet which stores the PowerShell instructions. )

Here are three simple scripts which all produce the same result, but employ slightly different methods. By studying all three you will gain both perspective and ideas for the best method to employ in your scripts.

Assumptions:

You have a file called gopher.txt. In gopher.txt is the word Guido.

Example 1a Select_String (Pure no extra commands) Instructions

1. Create the appropriate file in the appropriate folder, for example gopher.txt in D:\powershell\stuff.

2. Put the word that you wish to search for in gopher.txt. My word, is 'Guido', and in the script it comes directly after the -pattern parameter.

3. Type this one line at the PowerShell command line:

select-string -pattern "Guido" -path "D:\powershell\stuff\gopher.txt"

Note 1: Look closely at the dashes '-' PowerShell's verb-noun (select-string) pair are joined by a dash with no spaces. The parameters -path and -pattern are introduced by a space dash then the

parameter itself.

Example 1b Select_String using variable $Location Instructions

This example is more complicated in that we are going to create a cmdlet, copy and paste the code below, then execute the cmdlet from inside PowerShell.

1. Create the appropriate file in the appropriate folder, for example gopher.txt in D:\powershell\stuff.

2. Put the word that you wish to search for in gopher.txt. My word, is 'Guido', and it comes directly after the -pattern parameter in the script.

3. Copy the cmdlet, then paste it into notepad, remember to save with a .ps1 extension, for example: selectstr.ps1 .

4. Then I navigate in PowerShell to the folder where I saved the file, for example D: \powershell\stuff

5. Issue the command .\selectstr

6. If all else fails copy and paste the three lines into the PowerShell command line, then press 'Enter'.

# PowerShell cmdlet to find the pattern Guido $Location = "D:\powershell\stuff\gopher.txt" select-string -pattern "Guido" -path $Location Expected outcome:

D:\powershell\stuff\gopher.txt:3:Guido is king :3: Means line number 3

Example 1c Select_String (Wildcards *. *)

It is often useful to search a batch of files. The simplest method is to use the famous * or *. * wildcard.

Instructions are the same as for example 1a

# PowerShell cmdlet to find the pattern Guido. Note wildcard * select-string -pattern "Guido" -path "D:\powershell\stuff\*. *" Example 1d Select_String (Guy's indulgence)

My main idea in Example 1c is to introduce an If... Else clause to cater for instances where the - pattern cannot be found. To prepare for the 'If' logic I have introduced another variable called $SearchStr. The second time you run this script you may wish to find and amend the "zzz" to a value that will ensure success.

Instructions are the same as for example 1a # PowerShell cmdlet to find the pattern zzz. $Location = "D:\powershell\stuff\gopher.txt" $SearchStr = "zzz"

$Sel = select-string -pattern $SearchStr -path $Location If ($Sel -eq $null)

{

write-host "$Location does not contain $SearchStr" }

Else {

write-host "Found `n$Sel" }

Write-host "end"

Note 1: Let us study the 'If' test: If ($Sel -eq $null) What this says if the value returned by

select_String is nothing ($Null). Incidentally, there are two lls in $null. Also, t he correct syntax is -eq and not plain old =.

Note 2: The purpose of `n is to force a carriage return.

Note 3: Once the script runs successfully, amend $SearchStr ="zzz" to a string that exists in your document.

Footnote - More parameters:

In addition to -pattern and -path, select-string has more parameters; -include and -exclude which are useful for fine tuning the files to be searched. There is also the -caseSensitive switch to control uppercase and lowercase in the -pattern. select_String, like most PowerShell commands, is not case sensitive by default, hence the -caseSensitive parameter.

Traps with Select-String

The biggest trap with all PowerShell's file handling commands is looking for open-file or save-file commands. They simply don't exist. What happens is that PowerShell opens, closes and saves files automatically.

A real-life example of Select-String

My practical problem was that I wanted to search for instances a particular string. If a file had duplicates, then I needed to know.

The PowerShell problem is how to create a stream of the files, then compare each file with my string value. In the output I needed to know the filename.

To solve the problem, I employed four main commands, which you can see in the following script: get-ChildItem - recurse

foreach (loop) {what to do block} if (test) {output block

select-String -pattern to match my string value. # A real-life example of PowerShell's Select-String $i=0

$File = get-ChildItem "H:\sports" -include *. htm -recurse $StringText= "themesguy/google"

foreach ($Entry in $File) {

$List = select-string -pattern $StringText $Entry if ($List. LongLength -gt 1) {

"{0,-8} {1,-4} {2,18}" -f

"Files ", $List. LongLength, $Entry. FullName; $i++

} }

Summary of PowerShell's Select_String

Select_String is a useful instruction for opening files, and then searching their contents for the phrase specified by the -pattern parameter. My advice is to get into the rhythm of the command: for example: verb-noun then -parameter . For example: select_String -path -pattern. As expected, you can use wildcards in the path.

Once you have mastered the basic construction look real life tasks where you can employ this technique to find words or phrases that are hiding somewhere within your files.