Echo添加随机值

问题描述 投票:-1回答:1

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

我需要在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 ::::

我需要一个解决方案,在echo内部的路径中有一个从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"

没有随机函数的代码工作得很好并正确生成输出,我需要在代码中插入一个随机函数,不会将输出生成错误。

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

batch-file random echo
1个回答
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. 启用延迟扩展:(此示例假定在执行Echoing的脚本中尚未启用延迟扩展) 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. 启用延迟扩展:(此示例假定在执行Echoing的脚本中已启用延迟扩展) 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)


[编辑/]

这里有一些代码可以包含您现在发布的其他内容。我已经从上面使用了methd 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"
© www.soinside.com 2019 - 2024. All rights reserved.