1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Problem chaining piped FIND commands in BTM

Discussion in 'Support' started by thedave, May 27, 2016.

  1. thedave

    Joined:
    Nov 13, 2008
    Messages:
    253
    Likes Received:
    2
    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?
     
  2. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,953
    Likes Received:
    30
    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
     
  3. thedave

    Joined:
    Nov 13, 2008
    Messages:
    253
    Likes Received:
    2
    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.
     
  4. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,953
    Likes Received:
    30
    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
     
  5. thedave

    Joined:
    Nov 13, 2008
    Messages:
    253
    Likes Received:
    2
    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 %?
    
    
     
  6. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,953
    Likes Received:
    30
    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
     
  7. vefatica

    Joined:
    May 20, 2008
    Messages:
    7,953
    Likes Received:
    30
    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.
     
  8. samintz

    samintz Scott Mintz

    Joined:
    May 20, 2008
    Messages:
    1,190
    Likes Received:
    11
    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
     

Share This Page