Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

Problem chaining piped FIND commands in BTM

Nov
257
3
Hey... I'm feeling like I must be missing something obvious here.

TCC 18.00.32 x64 Windows 10 6.3.10586.

What I'm trying to do is determine if a particular IP route has a specific route, and if so, which one (essentially to determine which of two VPNs are connected and how they're routing IP traffic)

From the command line, I can do this:

route print | find "192.168.0.110" | find "192.168.10.1"
echo %?

I'll either get a 0 if the route exists, or a 1 if it doesn't. But when I throw this in a BTM, I don't get any output from the route command, and I always get %? == 0.

A single "| find" works, it's only when I chain two together that it fails.

I could re-implement the logic to actually parse the "route print" properly instead of blindly looking for a couple of specific IPs, but this is "good enough" because it's really just a pre-check, I will later verify that the remote resources are actually available, but these checks take 5-10 seconds to fail and I was hoping to dump an error more quickly.

(If it isn't clear, I need to find a route for a specific IP, and then determine which of two gateways I was assigned. Depending on the gateway that is available, I'll then proceed in different directions)

Any clues why I can't chain two piped "find" commands in a BTM, but I can at the command line?
 
In a simple test, I don't see a difference between the command line and a BTM file.
Code:
v:\> type routefind.btm
route print -4 | find "169.254" | find "169.254.1.2"
echo %?
route print -4 | find "169.254" | find "169.254.1.6"
echo %?

v:\> routefind.btm
  169.254.0.0  255.255.0.0  169.254.1.1  169.254.1.2  21
  169.254.1.2  255.255.255.255  On-link  169.254.1.2  276
  224.0.0.0  240.0.0.0  On-link  169.254.1.2  276
  255.255.255.255  255.255.255.255  On-link  169.254.1.2  276
0
1
 
Weird. I also get a %? = 0 every time if I do

route print -4 | find "192.168.0" > nul

But if I drop the "> nul", I get %? of 0 or 1 depending on whether it was found.
 
And here, it's as you might expect:
Code:
v:\> route print -4 | find "169.254" > nul

v:\> echo %?
0

v:\> route print -4 | find "garbage" > nul

v:\> echo %?
1
 
Code:
[~\AppData\Local\Temp]route print -4 | find "127.0.0.0" | find "127.0.0.1"
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306

[~\AppData\Local\Temp]echo %?
0

[~\AppData\Local\Temp]route print -4 | find "127.0.0.0" | find "127.0.0.2"

[~\AppData\Local\Temp]echo %?
1


Code:
[~\AppData\Local\Temp]"%comspec" /c exit 75

[~\AppData\Local\Temp]test.btm
route print -4
echo 75
75
route print -4
echo 75
75

[~\AppData\Local\Temp]type test.btm
@ECHO ON
route print -4 | find "127.0.0.0" | find "127.0.0.1"
echo %?
route print -4 | find "127.0.0.0" | find "127.0.0.2"
echo %?
 
With your test.btm (exactly):
Code:
v:\> "%comspec" /c exit 75

v:\> test.btm
route print -4
  127.0.0.0  255.0.0.0  On-link  127.0.0.1  306
echo 0
0
route print -4
echo 1
1

I guess it's one for Rex to figure out. Does your TCSTART.BTM do anything that might be relevant? I'm on 32-bit Win 7
 
Does Windows 10 have FINDSTR.EXE? When I replace "FIND" with "FINDSTR" (no other changes necessary) in your test BTM, I get exactly the same, correct, results. It's something to try.
 
You can use the in-process pipes as an option. And/or FFIND instead of find.
Code:
route print -4 |! ffind /vkm /t"127.0.0.0" |! ffind /vkm /t"127.0.0.1"
echo %?

You can use RegEx's to find the text in a single FFIND call too:
Code:
route print -4 |! ffind /vkm /e"127\.0\.0\.0.+127\.0\.0\.1"

-Scott
 

Similar threads

Back
Top