I'm trying to extract from a set of txt files the line
placed 2 rows below the one matching search criteria
and redirect output to a csv file.
I managed to do that for a specific txt file in the set,
but I'm getting troubles in writing the For Cycle
to batch-scan each txt in a given folder.
Through this, I wrote the following code to scan
a specific file. It works fine:
setlocal EnableDelayedExpansion
cd "myFolder"
if exist myOutput.csv del myOutput.csv
for /F "delims=:" %%A in ('findstr /B /N /C:"myCriteria" "myFile.txt"') do (
set /A LineBelow=%%A+2
set "LineBelow=!LineBelow!: "
)
(for /F "tokens=1* delims=:" %%A in ('findstr /N "^" "myFile.txt" ^| findstr /B "%LineBelow%"') do ^
echo %%B>>myOutput.csv)
start myOutput.csv
ENDLOCAL
When I tried to generalize the code in a For Cycle to scan each txt in myFolder
I got an error in Findstr: !LineBelow! happens to be an empty variable...
Here's the flawed For Cycle:
setlocal EnableDelayedExpansion
cd "myFolder"
if exist myOutput.csv del myOutput.csv
for %%F IN ("*.txt") do (
(
for /F "delims=:" %%A in ('findstr /B /N /C:"myCriteria" "%%F"') do (
set /A LineBelow=%%A+2
set "LineBelow=!LineBelow!: "
))
(for /F "tokens=1* delims=:" %%A in ('findstr /N "^" "%%F" ^| findstr /B "!LineBelow!"') do ^
echo %%B>>myOutput.csv))
start myOutput.csv
ENDLOCAL
Could anybody help me in correcting this code?
Thanks
#echo off
setlocal enableextensions enabledelayedexpansion
cd "myFolder"
> myOutput.csv (
for /f "tokens=1,2 delims=:" %%a in ('
findstr /b /n /c:"myCriteria" *.txt
') do (
set /a "line=%%b+2"
for /f "tokens=1,* delims=:" %%c in ('
findstr /n "^" "%%a" ^| findstr /b /c:"!line!:" 2^>nul
') do echo(%%d
)
)
This uses findstr to directly enumerate all the lines matching the myCriteria and include in the output the name of the file (%%a) and the number of the line (%%b). This information is used to retrieve the final line (%%d) from the matching files.
Related
I've tried to rename file from someFile_v4 to someFile_v5 in all folders. Unfortunately I've get error The system cannot find the file specified.
#echo off
for /R %%f in (*_v4.xml) do call :ProcessFile
goto :Finished
:ProcessFile
rename "*_v4.xml" "*_v5.xml"
goto :eof
:Finished
The problem here is that you are using a for loop, which actually does nothing with the variable in this.
Try the following:
(
I also suggest you to consider changing:
for /r to for /f in using dir /s /b /a-d in the loop.
)
#echo off & setlocal EnableDelayedExpansion
for /f "tokens=* delims= " %%i in ('dir /s /b /a-d "*_v4.xml"') do (
set "_ren=%%~fi"
for /f "delims=" %%I in ('dir /w /b "%%~i"') do set "_to=%%~nxI"
ren "!_ren!" "!_to:_v4=_v5!"
set _ren=0<nul & set _to=0<nul
)
I cannot explain my code, sorry, because I don't know English well.
I have a path:
\%VARIABLE%svr0001\e$\Users\%VARIABLE%POS00??\E2ELOGS*.dbg
The ONLY characters that changes is the '??' (%VARIABLE%POS00??).
Values could be from 01 through 15 (01,02,03,04,05,06,07,08,09,10,11,12,13,14,15)
How would I make the following script work without creating if path exist statements for every potential changing value:
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('find /c /i "Error : -2" "\\%VARIABLE%svr0001\e$\Users\%VARIABLE%POS00??\E2ELOGS\*.dbg"') do (
set "$line=%%a"
set "$lastchar=!$line:~-1!"
if !$lastchar! gtr 0 echo %%a >>NO_ACK_ERROR-2.txt
)
Try like this :
#echo off
setlocal enabledelayedexpansion
for /l %%x in (1,1,15) do (
set "$number=0%%x"
for /f "delims=" %%a in ('find /c /i "Error : -2" "\\%VARIABLE%svr0001\e$\Users\%VARIABLE%POS00!$number:~-2!\E2ELOGS\*.dbg"') do (
set "$line=%%a"
set "$lastchar=!$line:~-1!"
if !$lastchar! gtr 0 echo %%a >>NO_ACK_ERROR-2.txt
))
If I understood it correct, you want to check the log files with the name POS001-POS0015, below may be the answer for you.
setlocal enabledelayedexpansion
for /l %%i in (1,1,15) do (
set "num=%%i"
if "!num:~0,1!" neq "0" set "num=0!num!"
set "filepath=\\%VARIABLE%svr0001\e$\Users\%VARIABLE%POS00!num!\E2ELOGS\*.dbg"
for /f "delims=" %%a in ('find /c /i "Error : -2" "!filepath!"') do (
set "$line=%%a"
set "$lastchar=!$line:~-1!"
if !$lastchar! gtr 0 echo %%a >>NO_ACK_ERROR-2.txt
)
Cheers, G
So I want to Echo %%a into another txt file, but seems nothing works to me.
Here's the code :
for /f "delims=" %%a in (
'dir "*.txt" /b /s /a-d'
) do Echo for /f "delims=" %%a in ^( >> "%%a"
Simple : output file looks like:
"for /f "delims=" C:\Documents and
Settings\xxxxx\Desktop\alpha\lol.txt in ( " .
I just need not a full path but "%%a". Bat file.
You want the literal %%a ?
Try %%%%a
Second suggestion:
Try %%%%^a
Third - change the metavariable (loop-control variable) to %%b
for /f "delims=" %%b in (
'dir "*.txt" /b /s /a-d'
) do Echo for /f "delims=" %%%%a in ^( >> "%%b"
Try this:
for /f "delims=" %%a in ('dir "*.txt" /b /s /a-d' ) do Echo %%a >> output.txt
As you saw, it's not directly possible to escape the %%a expression in a loop.
But like Magoo mention, it can be solved with changing the loop parameter.
You could also use the parser to create the %%a output.
setlocal EnableDelayedExpansion
set "static=for /f "delims=" %%%%a in ("
for /f "delims=" %%a in ( 'dir "*.txt" /b /s /a-d') do (
echo !static! >> "%%a"
)
The content of the variable static will be expanded, but the inner %%a will not expanded later.
I am trying to read two different fields per line of a file and assign those fields to two different variables so that I can work with both of the variables together in a for loop.
Right now I have
for /f "tokens=6 delims=:. " %%a in ('type %1% ^| findstr /R /V "Test"') do (
echo %%a
)
for /f "tokens=12 delims=:. " %%b in ('type %1% ^| findstr /R /V "Test"') do (
echo %%b
)
Is there anyway to combine them into something like
for /f "tokens=6,12 delims=:. " %%a %%b in ('type %1% ^| findstr /R /V "Test"') do (
echo %%a
echo %%b
)
Because right now this statement does not work.
This should work:
for /f "tokens=6,12 delims=:. " %%a in ('type "%~1" ^| findstr /R /V "Test"') do (
echo %%a
echo %%b
)
which could be simplified to
for /f "tokens=6,12 delims=:. " %%a in ('findstr /V "Test" "%~1"') do (
echo %%a
echo %%b
)
since findstr can read from files just fine, and you're not using a regular expression anyway.
I am trying to monitor the install of software on our servers remotly with a script by checking the .dll file version. I am not sure if this can be done but after the install on all of the servers I would like to run a bat file to look at all of the servers and create a log file with the server name and that .dll file version number. Suggestions would be great. Thanks.
First download STRINGS.EXE from here (to handle unicode).
http://technet.microsoft.com/en-us/sysinternals/bb897439.aspx
Here is a little something I have been using for quite a while. It does a bit more than you asked for but maybe someone else would prefer to have all of this. You can easily delete the parts you don't want. Add/remove file types as you like and remove the output sections you don't want. It does not do exactly what you asked but the hard part is done and you can adapt as you see fit. Save the code as FileVersions.bat (or whatever). Put this bat file and the downloaded STRINGS.EXE in the same folder. Execute this bat file to get output in FileVersions.txt (or whatever you name bat file). It will look something like this. Gets versions for all specified file types in folders underneath the current folder. Get this modified as you desire and then handle multiple machines as you see fit.
====== Output ============
Versions for *.dll *.ocx *.exe files - Thu 08/08/2013 21:13:28.17
File=C:\Drivers\storage\strings.exe
FileDesc=strings
FileVer=2.41
ProductName=Sysinternals Strings
ProductVer=2.41
File=C:\Drivers\storage\R159108\TEACico2.dll
FileDesc=TEACico2.DLL
FileVer=1, 1, 0, 0
ProductName= TEACico2 DLL
ProductVer=1, 1, 0, 0
====== End of Output ============
#ECHO OFF
TITLE %~n0
PUSHD %~dp0
SET FileTypes=*.dll *.ocx *.exe
SET OutFile=%~n0.txt
IF EXIST %OutFile% DEL /q %OutFile%
ECHO.Retrieving file versions for %FileTypes% files
ECHO.
ECHO.Versions for %FileTypes% files - %Date% %Time% > %OutFile%
ECHO.
FOR /R "%CD%" %%A IN (%FileTypes%) DO ECHO.%%A & CALL :FileVersion "%%A" >> %OutFile%
ECHO.
ECHO.Results are in %OutFile%
pause
GOTO :eof
REM ========================= Subroutines =========================
:FileVersion
SETLOCAL
ECHO.
ECHO.File=%~1
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "FileDescription"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :FileVer
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET FileDesc=%%B
IF NOT "%FileDesc%"=="FileVersion" SET FileDesc
:FileVer
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "FileVersion"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :ProductName
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET FileVer=%%B
SET FileVer
:ProductName
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "ProductName"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :ProductVer
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET ProductName=%%B
IF NOT "%ProductName%"=="ProductVersion" SET ProductName
:ProductVer
SET LineNum=Invalid
FOR /F "tokens=1 delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND /I "ProductVersion"') DO SET LineNum=%%A
IF %LineNum%==Invalid GOTO :Done
SET /A LineNum += 1
FOR /F "tokens=1* delims=[]" %%A IN ('STRINGS %1 ^| FIND /N /V "" ^| FIND "[%LineNum%]"') DO SET ProductVer=%%B
SET ProductVer
:Done
ENDLOCAL
GOTO:EOF