Это мой первый ответ здесь, так что посмотрим, как он пойдет.
Я провел некоторые исследования и не нашел ничего специально для перетасовки входных данных в команду for, но обнаружил, что вы можете сохранить свои входные данные в пакетном массиве и сделать некоторую перестановку с этим. Однако это означает, что для команды не используется .
Вот код, который я использовал для создания перемешанного массива:
@echo off
setlocal enabledelayedexpansion
set inputVars[0]=1
set inputVars[1]=2
set inputVars[2]=3
set inputVars[3]=4
set inputVars[4]=5
set /A inputsLength=0
:lengthLoop
if defined inputVars[%inputsLength%] (
set /A inputsLength+=1
goto :lengthLoop
)
set /A currentIndex=0
:loop
set /A randIndex=%RANDOM% %%%inputsLength%
set temp=!inputVars[%currentIndex%]!
set inputVars[%currentIndex%]=!inputVars[%randIndex%]!
set inputVars[%randIndex%]=%temp%
set /A currentIndex+=1
if currentIndex LSS %inputsLength% (
goto :loop
)
set /A currentIndex=0
:outputLoop
if defined inputVars[%currentIndex%] (
echo !inputVars[%currentIndex%]!
set /A currentIndex+=1
goto :outputLoop
)
endlocal
Первый бит кода после инициализации массива находит длину массива для удобства. Длина может показаться очевидной, но я не уверен, как именно вы будете получать свои входные данные или заполнять массив, поэтому я продолжил и добавил его.
set /A inputsLength=0
:lengthLoop
if defined inputVars[%inputsLength%] (
set /A inputsLength+=1
goto :lengthLoop
)
Второй бит фактически выполняет перетасовку, используя% RANDOM%. Я использовал этот вопрос в качестве ссылки для этого.
set /A currentIndex=0
:loop
set /A randIndex=%RANDOM% %%%inputsLength%
set temp=!inputVars[%currentIndex%]!
set inputVars[%currentIndex%]=!inputVars[%randIndex%]!
set inputVars[%randIndex%]=%temp%
set /A currentIndex+=1
if currentIndex LSS %inputsLength% (
goto :loop
)
Последний бит кода фактически выполняет итерации по массиву, поэтому для выполнения этой операции команда for была заменена .
set /A currentIndex=0
:outputLoop
if defined inputVars[%currentIndex%] (
echo !inputVars[%currentIndex%]!
set /A currentIndex+=1
goto :outputLoop
)
Надеюсь, это помогло или, по крайней мере, заставило вас задуматься о возможных способах реализации того, что вы задумали.