【发布时间】:2016-03-17 23:26:28
【问题描述】:
我有这个批处理文件可以在连接到 vpn 时自动执行此过程。在 vpn 连接后它还需要执行一些其他步骤,所以我编写了一个循环来不断检查是否有 vpn 连接。但即使 vpn 连接,它也永远无法跳出循环。请帮忙。
这是相关代码
"%ProgramFiles(x86)%\Cisco Systems\VPN Client\ipsecdialer.exe" -c -sd -user %username% -pwd %vpn_password% "lifeline-ceacc.elluciancloud.com"
:loop
set length_of_file = 0
("%ProgramFiles(x86)%\Cisco Systems\VPN Client\vpnclient.exe" stat) >_vpnstat.txt
PING -n 5 127.0.0.1>nul
set /p vpnstat=<_vpnstat.txt
call :strlen length_of_file vpnstat
echo %length_of_file%
::del _vpnstat.txt::
IF %length_of_file% LSS 46 goto :loop
::doing some other stuff here::
goto :eof
:strlen <resultVar> <stringVar>
(
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
endlocal
set "%~1=%len%"
exit /b
)
【问题讨论】:
-
文件
_vpnstat.txt在连接建立的情况下包含什么,如果没有呢?我了解您正在检查返回字符串的长度是否为 46 个或更多字符;您可以使用if "%vpnstat:~45%"=="" goto :loop,而不是复杂的字符串长度计算;这使用子字符串扩展——见set /?... -
嗯... ("%ProgramFiles(x86)%\Cisco Systems\VPN Client\vpnclient.exe" stat) >_vpnstat.txt 是循环中的第二行代码,因此它包含调用的结果(vpnclient.exe stat)。如果没有连接,文件应该是 44 字长。如果有连接,应该接近100。
-
我希望您提供一些示例文本...无论如何,它必须是单行文本,因为您通过重定向到
set /P来阅读它;我建议将echo(%vpnstat%放在set /P命令行之后进行测试,因为set /P可能会忽略某些字符... -
编辑:老兄! nvmd 关于我正在使用的内容。将您的设置为答案。你的建议奏效了。 :) ....... 没关系。没用。我开枪了
标签: batch-file command-line automation infinite-loop