To compare whether a string contains another one, you can do it like this (note that this is case-insensitive, because the underlying sub-string expansion syntax is case-insensitive on its own):
if "!STRING!"=="!STRING:%SUB%=!" echo Sub-string "%SUB%" NOT found within "!STRING!"
Here the above approach is implemented into your script:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_INFILE=file1.txt"
set "_OUTFILE=test.txt"
set "_SUBSTR=XYZ"
>> "%_OUTFILE%" (
for /F "usebackq tokens=1-3 delims=" %%L in ("%_INFILE%") do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
echo(!LINE!
if not "!LINE!"=="!LINE:%_SUBSTR%=!" (
echo matched
) else (
echo nomatch
)
endlocal
)
)
endlocal
exit /B
In addition, I improved the following things:
- constant-like variables are predefined at the beginning;
- the returned text is redirected once only; replace
>> by > to overwrite an already existing file rather than appending to it;
- delayed expansion is toggled within the loop in order not to lose exclamation marks in the text; note that the string in
_SUBSTR must not contain such;
- all file paths used in the script are enclosed within quotation marks;
- the quoted
set syntax is used throughout the script;
- code indention is used for improved readability;
Alternatively, you could use the find command, which returns only those lines within file1.txt that contain the sub-string in %SUB%; add the /I option to do a case-insensitive search:
find "%SUB%" "file1.txt"
if "!STRING!"=="!STRING:%SUB%=!" echo Sub-string "%SUB%" found within "!STRING!".or you use thefindcommand:find "%SUB%" "file1.txt"(which returns only those lines withinfile1.txtthat contain the sub-string in%SUB%; add the/Ioption to do a case-sensitive search)@echo off setlocal EnableDelayedExpansion for /F "tokens=1,2,3 delims=" %%i in (file1.txt) do ( set f=%%i set z=XYZ echo !f! >>test.txt if "!f!"=="!f:%z%=!" ( echo matched >> test.txt ) else ( echo nomatch >> test.txt ) )But i am getting only "no match" written in test.txt even if XYZ string is present in file1.txtif "!f!" neq "!f:%z%=!" ( echo matched >> test.txt ) else ( echo nomatch >> test.txt ). Also, note that in order for this to work you mustset z=XYZbefore theforloop...