Hola que tal, estaba haciendo un script en batch para que me muestre los archivos que se ejecutan al inicio de la sesion, y pueda agregar o borrar los existentes, adjunto el codigo y al final digo el problema:
@echo off
:ini
cls
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
echo.
reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
echo.
echo.
echo Borrar clave? (D) Agregar nueva clave? (A) Salir? (S)
set /p asd=
if /i %asd%==D goto borrar
if /i %asd%==A goto agregar
if /i %asd%==S exit
:borrar
echo Ingresar clave que se desea borrar
set /p VAR=
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v %VAR% /f>nul
reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v %VAR% /f>nul
echo Clave "%VAR%" borrada
pause>nul
goto ini
:agregar
echo Indicar nombre de la clave que se desea agregar
set /p mau=
echo Indicar ruta del archivo (recordatorio: barra invertida: alt+92, comillas inicio y fin)
set /p dat=
reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v %mau% /t REG_SZ /d %dat%>nul
echo Clave "%dat%" agregada
pause>nul
cls
goto ini
Mi duda tornaba en que, cuando lo abro me tira lo siguiente:
Citar
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentV
NvCplDaemon REG_SZ RUNDLL32.EXE C:\WINDOWS\system
NvMediaCenter REG_SZ RunDLL32.exe NvMCTray.
nod32kui REG_SZ "C:\Archivos de programa\Eset\
SunJavaUpdateSched REG_SZ "C:\Archivos de progra
ava Update\jusched.exe"
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVe
ctfmon.exe REG_SZ C:\WINDOWS\system32\ctfmon.exe
Borrar clave? (D) Agregar nueva clave? (A) Salir? (S)
Hay alguna forma o en su defecto alguna clave de registro para que me quede todo enterito, onda los archivos en si sin el "! REG.EXE VERSION 3.0..." y su clave (Para que quede todo junto y sea mas facil de detectar los archivos)
Asi me gustaria que quede con la "modificacion":
Citar
Claves disponibles:
NvCplDaemon REG_SZ RUNDLL32.EXE C:\WINDOWS\system
NvMediaCenter REG_SZ RunDLL32.exe NvMCTray.
nod32kui REG_SZ "C:\Archivos de programa\Eset\
SunJavaUpdateSched REG_SZ "C:\Archivos de progra
ava Update\jusched.exe"
ctfmon.exe REG_SZ C:\WINDOWS\system32\ctfmon.exe
Borrar clave? (D) Agregar nueva clave? (A) Salir? (S)
Se me habia ocurrido preguntar si hay alguna clave para sacar de la pantalla las palabras que estorban, pero no encontre. Quizas ustedes me puedan dar la solucion a mi problema. Saludos !!
Cita de: Davidmatias321 en 18 Diciembre 2011, 22:17 PM
Hay alguna forma o en su defecto alguna clave de registro para que me quede todo enterito, onda los archivos en si sin el "! REG.EXE VERSION 3.0..." y su clave (Para que quede todo junto y sea mas facil de detectar los archivos)
Se me habia ocurrido preguntar si hay alguna clave para sacar de la pantalla las palabras que estorban, pero no encontre. Quizas ustedes me puedan dar la solucion a mi problema. Saludos !!
Para eso necesitas crear un FOR y "delimitar" las palabras que no quieres que salgan, etc...
Aqui tienes mi modificación, lo he mejorado bastante para que no puedan suceder errores :rolleyes:.
Modificalo a tu gusto :)
Espero que te sirva... Si no entiendes algo, pregunta!
Un saludo.
EDITO: Aviso para el mod
Leo, no puedo ponerle la etiqueta correcta al code porque se transforman carácteres en código PHP o algo raro, sorry.
(http://img12.imageshack.us/img12/9638/prtscrcapture4t.jpg) (http://img803.imageshack.us/img803/2697/prtscrcapture5.jpg)
@Echo Off
REM By EleKTrO H@cKeR
REM Visita Foro.ElHacker.Net
:INI
Color 0a
Mode con cols=80 lines=60
Title User Run-Key Changer
PUSHD "%WINDIR%\SYSTEM32\"
setlocal enabledelayedexpansion
Set NUM=0
:HKCU
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run | Find "_" >nul
If %ErrorLevel% EQU 0 (
Echo #################################################################
Echo # #
Echo # Claves en: HKCU\Software\Microsoft\Windows\CurrentVersion\Run #
Echo # #
Echo #################################################################
Echo.
For /F "tokens=1,2 delims=_ skip=2" %%a in ('reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run') do (
Set /A NUM+=1
Set name=%%a
Set name=!Name:~-0,-7!
Set name=!Name:~4!
Set keynum!NUM!=!name!
Set path=%%b
Set path=!path:"=!
Set path=!path:~6!
Echo !NUM!^> !name!
Echo !path!
Echo.
)
) ELSE (
Echo #################################################################
Echo # #
Echo # Claves en: HKCU\Software\Microsoft\Windows\CurrentVersion\Run #
Echo # #
Echo #################################################################
Echo.
Echo No hay claves.
Echo.
)
:HKLM
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run | Find "_" >nul
If %ErrorLevel% EQU 0 (
Echo #################################################################
Echo # #
Echo # Claves en: HKLM\Software\Microsoft\Windows\CurrentVersion\Run #
Echo # #
Echo #################################################################
Echo.
For /F "tokens=1,2 delims=_ skip=2" %%a in ('reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run') do (
Set /A NUM+=1
Set name=%%a
Set name=!Name:~-0,-7!
Set name=!Name:~4!
Set keynum!NUM!=!name!
Set path=%%b
Set path=!path:"=!
Set path=!path:~6!
Echo !NUM!^> !name!
Echo !path!
Echo.
)
) ELSE (
Echo #################################################################
Echo # #
Echo # Claves en: HKLM\Software\Microsoft\Windows\CurrentVersion\Run #
Echo # #
Echo #################################################################
Echo.
Echo No hay claves.
Echo.
)
Echo ________________________________________________________________________________
Echo.
REM ########
REM # Menu #
REM ########
:Menu
Set option=
Echo ^>^>^> Borrar clave? (B) ^| Agregar nueva clave? (A) ^| Salir? (S)
set /p option=^>
If /i "%option%" EQU "B" (Goto :Borrar)
If /i "%option%" EQU "A" (Goto :Agregar)
If /i "%option%" EQU "S" (Exit)
Goto :Menu
REM ####################
REM # Borrar una clave #
REM ####################
:Borrar
Set NUM=
Echo+
Echo ^>^>^> Ingresar el numero de la clave que se desea borrar (1) (2) (3)...
set /p NUM=^>
If not defined keynum%NUM% (Goto :Borrar)
Reg Delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "!keynum%NUM%!" /f >nul 2>&1
Reg Delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "!keynum%NUM%!" /f >nul 2>&1
Echo.
Echo Clave "!keynum%NUM%!" Borrada
pause >nul
Goto :Ini
REM #####################
REM # Agregar una clave #
REM #####################
:Agregar
Echo.
Echo ^>^>^> Indicar nombre de la clave que se desea agregar
Set /p NewName=^>
If not defined NewName (Goto :Agregar)
Echo.
Echo ^>^>^> Indicar ruta del archivo (Recordatorio: Barra invertida (\): Alt+92)
Set /p NewPath=^>
If not defined NewPath (Goto :Agregar)
Reg Add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "%NewName:"=%" /t "REG_SZ" /d "%NewPath%" /F >nul
Echo.
Echo Clave "%NewName%" (%NewPath%^) Agregada.
Pause >nul
Goto :Ini
Excelente, gracias por responder, se ve bastante completo...
no entendi estas lineas:
For /F "tokens=1,2 delims=_ skip=2" %%a in ('reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run') do (
Set /A NUM+=1
Set name=%%a
Set name=!Name:~-0,-7!
Set name=!Name:~4!
Set keynum!NUM!=!name!
Set path=%%b
Set path=!path:"=!
Set path=!path:~6!
Echo !NUM!^> !name!
Echo !path!
Echo.
Dudas
1)no entiendo el uso del " ! " y tampoco el ~ como tampoco porque pusiste " Set/a num+=1
2)tampoco entiendo el uso del if defined
3) me explicas vos que significa :
For /F "tokens=1,2 delims=_ skip=2" %%a in ('reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run') do (
4) el pushd y el setlocal para que son?
(a todo esto estuve investigando y las cosas que se me dificultaron entender o ni encontre son estas)
espero que me puedas ayudar gracias igual !
Buf, cuantas preguntas xD
Lo entenderás mejor con ejemplos...
Cita de: Davidmatias321
no entiendo el uso del " ! "
Es para expandir una variable, "
!" es el equivalente a "
%", pero cuando se expande hay que usar "
!".
Cita de: Davidmatias321
tampoco el ~
Sirve para realizar operaciones en las variables, como por ejemplo acortar los caracteres, o reemplazar caracteres.
@echo off
Set variable=abcde
Echo %Variable:~0,3%
REM Lo que he hecho es que solo muestre los 3 primeros caracteres (abc)
pause
Cita de: Davidmatias321
porque pusiste Set/a num+=1
Si te fijas en las imagenes que posteé del code, las entradas de la lista están ordenadas por números no?
Set /ASirve para realizar operaciones matemáticas, en este caso lo que hago es SUMAR. (+=)
Lo único que hago en el code es aumentar el número de tal forma: 0,1,2,3,4,5,6,7,8,9,10...etc. Para que haya un orden en las entradas de la lista.
Además, esa variable también la utilizo para indicar la clave que se desea borrar (En vez de escribir el nombre entero como en tu code original) me pareció más práctico xD.
Cita de: Davidmatias321
tampoco entiendo el uso del if defined
Supongo que sabes usar "
If not exist"... se usa solamente para comprobar archivos verdad?, Pues para que te hagas una idea la función de "
defined" es la misma solo que se usa para comprobar variables, ejemplo:
@echo off
If not defined ELEKTRO (Echo la variable "Elektro" no existe && Pause)
If defined TEMP (Echo la carpeta temporal de tu sistema es %TEMP%)
pause
Cita de: Davidmatias321
pushd
Esto no se explicarlo muy bien xD
Hace lo mismo que el comando "
CD", pero la taréa se agiliza mucho más cuando usas
PUSHD, porque luego puedes usar el comando
POPD para retroceder a la carpeta de trabajo original
Ejemplo:
Supongamos que tienes este
Código.bat en la carpeta
C:\Windows\system32, y ejecutas el archivo desde allí.
@echo off
PUSHD "C:\program files\"
echo Estoy trabajando en "%CD%"
pause
POPD
echo Ahora stoy trabajando en "%CD%"
Pause
PD: Por cierto, aunque parezca una tontería, en el code que te modifiqué resulta necesario trabajar desde "
C:\windows\system32\" debido a la expansión, sino, daba error porque no encontraba el programa "
Reg.exe" ni el "
Mode.com", Por eso lo usé, Aunque podría haber puesto "
CD %WINDIR%\system32" xD jeje.
Cita de: Davidmatias321
el setlocal para que son?
Setlocal se puede usar de varias maneras, en este caso "
Setlocal enabledelayedexpansion" sirve para habilitar la expansión de variable y poder usar el signo "
!" en las variables.
A veces resulta necesario hacer esto para que un code funcione, por ejemplo cuando creas una variable dentro de un
FOR, y quieres usar esa variable sin salir del
FOR, sin salir me refiero a esto:
@echo off
For /F "tokens=*" %%a in ('Dir /B "*"') do (
Set archivo=%%a
Echo %Archivo%
)
pause
Ese code no funciona, porque no se ha expandido la variable "
Archivo".
Aunque por otro lado, SIEMPRE se puede evitar la expansión (
Set local enabledelayedexpansion) haciendo
CALLS, pero eso es liar bastante el código, no me parece una buena costumbre hacer calls para algo básico, bueno te pongo un ejemplo:
@echo off
For /F "tokens=*" %%a in ('Dir /B "*"') do (
Set archivo=%%a
Call :func
)
Pause
:func
Echo %Archivo%
Goto :eof
Conviene no usar
setlocal enabledelayedexpansion si en tu code trabajas con archivos que tengan caracteres especiales en el nombre como "
!" ya que con el setlocal habilitado... no se leerán bien. Así que si tienes que engorronar el code con "Calls", mejor hacerlo, se evitaran muchos errores, de echo debí haberlo echo :/.
Cita de: Davidmatias321
For /F "tokens=1,2 delims=_ skip=2" %%a in ('reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run') do (
Los
tokens es la cantidad de cadenas, partes, Strings, o como quieras llamarlo en las que quiero que se separen los datos, en este caso quiero que se separe en 2 partes (1,2), una contiene el nombre de la clave (%%a) y el otro token contiene la ruta de la clave (%%b)
Delims son los caracteres para delimitar las cadenas, osea, Despues de indicar los tokens, hay que indicar el patrón por donde se deben partir esas partes, y yo le indiqué que corte las partes en 2 trozos (Tokens) separandolas desde el signo "
_". A ver si así lo entiendes:
Esto es el token 1 Y esto el token 2
ctfmon.exe REG _SZ C:\WINDOWS\system32\ctfmon.exe
Y luego con los comandos de operaciones en las variables que te expliqué al principio, se hace el resto :).
Skip son las lineas que se deben saltar de los datos obtenidos...
Me explico, si los datos fuesen estos:
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVe
ctfmon.exe REG_SZ C:\WINDOWS\system32\ctfmon.exe
Esto es lo que haria ese
FOR si pusieramos "
Skip=4":
Linea 1: ! REG.EXE VERSION 3.0
Linea 2:
Linea 3: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVe
Linea 4:
Linea 5: (EN ESTA LINEA EMPIEZA A TRABAJAR EL FOR, crear los tokens, separarlos, mostrarlos, etc...)ctfmon.exe REG_SZ C:\WINDOWS\system32\ctfmon.exe
Bueno, menuda parrafada me he escrito xDDDDDDDDDDDD
Si no te lo lees todo, lo entenderé xDDD
Venga, a ver si aprendes un poco con algo de lo que he dicho :)
Saludos.
Sarpadooo... aprendi bastante!
Que genio que sos man, gracias por eso. Pero si no te jode seguramente me podes aclarar la duda del reverendo " ! "
No entendi la explicacion de expandir.
Vos te referis a cuando tengo que meter mas de una linea por ejemplo
if %errorlevel%==1 goto (
echo !Error detectado!
)
else (echo !No hay error!)
pause>nul
(Disculpa si lo hice mal, nomas que recien entro a hacer programacion avanzada de batch, hasta el momento ando con boludeces nomas jaja ahora espero que se venga lo interesante)
Espero que me puedas despejar la duda gracias maestro!
Ya esta, entendi. gracias.
Me imagino que el && y el & son para poner mas de una instruccion en una linea o no?
suerte y muchisimas gracias!
No es exactamente un error, lo que andas buscando es esto:
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v %VAR% /f >nul 2>&1
Usalo así, sin bucles ni nada.
Como ves, es muy sencilla la solución... Solo había que ocultar la salida del "error"... Eso podrías haberlo aprendido en un manual básico (Es una sugerencia):P
CitarEstaba pensando en esto pero no funciona:
echo Ingresar clave que se desea borrar
set /p VAR=>nul
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v %VAR% /f>nul
if %errorlevel%==1 (
for /f "skip=1" %%G in ('reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run') do (echo>nul)
)
Pero me lo tira igual, me sigo fijando...
Esa comprobación de errores no te habría servido nunca, porque primero estás ejecutando el comando del reg delete, así que el error te lo va a mostrar hagas lo que hagas. y luego lo estás volviendo a ejecutar xD
Saludos.