If you're going to use a DOS batch file, then the "find" command is exactly what you need.
To do your search, this is what you need,
find /i "John Smith" *.txt
The "/i" switch tells the find command to ignore case, so you don't have to worry if the text is capitalized in different ways. If the search string is found, then it is automatically echo'ed to the string just below the filename that it was found in.
If you're running through a long directory, then there's a couple different ways to record what's been done so you can look at the results later.
One option, pipe the output to a file,
find /i "John Smith" *.txt >> myfiles.log
This will pipe the output of the find command into a "myfiles.log" file that you can look at later. It pipes the entire output which may or may not be what you want, depending on your purpose.
A more advanced option is to use the "for" command to take the output of the "dir" command and feed it into the "find" command, then do something with the results. Both of the following examples are on a single line.
== Display to the screen
for /f %i in ('dir *.txt /b') do (find /i "John Smith" %i && @echo "found johns file")
== Append to a file
for /f %i in ('dir *.txt /b') do (find /i "John Smith" %i && @echo %i>>myfiles.log)