Hace algo de tiempo que estoy haciendo pruebas e intentando hacer un trozo de codigo que vaya cambiando al programa de carpeta de manera aleatoria. Otros objetivos del codigo son contener la ruta de la carpeta en una clave del registro y que no necesite mas de una sola ventana para funcionar correctamente. Al principio el codigo funciona bien, si no existe la clave del registro la crea con su ruta y vuelve a empezar, y si existe y la ruta que contiene la clave es la misma en la que esta el programa, se copia a una carpeta aleatoria y ejecuta la copia. Si la ruta de la clave es diferente a la del programa, el programa elimina la carpeta de la anterior copia (Cuya ruta esta en la clave) y vuelve a empezar. El problema esta que al volver a empezar despues de haber borrado la anterior copia, el comando REG QUERY deniega el acceso y el programa no puede leer la clave del registro. Habia pensado en usar el comando runas en lugar de un GOTO en el momento de volver a empezar el programa, pero eso implicaria abrir otra ventana. Pongo el codigo abajo, probablemente tenga mas fallos que el que ya nombre. Espero que alguien pueda ayudarme, muchas gracias de antemano.
@ECHO OFF
SetLocal EnableDelayedExpansion
:SeteandoVariables
SET ClaveDelRegistro=HKLM\SOFTWARE
SET ValorDelRegistro=CD
SET MELT=1
SET NAME=
:ModificandoClaveDelRegistro
REG QUERY "%ClaveDelRegistro%" /v "%ValorDelRegistro%">temp
FOR /F "tokens=3*" %%A IN ('findstr REG_SZ "temp"') DO (IF "%%B" NEQ "" SET B= %%B
SET RutaAntigua=%%A!B!)
REG ADD "%ClaveDelRegistro%" /v "%ValorDelRegistro%" /f /d "%~dp0
IF "%RutaAntigua%"=="" (GOTO SeteandoVariables)
IF "%RutaAntigua%" NEQ "%~dp0" (SET MELT=0)
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 ATTRIB -H -S "%RutaAntigua:~0,-1%" /S /D
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 CD "%RutaAntigua%"
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 FOR /R %%A IN (*.*) DO (DEL /P "%%A")
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 cd ..
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 rd /S "%RutaAntigua%"
:EligiendoCarpeta
CD /D %HOMEDRIVE%\
SET /A MAX=%RANDOM% %% 4000 + 1000
FOR /D /R %%A IN (*) DO (SET Carpeta=%%A
SET /A NUM=!RANDOM! %% %MAX% + 1
IF !NUM!==1 (GOTO ComprobandoErrorN1))
:ComprobandoErrorN1
echo %Carpeta%
IF %ERRORLEVEL% NEQ 0 (GOTO EligiendoCarpeta)
IF "%CARPETA%" NEQ "%CARPETA:)=%" (GOTO EligiendoCarpeta)
:GenerandoNombre
SET /A CHARNUM=%RANDOM% %% 25 + 1
SET CONT=0
FOR /L %%A IN (1,1,%CHARNUM%) DO (
SET /A CHAR=!RANDOM! %% 51
FOR %%B IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 ! @ # $ ~ ( = [ ] { } . , ; ' - _ +) DO (
SET /A CONT=!CONT!+1
IF !CHAR!==!CONT! SET CHAR=%%B
)
IF !CHAR!==0 (SET CHAR= )
SET NAME=!NAME!!CHAR!
SET CONT=0
)
:Informando
echo %NAME%
echo %MELT%
:ComprobandoMelt
IF %MELT%==0 (echo NO MELT THIS TIME)
IF %MELT%==0 (GOTO SeteandoVariables)
:CreandoCarpeta
cd "%Carpeta%"
md "%NAME%"
ATTRIB +H +S "%NAME%"
cd "%NAME%"
:Copiando
copy "%~f0" "CD.bat"
pause
:AbriendoCopia
"%Carpeta%\%NAME%\CD.bat"