user2458507
user2458507

Reputation: 25

Bat file that takes specific variables on specific lines from texts

I need to create a batch file that searches through 2 texts. Captures a line of text in a variable (that contains at least one of 3 strings, but doesn't contain forth string) and its line number.
Searches through the second text and captures in another variable the line of text that exists on the line-number of the first variable.

I need to use the two lines-of-text (variable) after that as well.
I kind of managed through the first text reading, but not sure what I'm doing wrong in the second one:

@echo off
set "found="
for /f "tokens=1,* delims=[]" %%a in (' find /n /v "" ^< "%LocalDir%\list.txt" ') do (
    echo "%%b"|findstr /i /c:"one two small" /c:"one two birds" /c:"one two strings" >nul && set found=1
    if defined found echo "%%b"|findstr /v /c:"one two small red apples" >nul || set "found="
    if defined found (
        echo %%a found
        @echo off & setLocal EnableDelayedExpansion
        set var=%%b
        set Line_num=%%a
        endlocal
    ) else ( 
        echo %%a NOT FOUND
    )
    set "found="
)

REM part2--------------------

for /f "delims=" %%d in (list1.txt) do (
    set FullVersion=%%d
    @echo off & setLocal EnableDelayedExpansion
    for /f "tokens=1* delims=" %%e in ("%%d") do (
        if !Line_num!==%%e
        set var2=!FullVersion!
        echo !var2! 
    )
)

endlocal

echo %var%
echo %var2%

Any help will be appreciated.

here is what I end up with as solution:

    for /f "tokens=1,* delims=[]" %%a in (' find /n /v "" ^< "%LocalDir%\software_list.txt" ') do (

echo "%%b"|findstr /i /c:"Micro Focus Enterprise " /c:"Micro Focus Visual" /c:"Micro Focus COBOL" >nul && set found=1

if defined found echo "%%b"|findstr /v /c:"Micro Focus Enterprise Server for .NET" >nul || set "found="
 if defined found (set LineNumber=%%a&set ProductName=%%b)
REM  else (echo Main Micro Focus product NOT FOUND. Nothing to do. Exit.&exit /b)
 set "found="
)


find "2." temp1.txt > temp3.txt
for /f "tokens=2,3 delims==" %%c in (temp3.txt) do (echo %%c >> %LocalDir%\software_list1.txt)
for /f "tokens=1*delims=[]" %%a in (' find /n /v "" ^< "software_list1.txt" ') do IF %%a==%LineNumber% SET ProductVersion=%%b 

REM ECHO %LineNumber%
REM ECHO %ProductName%
REM ECHO %ProductVersion%

set ProductName=%ProductName:"=%
set ProductName=%ProductName: =%
set ProductVersion=%ProductVersion:"=%
set ProductVersion=%ProductVersion: =%




set out_file_name=%ProductName%_%ProductVersion%_%COMPUTER_NAME%
REM echo %out_file_name:"=%

Thanks a lot to everyone.

Upvotes: 1

Views: 603

Answers (3)

Aacini
Aacini

Reputation: 67216

@echo off

rem I need to create a batch file that searches through 2 text FILEs.
rem Captures a line of text in a variable (that contains at least one of 3
rem strings, but doesn't contain forth string) and its line number.

set Line_num=
for /F "tokens=1* delims=:" %%a in (
       'findstr /N /I /C:"one two small" /C:"one two birds" /C:"one two strings" "%LocalDir%\list.txt"
     ^| findstr /V /C:"one two small red apples"' ) do (

   echo %%a found
   set var=%%b
   set Line_num=%%a
)

REM part2--------------------

if defined Line_num (

   rem Searches through the second text and captures in another variable 
   rem the line of text that exists on the line-number of the first variable.

   for /F "tokens=1* delims=:" %%d in ('findstr /N "^" list1.txt') do (
      if %Line_num% == %%d (
         set var2=%%e
         echo %%e
      )
   )
)

echo %var%
echo %var2%

Upvotes: 0

Magoo
Magoo

Reputation: 80023

@echo off
set "found="
for /f "tokens=1*delims=[]" %%a in (
  ' find /n /v "one two small red apples" ^< "%LocalDir%\list.txt" ') do (
 echo "%%b"|findstr /i /c:"one two small" /c:"one two birds" /c:"one two strings" >NUL
 IF NOT ERRORLEVEL 1 SET lnbr=%%a&SET ltext=%%b
)

for /f "tokens=1*delims=[]" %%a in (' find /n /v "" ^< "list1.txt" ') do IF %%a==%lnbr% SET L1txt=%%b 

ECHO(line number %lnbr%
ECHO(from LIST   %ltext%
ECHO(from LIST1  %L1txt%

This should do what you want - if I understand correctly. Much better to show your data and an example of required output. Trying to fix code that DOESN'T do something undefined is frustrating.

Upvotes: 0

jeb
jeb

Reputation: 82307

I see some problems in your code:
This block makes no sense, as it set variables in a new setlocal context and after the endlocal the variables are lost.

    @echo off & setLocal EnableDelayedExpansion
    set var=%%b
    set Line_num=%%a
    endlocal

In the second block you open a setlocal context for each iteration, that will result in a overflow error.
And the endlocal after the Part2 seems also to be contraproductive.

The line if !Line_num!==%%e creates always a syntax error

Btw. Why do you use @echo off inside your code? The frist one at the batch start should be enough.

You should only use one setlocal EnableDelayedExpansion at the beginning of the script.
You should only use DelayedExpansion toggling, if you have problems with exclamation marks. You could use some echo's to see what happens, like

for /f "tokens=1* delims=" %%e in ("%%d") do (
    echo Compare: !Line_num!==%%e
    if !Line_num!==%%e set var2=!FullVersion!
    echo !var2! 
)

Upvotes: 1

Related Questions