2013-06-06 2 views
0

내가 만드는 일괄 처리에서 중첩 된 변수를 얻으려고합니다. 임의의 변수를 선택하여 X로 바꾸기를 원하지만 이미 선택되어 있다면 다시 돌아가서 다른 숫자를 선택해야합니다. 나는 그것을 에코하려고 할 때 배치에서 중첩 변수를 만드는 방법은 무엇입니까?

set 1=a 
set 2=b 
set 3=c 
set 4=d 
set 5=e 

여기, 변수였다 이제 코드

setlocal enabledelayedexpansion 

:eliminator 
set /a eliminate=(%random * 5)/32767 + 1 
if %%eliminate%%==X goto eliminator 
echo The letter !!eliminate!! was chosen 
timeout 5 
set %%eliminate%%=X 
goto eliminator 

이다는 것은, 그것은 값 대신 변수의 이름을 기록한다. 또한 이미 선택된 변수가 다시 선택됩니다. 이 문제를 해결할 수있는 방법은 없나요? 감사.

답변

2

이 시도 :

@echo off&setlocal 
set "var1=a" 
set "var2=b" 
set "var3=c" 
set "var4=d" 
set "var5=e" 
:loop 
set /a rd=%random%%%5+1 
if defined var%rd% call echo %%var%rd%%% 
set "var%rd%=" 
set "var" >nul 2>&1 && goto:loop 

..output을 (변경 가능) : 귀하의 게시 된 코드는 주위 random 닫는 % 누락

 
d 
a 
c 
b 
e 
+0

고마워요! 내 목적에 맞게 작동하도록 약간의 조정을했습니다 :). – user2459889

1

- 그것은 %random%을 읽어야합니다.

1과 5 사이의 임의의 숫자에 대한 공식은 필요 이상으로 복잡합니다. 당신이

!%eliminate%! 필요

set /a eliminate=%random% %% 5 + 1 

는 "중첩 된 변수를"확장하려면하지만 완전히 알고리즘을 다시 것입니다 : 내가 사용합니다. 나는 다음과 같은 것이 당신이 원하는대로한다고 생각한다 :

@echo off 
setlocal enableDelayedExpansion 
set "chars=abcde" 
set charCnt=5 
:loop 
set /a "pos=%random% %% charCnt, pos2=pos+1, charCnt-=1" 
set "letter=!chars:~%pos%,1!" 
echo The letter %letter% was chosen 
set "chars=!chars:~0,%pos%!!chars:~%pos2%!" 
if defined chars goto loop 

스크립트는 항상 각 반복마다 유효한 미사용 문자를 선택하도록 최적화되어있다.

관련 문제