переменная сценария командной строки Windows где-то не так? - PullRequest
0 голосов
/ 01 октября 2009

Борьба со сценарием командной строки Windows, я просто не могу приступить к работе.

В основном я пытаюсь запустить программу vnctv.exe с параметрами HOST ipaddress PORT 5900 PASSWORD x, однако я хочу запускать программу только с IP-адресами компьютеров, которые в данный момент находятся в сети.

Я пробовал несколько разных вещей, но не могу заставить что-либо работать должным образом.

Кажется, что когда я запускаю cmd и печатаю команды по отдельности, все они работают правильно, но когда я запускаю его в файле .bat, это не получается.

Я попробовал enabledelayedexpansion, поэтому мне не нужно было звонить, но я не мог заставить это работать.

Цикл for сначала перебирает 30-255 адресов. Следующий цикл проверяет IP-адрес и находит уровень потерь. Если это 0, то мне нужно добавить этот адрес в параметр запуска для vnctv.exe. Я попытался повторить файл, удалив символы \ n, но не смог заставить это работать. Таким образом, скрипт должен добавить параметр в переменную, но он не работает.

вот оно

set _megga=vnctv.exe

FOR /L %%A IN (253,1,255) DO (

    FOR /F "tokens=2 delims=(%%" %%B 
     IN ('PING -w 500 -n 1 91.40.20.%%A -w 500 -n 1 ^|find "loss"')
     DO ( if %%B EQU 0 call :exec ))
 )

:exec

set %%_megga=%_megga% HOST 91.40.20.%%A PORT 5900 PASSWORD x

goto :EOF

echo %%_megga > run.bat
run.bat

и вот вывод

Z:\>set _megga=vnctv.exe

Z:\>FOR /L %A IN (253 1 255) DO (FOR /F "tokens=2 delims=(%" %B IN ('PING -w 500
 -n 1 91.40.20.%A -w 500 -n 1 |find "loss"') DO (if %B EQU 0 call :exec  ) )

Z:\>(FOR /F "tokens=2 delims=(%" %B IN ('PING -w 500 -n 1 91.40.20.253 -w 500 -n
 1 |find "loss"') DO (if %B EQU 0 call :exec  ) )

Z:\>(if 0 EQU 0 call :exec  )

Z:\>set %_megga=vnctv.exe HOST 91.40.20.%A PORT 5900 PASSWORD x

Z:\>goto :EOF

Z:\>(FOR /F "tokens=2 delims=(%" %B IN ('PING -w 500 -n 1 91.40.20.254 -w 500 -n
 1 |find "loss"') DO (if %B EQU 0 call :exec  ) )

Z:\>(if 0 EQU 0 call :exec  )

Z:\>set %_megga=vnctv.exe HOST 91.40.20.%A PORT 5900 PASSWORD x

Z:\>goto :EOF

Z:\>(FOR /F "tokens=2 delims=(%" %B IN ('PING -w 500 -n 1 91.40.20.255 -w 500 -n
 1 |find "loss"') DO (if %B EQU 0 call :exec  ) )

Z:\>(if 100 EQU 0 call :exec  )

Z:\>set

%_megga=vnctv.exe HOST 91.40.20.%A PORT 5900 PASSWORD x

_megga=vnctv.exe

Z:\>set %_megga=vnctv.exe HOST 91.40.20.%A PORT 5900 PASSWORD x

Z:\>goto :EOF

Когда я установил, он должен читать, например, 91.40.20.254 вместо% A, а также он делает 2 разные переменные

Спасибо за любую помощь

Адам

попробовал это, но все еще получает% 1 или 1 вместо фактического значения

 set _megga=vnctv.exe
 FOR /L %%A IN (253,1,255) DO (
 FOR /F "tokens=2 delims=(%%" %%B IN 
 ('PING -w 500 -n 1 91.40.20.%%A -w 500 -n 1 ^|find "loss"') 
 DO ( if %%B EQU 0 call :exec %%A))

 :exec
 set %%_megga=%%_megga HOST 91.40.20.%%1 PORT 5900 PASSWORD x
 goto :EOF

Ответы [ 2 ]

1 голос
/ 01 октября 2009

Первоначальная жалоба, которую выбрасывает ваш процессор cmd, заключается в том, что вы, похоже, не заканчиваете строку параметров tokens=2 delims=(%. Это потому, что вы используете специальный % в вашем наборе разделителей. Попробуйте поставить туда двойное %:

"tokens=2 delims=(%%"

Вот другая стратегия для решения вашей проблемы:

setlocal enabledelayedexpansion 
set _megga=vnctv.exe
echo echo running %_megga% batch > run.bat
FOR /L %%A IN (253,1,255) DO (

    FOR /F "tokens=2 delims=(%%" %%B IN ('PING -w 500 -n 1 91.40.20.%%A -w 500 -n 1 ^|find "loss"') DO ( 
          if %%B EQU 0 set _megga=!_megga! HOST 91.40.20.%%A PORT 5900 PASSWORD x ))
 )
echo %_megga% >> run.bat
run.bat

Я понял суть ваших циклов, но вместо того, чтобы выпрыгнуть на метку, я объединяю команду в цикле, а затем выводим ее на run.bat, который затем можно запустить в конце. Вы заметите, что я использую setlocal enabledelayedexpansion и использую ! для замены % в цикле.

1 голос
/ 01 октября 2009

попробуйте убежать%:

"токены = 2 delims = (%%"

Редактировать: отразить комментарий Также обратите внимание, что внутренние переменные цикла for могут конфликтовать с внешними. Когда установлено% G, другие токены после G (% h &% i) могут быть перезаписаны. Я предлагаю вам изменить% i во внешнем цикле на% a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...