【问题标题】:windows command line script variable going wrong somewhere?windows命令行脚本变量在某处出错?
【发布时间】:2010-12-02 22:41:27
【问题描述】:

与 Windows 命令行脚本作斗争,我无法开始工作。

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

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

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

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

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 (如果 %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 (如果 %B EQU 0 call :exec ) Z:\>(如果 0 EQU 0 调用 :exec ) Z:\>set %_megga=vnctv.exe HOST 91.40.20.%A PORT 5900 PASSWORD x Z:\>转到: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 (如果 %B EQU 0 call :exec ) Z:\>(如果 0 EQU 0 调用 :exec ) Z:\>set %_megga=vnctv.exe HOST 91.40.20.%A PORT 5900 PASSWORD x Z:\>转到: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 (如果 %B EQU 0 call :exec ) Z:\>(如果 100 EQU 0 调用 :exec ) Z:\>设置 %_megga=vnctv.exe 主机 91.40.20.%A 端口 5900 密码 x _megga=vnctv.exe Z:\>set %_megga=vnctv.exe HOST 91.40.20.%A PORT 5900 PASSWORD x Z:\>转到: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

【问题讨论】:

    标签: windows command-line scripting variables


    【解决方案1】:

    尝试转义 %:

    "tokens=2 delims=(%%"

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢,这确实有效,但是它会启动应用程序多次,因为我只需要启动应用程序一次并在一次调用中包含所有参数。
      • 亚当,请注意我最近对您的评论所做的更改。
      • 啊哈太棒了,这就是我出错的地方,非常感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      相关资源
      最近更新 更多