我有一个可以创建另一个批处理文件的批处理文件。
我需要在回声中添加一个随机函数,使数字从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"
没有随机函数的代码可以很好地工作并正确生成输出,我需要在代码内插入一个随机函数,该函数不会使输出生成出错。
随机函数需要为每个循环计算一个新的随机数
答案 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
块中使用它,可以通过多种方式来解决此问题:
使用伪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
启用延迟扩展:(此示例假设在执行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
启用延迟扩展:(此示例假定在执行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
重构代码,以免出现不必要的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"