Hello. I have the following batch script to ping all ip addresses on my subnet:
FOR /L %%i IN (1,1,254) DO PING -n 1 192.168.2.%%i | FINDSTR /i /R "Reply from ^(192.168.4.20)"
I want to only show machines which reply to the ping, excluding a "Reply from 192.168.4.20: Destination host unreachable" (192.168.4.20 is the machine which is doing the pinging)
I have used ^(192.168.4.20) to exclude this line. However, the above line hangs when run and doesn't work, despite using the /R regular expression switch to exclude any lines which contain "Reply from 192.168.4.20".
What could be the problem?
Regular expressions not working in batch script for pinging subnet
Moderator: DosItHelp
Re: Regular expressions not working in batch script for pinging subnet
I am not understanding why you think you need to use a Regular Expression or parentheses? That is definitely not the code you would use to exclude a match.
Re: Regular expressions not working in batch script for pinging subnet
There are a number of reasons why your code is not working as you expect:
1) FINDSTR treats a search like "A B" as a search for A or B (two different searches, space delimited). If you want a search to contain space literals, then the /C:"search with spaces" option must be used.
2) FINDSTR has extremely limited regular expression support. Among other things, it does not support grouping by parentheses.
3) Even if you substituted some other full featured regular expression search tool (like grep for Windows), your regex is completely wrong. You need to study the syntax of regular expressions more. If you want to match a dot literal, then it must be escaped. And the ^ is an anchor meaning the next expression must begin a line. You would need a negative look-ahead assertion instead. Something like (?!192\.168\.4\.20)"
4) I'm not an expert on PING, so maybe I'm missing something. But why would PING 192.168.2.n ever return 192.168.4.n? Shouldn't both colored numbers be the same (either 2 or 4)?
Assuming you intended to use 4 everywhere, then you should filter out the number before you PING. That way your FIND or FINDSTR filter need not worry about the address.
Dave Benham
1) FINDSTR treats a search like "A B" as a search for A or B (two different searches, space delimited). If you want a search to contain space literals, then the /C:"search with spaces" option must be used.
2) FINDSTR has extremely limited regular expression support. Among other things, it does not support grouping by parentheses.
3) Even if you substituted some other full featured regular expression search tool (like grep for Windows), your regex is completely wrong. You need to study the syntax of regular expressions more. If you want to match a dot literal, then it must be escaped. And the ^ is an anchor meaning the next expression must begin a line. You would need a negative look-ahead assertion instead. Something like (?!192\.168\.4\.20)"
4) I'm not an expert on PING, so maybe I'm missing something. But why would PING 192.168.2.n ever return 192.168.4.n? Shouldn't both colored numbers be the same (either 2 or 4)?
Assuming you intended to use 4 everywhere, then you should filter out the number before you PING. That way your FIND or FINDSTR filter need not worry about the address.
Code: Select all
FOR /L %%i IN (1,1,254) DO IF %%i NEQ 20 PING -n 1 192.168.4.%%i | FIND "Reply from "
Dave Benham
Re: Regular expressions not working in batch script for pinging subnet
The search string (RegEx), which can be used here, is unfortunately not possible to enter in FINDSTR.
Search string: ^Reply from 192\.168\.4\.(?!20:)\d+
A solution with FINDSTR is possible.
The blanks can be replaced with a dot.
The dots between the digits are replaced by a metacharacter.
Each search area is defined separately.
Here is the search for FINDSTR:
To understand:
The solution from dbenham is shorter.
Search string: ^Reply from 192\.168\.4\.(?!20:)\d+
A solution with FINDSTR is possible.
The blanks can be replaced with a dot.
The dots between the digits are replaced by a metacharacter.
Each search area is defined separately.
Here is the search for FINDSTR:
Code: Select all
for /l %%a in (1, 1, 254) do (echo Reply from 192.168.4.%%a:) | findstr /r "^Reply.from.192\.168\.4\.[123456789]: ^Reply.from.192\.168\.4\.[13456789][0123456789]: ^Reply.from.192\.168\.4\.[2][123456789]: ^Reply.from.192\.168\.4\.[12][0123456789][0123456789]:"
To understand:
Code: Select all
For any adress: 192.168.4.xxx
xxx with numbers from 1 to 9
"^Reply.from.192\.168\.4\.[123456789][:]"
xxx with numbers from 10 to 19 and from 30 to 99
"^Reply.from.192\.168\.4\.[13456789][0123456789][:]"
xxx with numbers from 21 to 29
"^Reply.from.192\.168\.4\.[2][123456789][:]"
xxx with numbers from 100 to 299; Numbers higher as 254 not using by the FOR command.
"^Reply.from.192\.168\.4\.[12][0123456789][0123456789][:]"
The solution from dbenham is shorter.