Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Случайное значение переменной в цикле (http://forum.oszone.net/showthread.php?t=344848)

patrickfox 15-04-2020 15:31 2917249

Случайное значение переменной в цикле
 
Доброе время суток дорогие форумчане!

Возникла проблема с выводом значения переменной из заданного диапазона, когда пингую определенный ip, переменная R10 не генерируется по указанным правилам (ниже приведен код, буду благодарен если подскажете что поменять):

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set min=1
set max=20

For /L %%i In (1,1,10) Do (
echo Attempt %%i %
call :gen %
ping -n %r10% 127.0.0.1 > nul
)
pause

:gen
set /a r10=%random%%%(%max%-%min%+1)+%min%
exit /b


Iska 15-04-2020 16:08 2917253

Код:

ping -n !r10!
Не?

patrickfox 15-04-2020 17:41 2917269

Iska, так удивительно просто оказалось?) Спасибо, работает! А есть ли информация по этим спец символам где-либо? Так в следующий раз и не соображу какие в какой ситуации применять "%" или "!".

Iska 15-04-2020 20:17 2917293

Скажем так: всё упирается в понятие «оператор»/«инструкция»/«команда» и тот факт, что переменные окружения в %…% раскрываются в момент его исполнения. То есть, %r10% раскрывается однократно в момент начала исполнения конструкции For /L %%i In (1,1,10) Do (…). И, поскольку в этот момент переменной окружения r10 ещё не существует — получается пустое место.

Чтобы переменная окружения раскрывалась тогда, когда происходит исполнение команды ping -n %r10% 127.0.0.1 > nul, требуется задание отложенного раскрытия переменных окружения (setlocal enabledelayedexpansion) и использования символов !…! вместо %…%.

megaloman 15-04-2020 20:56 2917305

Можно без setlocal enabledelayedexpansion
Код:

@Echo Off
cls
        set /A min=1, max=20
        For /L %%i In (1,1,10) Do (
                call :gen
                call echo Attempt %%i n=%%r10%%
                Call ping -n %%r10%% 127.0.0.1 >nul
        )
pause
Exit /B

:gen
        set /a r10=min+(max-min+1)*%random%/32768
exit /b

Код:

@Echo Off
cls
        set /A min=1, max=20
        For /L %%i In (1,1,10) Do call :gen %%i
pause
Exit /B

:gen
        set /a r10=min+(max-min+1)*%random%/32768
        echo Attempt %1  n=%r10%
        ping -n %r10% 127.0.0.1 >nul
exit /b


patrickfox 15-04-2020 23:09 2917325

megaloman, благодарю за предоставление иных подходов!)
Iska, Прошу прощения за оффтоп, в следующий раз уже создам новую тему, но думаю вопрос тоже не будет сильно сложным для понимающих, одним из решений уже обзавелся, если можете подсказать иной способ или дополнить имеющийся буду вновь признателен.
Имеется батник, внутри него прописана команда на создание другого батника (или текстового документа, содержащего команды, которые могут быть исполнены в случае изменения расширения с .txt на .bat), проблема заключается в том, что при простом экранировании символов, читаемость чресчур снижается, и хотелось бы узнать, есть ли способ более изящный? В качестве примера, на просторах интернета нашёл одно решение, но его проблема в том, что после текста, который собираемся скопировать в новый файл, уже не пропишешь новых команд (или я не знаю как их прописать). А после этого текста будут ещё команды, которые не должны быть скопированы. Например два таких скрипта идущих подряд. Надеюсь вы понимаете о чем я. А вот и сам код из сети:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=BigText.txt
more +10 "%~0">"%sFile%"

endlocal
exit /b 0


Создаем большой текст
Весь текст в батнике
Здесь очень много строк
Так можно и спецсимволы :^)
`~!@#$%^&*()_+|\/.,;:'"
Три пустые строки

Последняя строка


megaloman 15-04-2020 23:44 2917327

patrickfox,
ИМХО, это новая тема.
Код:

@Echo Off
cls
        Set "OutFile=Z:\Box_Out\tra la la.txt"

rem Если надо, дописываем батник

        FOR /F "usebackq delims=:" %%i IN (`FINDSTR /I /X /L /N /C:":Gen New File" "%~dpnx0"`) DO Set /A n=%%i
        >"%OutFile%" More +%n% "%~dpnx0"

rem Если надо, дописываем батник
pause
Exit /B

rem Если надо, дописываем процедуры, каждую завершаем Exit /B
rem Текст для записи должен быть последним.


:Gen New File
Создаем большой текст
Весь текст в батнике
Здесь очень много строк
Так можно и спецсимволы :^)
`~!@#$%^&*()_+|\/.,;:'"
Три пустые строки

Последняя строка


Iska 16-04-2020 10:21 2917368

Цитата:

Цитата patrickfox
А вот и сам код из сети: »

Первоисточник, содержащий «код из сети»: CMD/BAT - [решено] Как записать в txt файл большой кусок текста с помощью bat ;).

patrickfox 16-04-2020 12:21 2917412

megaloman, хорошо, создам новую, а то появились дополнительные вопросы уже.

megaloman 16-04-2020 12:24 2917416

patrickfox, а вы спросите в старой, Iska ссылку дал

patrickfox 16-04-2020 14:40 2917459

megaloman, Там, как я понял, не совсем именно то, что нужно, в моем случае необходим многоуровневый файл.


Время: 17:03.

Время: 17:03.
© OSzone.net 2001-