回声加一个随机值

时间:2019-02-17 02:12:12

标签: batch-file random echo

我有一个可以创建另一个批处理文件的批处理文件。

我需要在回声中添加一个随机函数,使数字从1到6。

我的批处理代码(完美运行)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::: Batch Code :::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off
    (for /f "usebackq delims=" %%a in ("D:\Program files\Openvpn\openvpn_configuration_list_for_clicks.csv") do (
       echo :::: Start Of The Command Block ::::
       echo/
       echo MOVE /Y "D:\Program files\Openvpn\config_to_check\%%~NXa" "D:\Program files\Openvpn\config\"
       echo START "" "C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect %%~NXa
       echo PING -n 30 localhost ^>NUL 2^>^&1
       echo PING -n 5 www.wikipedia.org^|FIND /I "TTL"^>NUL
       echo IF NOT "%%ERRORLEVEL%%"=="1" ^(
       echo rundll32 user32.dll,MessageBeep 0x00000010L
       echo start "" "D:\Program files\Firefox Esr\FirefoxPortable.exe"
       echo TIMEOUT /T 60 /NOBREAK ^>NUL
       echo goto search_%%a
       echo ^)
       echo :search_%%a
       echo tasklist /FI "IMAGENAME eq firefox.exe" 2^>NUL ^| find /I /N "firefox.exe"^>NUL
       echo if "%%ERRORLEVEL%%"=="0" ^(
       echo TIMEOUT /T 60 /NOBREAK ^>NUL
       echo goto search_%%a
       echo ^)
       echo if "%%ERRORLEVEL%%"=="1" ^(goto continue_%%a^)
       echo :continue_%%a
       echo taskkill.exe /F /IM openvpn.exe
       echo taskkill.exe /F /IM openvpn-gui.exe
       echo MOVE /Y "D:\Program files\Openvpn\config\%%~NXa" "D:\Program files\Openvpn\config_to_check\"
       echo/
       echo :::: End Of The Command Block ::::
       echo/
       echo/
       echo/
    )) > "D:\Program files\Openvpn\final.bat"
       (echo exit) >> "D:\Program files\Openvpn\final.bat"

openvpn_configuration_list_for_clicks.csv(VPN列表)

vpn1.ovpn
vpn2.ovpn
vpn4.ovpn
vpn8.ovpn

输出没有随机功能的final.bat(完美运行)

:::: Start Of The Command Block ::::
MOVE /Y "D:\Program Files\Openvpn\config_to_check\vpn1.ovpn" "D:\Program Files\Openvpn\config\"
START "" "C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect vpn1.ovpn
PING -n 30 localhost >NUL 2>&1
PING -n 5 www.wikipedia.org|FIND /I "TTL">NUL
IF NOT "%ERRORLEVEL%"=="1" (
rundll32 user32.dll,MessageBeep 0x00000010L
start "" "D:\Program Files\Firefox Esr\FirefoxPortable.exe"
TIMEOUT /T 60 /NOBREAK >NUL
goto search_vpn1.ovpn
)
:search_vpn1.ovpn
tasklist /FI "IMAGENAME eq firefox.exe" 2>NUL | find /I /N "firefox.exe">NUL
if "%ERRORLEVEL%"=="0" (
TIMEOUT /T 60 /NOBREAK >NUL
goto search_vpn1.ovpn
)
if "%ERRORLEVEL%"=="1" (goto continue_vpn1.ovpn)
:continue_vpn1.ovpn
taskkill.exe /F /IM openvpn.exe
taskkill.exe /F /IM openvpn-gui.exe
MOVE /Y "D:\Program Files\Openvpn\config\vpn1.ovpn" "D:\Program Files\Openvpn\config_to_check\"

:::: End Of The Command Block ::::

我需要一个解决方案,使回波内部路径中的随机数为1到6。

"D:\Program Files\Firefox Esr 2\FirefoxPortable.exe"

"D:\Program Files\Firefox Esr 5\FirefoxPortable.exe"

"D:\Program Files\Firefox Esr 6\FirefoxPortable.exe"

没有随机函数的代码可以很好地工作并正确生成输出,我需要在代码内插入一个随机函数,该函数不会使输出生成出错。

随机函数需要为每个循环计算一个新的随机数

1 个答案:

答案 0 :(得分:1)

让我通过一些示例逐步说明我的观点。

您的初始代码不必要地转义了括号,并且应该看起来像这样:

    Echo :::: Start Of The Command Block ::::
    Echo/
    Echo Ping -n 30 localhost ^>Nul 2^>^&1
    Echo Ping -n 5 www.facebook.com^|Find /I "TTL"^>Nul
    Echo If Not "%%ErrorLevel%%"=="1" (
    Echo    Rundll32 User32.dll,MessageBeep 0x00000010L
    Echo    Set /A num=(%%RANDOM%% %%%% 6^^^) + 1
    Echo    Start "" "D:\Program Files\Firefox Portable %%num%%\FirefoxPortable.exe"
    Echo    Timeout 60 /NoBreak ^>Nul
    Echo ^)
    Echo/
    Echo :search

但是,您要设置变量并尝试在同一If块中使用它,可以通过多种方式来解决此问题:

  1. 使用伪Call语句:

        Echo :::: Start Of The Command Block ::::
        Echo/
        Echo Ping -n 30 localhost ^>Nul 2^>^&1
        Echo Ping -n 5 www.facebook.com^|Find /I "TTL"^>Nul
        Echo If Not "%%ErrorLevel%%"=="1" (
        Echo    Rundll32 User32.dll,MessageBeep 0x00000010L
        Echo    Set /A num=(%%RANDOM%% %%%% 6^^^) + 1
        Echo    Call Start "" "D:\Program Files\Firefox Portable %%%%num%%%%\FirefoxPortable.exe"
        Echo    Timeout 60 /NoBreak ^>Nul
        Echo ^)
        Echo/
        Echo :search
    
  2. 启用延迟扩展:(此示例假设在执行Echo ing的脚本中尚未启用延迟扩展)

        Echo :::: Start Of The Command Block ::::
        Echo/
        Echo Ping -n 30 localhost ^>Nul 2^>^&1
        Echo Ping -n 5 www.facebook.com^|Find /I "TTL"^>Nul
        Echo If Not "%%ErrorLevel%%"=="1" (
        Echo    Rundll32 User32.dll,MessageBeep 0x00000010L
        Echo    Set /A num=(%%RANDOM%% %%%% 6^^^) + 1
        Echo    SetLocal EnableDelayedExpansion
        Echo    Start "" "D:\Program Files\Firefox Portable !num!\FirefoxPortable.exe"
        Echo    EndLocal
        Echo    Timeout 60 /NoBreak ^>Nul
        Echo ^)
        Echo/
        Echo :search
    
  3. 启用延迟扩展:(此示例假定在执行Echo的脚本中已启用延迟扩展)

        Echo :::: Start Of The Command Block ::::
        Echo/
        Echo Ping -n 30 localhost ^>Nul 2^>^&1
        Echo Ping -n 5 www.facebook.com^|Find /I "TTL"^>Nul
        Echo If Not "%%ErrorLevel%%"=="1" (
        Echo    Rundll32 User32.dll,MessageBeep 0x00000010L
        Echo    Set /A num=(%%RANDOM%% %%%% 6^^^) + 1
        Echo    SetLocal EnableDelayedExpansion
        Echo    Start "" "D:\Program Files\Firefox Portable ^!num^!\FirefoxPortable.exe"
        Echo    EndLocal
        Echo    Timeout 60 /NoBreak ^>Nul
        Echo ^)
        Echo/
        Echo :search
    
  4. 重构代码,以免出现不必要的If(首选)

        Echo :::: Start Of The Command Block ::::
        Echo/
        Echo Ping -n 30 localhost ^>Nul 2^>^&1
        Echo Ping -n 5 www.facebook.com^|Find /I "TTL"^>Nul
        Echo If "%%ErrorLevel%%"=="1" GoTo search
        Echo Rundll32 User32.dll,MessageBeep 0x00000010L
        Echo Set /A num=(%%RANDOM%% %%%% 6^) + 1
        Echo Start "" "D:\Program Files\Firefox Portable %%num%%\FirefoxPortable.exe"
        Echo Timeout 60 /NoBreak ^>Nul
        Echo/
        Echo :search
    

以上所有示例均假定所显示的代码在带括号的块内,类似于(code above)>"another.bat">"another.cmd" (code above)


[编辑/]

这里有一些代码可以合并您现在发布的其他内容。我从上面利用了方法4.来删除不必要的If块。它还应包含所需的随机化功能,该功能与以前发布的功能相同,并且与批处理文件兼容。

@Echo Off
(For /F "UseBackQ Delims=" %%A In (
    "D:\Program Files\OpenVPN\openvpn_configuration_list_for_clicks.csv") Do (
    Echo @Move /Y "D:\Program Files\OpenVPN\config_to_check\%%~nxA" "D:\Program Files\OpenVPN\config"
    Echo @Start "" "C:\Program Files\OpenVPN\bin\OpenVPN-GUI.exe" --connect %%~nxA
    Echo @Timeout 30 /NoBreak^>Nul 2^>^&1
    Echo @Ping -n 5 www.wikipedia.org^|Find /I "TTL"^>Nul^|^|GoTo search_%%A
    Echo @Rundll32 User32.dll,MessageBeep 0x00000010L
    Echo @Set "num="
    Echo @Set /A num=(%%RANDOM%% %%%% 6^) + 1
    Echo @Start "" "D:\Program Files\Firefox ESR %%num%%\FirefoxPortable.exe"
    Echo @Timeout 60 /NoBreak^>Nul
    Echo/
    Echo :search_%%A
    Echo @TaskList^|Find /I "Firefox.exe"^>Nul^|^|GoTo continue_%%A
    Echo @Timeout 60 /NoBreak^>Nul
    Echo @GoTo search_%%A
    Echo/
    Echo :continue_%%A
    Echo @TaskKill /F /IM OpenVPN.exe 2^>Nul
    Echo @TaskKill /F /IM OpenVPN-GUI.exe 2^>Nul
    Echo @Move /Y "D:\Program Files\OpenVPN\config\%%~nxA" "D:\Program Files\OpenVPN\config_to_check"
    Echo/))>"final.bat"
    Echo @Exit /B>>"D:\Program Files\OpenVPN\final.bat"