How to add error code numbers to the output text file? - windows

I have a batch script which loops through all windows errors and puts them in a text file called helplog2.txt. However, they are not separated by blank lines and the error messages do not have the error numbers before them.
Is there any way to fix that?
Here is my batch script:
#echo off
If Exist HelpLog2.txt Del HelpLog2.txt
(for /l %%i in (0,1,99999) do net helpmsg %%i 1>NUL 2>&1 && echo %%i & net helpmsg %%i | findstr /i "[a-z]" >> HelpLog2.txt)
Start "" HelpLog2.txt
pause

Use this batch code:
#echo off
del HelpLog2.txt 2>nul
for /L %%I in (0,1,9) do for /F delims^=^ eol^= %%J in ('%SystemRoot%\System32\net.exe helpmsg %%I 2^>^&1') do >>HelpLog2.txt echo %%I: %%J
for /L %%I in (10,1,99) do for /F delims^=^ eol^= %%J in ('%SystemRoot%\System32\net.exe helpmsg %%I 2^>^&1 ^| %SystemRoot%\System32\findstr.exe /V /C:"NET HELPMSG 3871"') do >>HelpLog2.txt echo %%I: %%J
for /L %%I in (100,1,999) do for /F delims^=^ eol^= %%J in ('%SystemRoot%\System32\net.exe helpmsg %%I 2^>^&1 ^| %SystemRoot%\System32\findstr.exe /V /C:"NET HELPMSG 3871"') do >>HelpLog2.txt echo %%I: %%J
for /L %%I in (1000,1,9999) do for /F delims^=^ eol^= %%J in ('%SystemRoot%\System32\net.exe helpmsg %%I 2^>^&1 ^| %SystemRoot%\System32\findstr.exe /V /C:"NET HELPMSG 3871"') do >>HelpLog2.txt echo %%I: %%J
for /L %%I in (10000,1,99999) do for /F delims^=^ eol^= %%J in ('%SystemRoot%\System32\net.exe helpmsg %%I 2^>^&1 ^| %SystemRoot%\System32\findstr.exe /V /C:"NET HELPMSG 3871"') do >>HelpLog2.txt echo %%I: %%J
start "" HelpLog2.txt
It takes several minutes to finish, but finally you should have the wanted information in well formatted file HelpLog2.txt.
To understand the commands used and how they work, open a command prompt window, execute there the following commands, and read the displayed help pages for each command, entirely and carefully.
del /?
echo /?
findstr /?
for /?
net /?
net helpmsg /?

Related

How can I find last row that contains string in txt with cmd command

I want to find two different strings in .txt file. I need two scripts, first script to find last row that contains these strings together and second script to find last row that contains these strings seperately. I tried to write somethings but I go off the project.
This what i have tried so far as code :
#echo off
for /f %%i in ('find /v /c "" ^< deneme.txt') do set /a lines=%%i
echo %lines%
set /a startLine=%lines% - 1
more /e +%startLine% deneme.txt > temp.txt
find "ali" temp.txt|find "veli"
del temp.txt
Thanks for help.
#echo off
set "string1=ali"
set "string2=veli"
set "file=deneme.txt"
for /f "delims=" %%a in ('findstr /i "\<%string1%\>" %file% ^|findstr /i /v "\<%string2%\>" ') do set "out1=%%a"
for /f "delims=" %%a in ('findstr /i "\<%string2%\>" %file% ^|findstr /i /v "\<%string1%\>" ') do set "out2=%%a"
for /f "delims=" %%a in ('findstr /i "\<%string1%\>" %file% ^|findstr /i "\<%string2%\>" ') do set "out3=%%a"
echo last line with %string1%: "%out1%"
echo last line with %string2%: "%out2%"
echo last line with both: "%out3%"
for explanations, see for /? and findstr /?

Windows Batch file split string %%i was unexpected at this time

I'm trying to set few variables from systeminfo command in Windows. I read all kinds of similar threads and tried various things, but always keep getting the same error:
%%G was unexpected at this time.
or
%%i was unexpected at this time.
I've been trying to get this done all day long. Can someone point me in the right direction please? This is what I have tried so far:
for /f "tokens=:" %%i in ('systeminfo ^| grep "OS Name"') do set OSname=%%i
for /f "usebackq delims=: tokens=2" %%i in ('systeminfo ^| grep "OS Name"') do set OSname=%%i
FOR /F "usebackq delims= tokens=2" %%i IN ('systeminfo ^| grep "OS Name"') DO set vers=%%i
for /f "tokens=* delims= " %%a in ('systeminfo ^|grep "OS Name"') do (set OS_Name=%%a)
systeminfo | find "OS Name" > osname.txt
for /f "usebackq delims=: tokens=2" %%i in (osname.txt) do set osname=%%i
FOR /F %%G IN (FINDSTR /L /C:"OS Name" systeminfo.txt) DO ECHO %%G
UPDATE: I got it to work like this:
FOR /F "usebackq delims=: tokens=2" %i IN (`FINDSTR /L /C:"OS Name" systeminfo.txt`) DO set osname=%i
Any way to remove the leading space in front of the string? Thanks.
This is all you need to get the OS name.
for /f "tokens=2* delims=: " %%i in ('systeminfo ^| find "OS Name"') do set OSname=%%j

Open and run commands in simultaneous windows

I have created a batch file to test IP addresses on the local network of the host. It looks to pull the operating systems of the other machines and write them to a text file.
FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.1 os get buildnumber,caption,CSDVersion /format:csv > C:\IP\IP.txt
FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.2 os get buildnumber,caption,CSDVersion /format:csv >> C:\IP\IP.txt
FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.3 os get buildnumber,caption,CSDVersion /format:csv >> C:\IP\IP.txt
(Note: I only show 3 lines here but the actual file runs through all 256 addresses.)
It runs through each line and writes to the file just fine. However if there is nothing at that IP, it takes 30 second to time out and move onto the next IP.
I would like to open a new cmd window for each line and run them simultaneously. Once I have this set up, I'd modify it to only run 10 at a time or something - but I need to reduce the total time it takes to run every line.
I have tried running them with CMD /c (as seen below) but it still seems to wait until each line is complete before moving to the next one. Is there a CMD parameter that I can add to make new window completely independent?
CMD /c "FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.1 os get buildnumber,caption,CSDVersion /format:csv > C:\IP\IP.txt"
CMD /c "FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.2 os get buildnumber,caption,CSDVersion /format:csv >> C:\IP\IP.txt"
CMD /c "FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.3 os get buildnumber,caption,CSDVersion /format:csv >> C:\IP\IP.txt"
Add START at te beginning of the line:
START CMD /c "FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.1 os get buildnumber,caption,CSDVersion /format:csv > C:\IP\IP.txt"
START CMD /c "FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.2 os get buildnumber,caption,CSDVersion /format:csv >> C:\IP\IP.txt"
START CMD /c "FOR /F "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') DO FOR /F "tokens=3 delims= " %%g IN ("%%d") DO FOR /F "tokens=1 delims=." %%h IN ("%%g") DO FOR /F "tokens=2 delims=." %%i IN ("%%g") DO FOR /F "tokens=3 delims=." %%j IN ("%%g") DO WMIC /node:%%h.%%i.%%j.3 os get buildnumber,caption,CSDVersion /format:csv >> C:\IP\IP.txt"
...
You can use START command. You may want to escape the double quotes.
START "FOR /F ""tokens=1 delims=:"" %%d IN ('ping %computername% -4 -n 1 ^| find /i ""reply""') DO FOR /F ""tokens=3 delims= "" %%g IN (""%%d"") DO FOR /F ""tokens=1 delims=."" %%h IN (""%%g"") DO FOR /F ""tokens=2 delims=."" %%i IN (""%%g"") DO FOR /F ""tokens=3 delims=."" %%j IN (""%%g"") DO WMIC /node:%%h.%%i.%%j.1 os get buildnumber,caption,CSDVersion /format:csv > C:\IP\IP.txt"
To make it clean, put the command in a separate batch file and execute it.
START "Path\to\batch\file.bat"
There are more options available with START command. As you may very well know, they can be seen by simply giving the command START /?.

How do i get a specific line from an output using a batch file?

I have the code below that returns the hostname and IP address of a given server. How can i only have the hostname as the output?
FOR /F %%i in (servers.txt) do FOR /F "skip=3 delims=: tokens=2 usebackq" %%j in (`nslookup %%i`) do #echo %%j >> Devices_With_IP.txt
Assuming your machine uses English:
FOR /F %%i in (servers.txt) do FOR /F "delims=: tokens=2" %%j in (
'nslookup %%i ^| find "Name:"'
) do #echo %%j >> Devices_With_IP.txt
Try using the findstr command on the output of your nslookup to get only the line containing "Name".
FOR /F %%i in (servers.txt) do FOR /F "tokens=2 usebackq delims=: " %%j in (`nslookup %%i ^| findstr Name`) do #echo %%j >> Devices_With_IP.txt
Note that I also rearranged the /F conditions in the second loop in order to include space as a deliminator, this removes the leading spaces before the output.
Using the find command instead of findstr -
FOR /F %%i in (servers.txt) do FOR /F "tokens=2 usebackq delims=: " %%j in (`nslookup %%i ^| find "Name"`) do #echo %%j >> Devices_With_IP.txt
Just realized that using find instead of findstr makes this (almost) exactly the same as dbenham's answer.

How to get the number of files in directory in variable in windows batch file

I have tried following command to do this but it's not working :
for /f "delims=" %%i in ('dir "d:/Database/BARC/" /b/a-d | find /v /c "::") do set count=%%i
It is showing some error like unexpected error. How to round this error?
#echo off
for /f "delims=" %%i in ('dir "d:/Database/BARC/" /b/a-d ^| find /v /c "::"') do set count=%%i
echo %count%

Resources