windows命令行脚本变量出错了吗?

时间:2009-10-01 09:56:27

标签: windows command-line scripting variables

使用Windows命令行脚本进行战斗我无法开始工作。

基本上我正在尝试使用HOST ipaddress PORT 5900 PASSWORD x的参数启动名为vnctv.exe的程序,但是我只想运行当前在线计算机的IP地址的程序。

我尝试了一些不同的东西,但我无法正常工作。

似乎当我运行cmd并单独输入命令时它们都能正常工作但是当我在.bat文件中运行它时它会失败。

我已经尝试过enabledelayedexpansion,所以我不需要打电话但我无法让它工作。

for循环首先循环通过30-255个地址。下一个循环ping 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 个答案:

答案 0 :(得分:1)

尝试转义%:

“tokens = 2 delims =(%%”

编辑:反映评论 另请注意,内部for循环的变量可能与外部冲突。当设置%G时,可以覆盖G(%h&%i)之后的其他标记。我建议你将外循环中的%i更改为%a。

答案 1 :(得分:1)

您的cmd处理器丢弃的最初抱怨是您似乎不会结束tokens=2 delims=(%选项字符串。这是因为您在delim集中使用了特殊的%。尝试在那里加一个%

"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并使用!替换循环中的%