[BATCH] Script para ver archivos que se ejecutan al inicio

Iniciado por Davidmatias321, 18 Diciembre 2011, 22:17 PM

0 Miembros y 1 Visitante están viendo este tema.

Davidmatias321

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 !!

Eleкtro

#1
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.

 



@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








Davidmatias321

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 !

Eleкtro

#3
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.

Código (dos) [Seleccionar]
@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 /A

Sirve 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:

Código (dos) [Seleccionar]

@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í.

Código (dos) [Seleccionar]
@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:

Código (dos) [Seleccionar]
@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:

Código (dos) [Seleccionar]
@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.








Davidmatias321

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!

Eleкtro

Cita de: Davidmatias321 en 21 Diciembre 2011, 03:27 AM
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


Ese ejemplo que pusiste no, pero más o menos (No se usa sobre comandos, se usa sobre variables):


1er code:
Código (dos) [Seleccionar]

@echo off
Dir "C:\sdshiudhuishdi.exe"
if %errorlevel%==1 (Set Variable=hay un error && echo %Variable%) else (Set Variable=no hay error && echo %Variable%)
pause>nul


2do code:
Código (dos) [Seleccionar]

@echo off
Setlocal enabledelayedexpansion
Dir "C:\sdshiudhuishdi.exe"
if %errorlevel%==1 (Set Variable=hay un error && echo !Variable!) else (Set Variable=no hay error && echo !Variable!)
pause>nul


El primer code no funciona, el segundo si, porque he activado la expansión (Setlocal) y he usado los " ! ".

SETLOCAL /?

        ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION

            Habilita o deshabilita la expansión de variables de entorno
            retardada. Estos argumentos tienen prioridad sobre los
            modificadores CMD /V:ON o /V:OFF. Vea CMD /? para obtener más
            detalles.


Lo siento pero ni yo ni la ayuda del comando saben explicarse mejor xDDD

Saludos.








Davidmatias321

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!

Eleкtro

Cita de: Davidmatias321 en 21 Diciembre 2011, 22:25 PM
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!

El "&" si, el comando con un "&&" solo se ejecuta si el anterior se ha ejecutado correctamente.

Ejemplo:

Código (dos) [Seleccionar]
CD "F:\hhhhhh" && Pause

(El primer comando da error, así que el pause no se ejecuta :P)

Ahora si, creo que ya te ha quedado todo claro xD








Davidmatias321

Excelente !

Cada vez entiendo mas de esto, espero que se venga lo interesante.

Le encontre un error al codigo y es que cuando suponete que agrego una clave y la quiero borrar (estando esta clave en HKCU), como esta no está en HKLM, me tira error que no lo encontro ahi, y luego en la siguiente linea me pone que se borro.

Ahora estoy viendo como implementar un for para cuando el %errorlevel% del primer reg delete sea "1", que borre el resultado de la pantalla "Error, clave no encontrada".

Estaba 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... ahi pense que poniendole skip=1 me saltaria la primer linea (la del error) y seguiria y lo que haga lo mande a un echo>nul para que eso "supuestamente" no salga en pantalla, pero veo que no salio, que decis al respecto?

Eleкtro

#9
No es exactamente un error, lo que andas buscando es esto:
Código (dos) [Seleccionar]
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.