locobastos
locobastos

Reputation: 137

Test if computer is available on network

I work on a company which has many Shop. Each shop has his own IP address : SHOP 1 = 192.168.1.0/24, SHOP 2 = 192.168.2.0/24, SHOP 3 = 192.168.3.0/24, etc...

I have a number of Windows computers (between 1 and 9) on the same subnet (255.255.255.0) on each shop. Each computer has a static IP address : 1st = 192.168.1.10, 2nd = 192.168.1.20, 3rd = 192.168.1.30, 4th = 192.168.1.40, etc.

The HQ of my company can deploy softs ONLY on the first computer on each shop (licences issue). Here, we will try to install Xerox drivers on ALL windows computer on all shop.

I made 3 batch script :

  1. The first, launched as the superadmin of the computer, install a new user with admin rights to install drivers
  2. The second, launched as the new user, install Xerox drivers and set as default the printer.
  3. The third, launched as the superadmin of the computer, try to install Xerox drivers on other computers of the same shop :

    • Loop over my 9 ip address (for /l %%G in (...) do (...)
    • For each IP address, test if it ping.
    • Do a ftp transfer between the computer 1 and the IP address (drivers packages + scripts)
    • PsExec64.exe to run the first script
    • PsExec64.exe to run the second script

The first and the second script works perfectly, we'll not speak about them.

Where I need help is on the thrid.

I try 3 scripts :

The first :

set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
    ping -n 1 %subnet%%%G | findstr "TTL="
    if %errorlevel%==0 (
        echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
    ) else (
        echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
    )
)

Here the log_ping_errorlevel.txt with 2 computers on my subnet :

Ping 192.168.1.20 : OK
Ping 192.168.1.30 : OK
Ping 192.168.1.40 : OK
Ping 192.168.1.50 : OK
Ping 192.168.1.60 : OK
Ping 192.168.1.70 : OK
Ping 192.168.1.80 : OK
Ping 192.168.1.90 : OK`

I tried to surround %errorlevel% and 0 by simple quote but I get the same result.

Here an extract of the output if I run the batch in cmd window :

C:\Temp\Xerox_Install>(
ping -n 1 192.168.1.90   | findstr "TTL="
if '0'=='0' (echo "Ping 192.168.1.90 : OK"  1>>log_ping_errorlevel.txt )    el
se (echo "Ping 192.168.1.90 : KO"  1>>log_ping_errorlevel.txt ) 
)

It seems that the errorlevel is always = 0 in my script, IDK why.

The second :

set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
    ping -n 1 %subnet%%%G && set pingtest=ok
    if '%ping_test%'=='ok' (
        echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
    ) else (
        echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
    )
)

Here the log_ping_set.txt with 2 computers on my subnet :

Ping 192.168.1.20 : OK
Ping 192.168.1.30 : OK
Ping 192.168.1.40 : OK
Ping 192.168.1.50 : OK
Ping 192.168.1.60 : OK
Ping 192.168.1.70 : OK
Ping 192.168.1.80 : OK
Ping 192.168.1.90 : OK`

I think the ping command result is always 0 then the setter pingtest can be executed.

The third :

Because I'm stuck with the ping command, I tried the if exist folder on remote computer :

set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
    if exist \\%subnet%%%G\C$\Temp\ (
        echo Remote folder reachable >> log_folder_reachable.txt
    ) else (
        echo ERROR 404 - Remote folder not found >> log_folder_reachable.txt
    )
)

Here the log_folder_reachable.txt with 2 computers on my subnet :

Remote folder reachable
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found
ERROR 404 - Remote folder not found

It works BUT the if exist timeover is about 160 seconds and I don't want to wait for 160 seconds before going to the next computer...

Can someone help me with any method but not using external tools ?

Upvotes: 0

Views: 452

Answers (2)

Squashman
Squashman

Reputation: 14320

In regards to your first set of code where you said you tried to use delayed expansion it should look like this. Tested and works on my network.

@echo off
setlocal enabledelayedexpansion
set subnet=192.168.1.
for /L %%G in (20, 10, 90) do (
    ping -n 1 %subnet%%%G | findstr "TTL="
    if !errorlevel!==0 (
        echo Ping %subnet%%%G : OK >> log_ping_errorlevel.txt
    ) else (
        echo Ping %subnet%%%G : KO >> log_ping_errorlevel.txt
    )

Upvotes: 0

Magoo
Magoo

Reputation: 80203

You should read SO items about delayedexpansion.

if %errorlevel%==0 (

in the first script should be

if not errorlevel 1 (

[obviously, reverse the logical condition and remove the "not"]

if errorlevel 1 means "if errorlevel is 1 or greater than 1" and is interpreted on the run-time value of errorlevel.

Next:

ping -n 1 %subnet%%%G && set pingtest=ok
if '%ping_test%'=='ok' (

should be

set "ping_test="
ping -n 1 %subnet%%%G && set "ping_test=ok"
if defined ping_test (

Notes
you are setting pingtest in your ping command, then you are attempting to test ping_test

Even had the variablename been correct, the purpose for the quotes in an if statement is to combine the contents as a single string. Single-quotes don't cut the mustard, double-quotes are required.

With the code you have, ping_test once set will retain its value for the next loop, you need to clear it before theping.

The replacement code first sets the value of ping_test to nothing. The quotes delimit the variable name and value so that trailing spaces on the line are not included in the value assigned. The ping command then may set the value of ping_test to (ok, but any value other than nothing (ie something) is valid). The if defined command interprets the run-time value of the variable.

The third part - well, getting desperate, but no need to go this far as the changes I've outlined should solve the problem.

Upvotes: 1

Related Questions