Эхо добавления случайного значения - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть пакетный файл, который создает другой пакетный файл.

Мне нужно добавить в эхо случайную функцию, чтобы иметь числа от 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 голосов
/ 17 февраля 2019

Позвольте мне пройтись по моему комментарию с некоторыми примерами.

Ваш исходный код без необходимости экранировал открывающие скобки и должен был выглядеть примерно так:

    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 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
    
  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)


[Edit /]

Вот некоторый код для включения дополнительных материалов, которые вы сейчас опубликовали.Я использовал метад 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"
...