Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: [Arg] $triker; en 17 Junio 2016, 20:03 pm



Título: Pedro y su misión.
Publicado por: [Arg] $triker; en 17 Junio 2016, 20:03 pm
Tengo un archivo batch llamado pedro.cmd
Pedro tiene que ejecutarse con Windows y ejecutar un archivo de texto que está en la misma carpeta, llamado pedrodisplay.txt
Pedro sólo puede usar variables para saber su ubicación en el equipo y por lo tanto agregar su entrada al registro con esa ubicación.

Pedro ya hizo gran parte de su misión, pero necesita ayuda.
Él ejecuta el archivo pedrodisplay.txt, pero al mismo tiempo tiene como ubicación actual (cd) el directorio desde el cual se lanzó la entrada del registro, la cual no es la ubicación que consiguió antes (cuando fue ejecutado por primera vez). Entonces Pedro no puede encontrar pedrodisplay.txt por no estar en su directorio actual, y no puede conseguir dónde está por que las variables de las que dispone no se lo permiten.

Sean amables. Ayuden al pobre Pedro.


Título: Re: Pedro y su misión.
Publicado por: tincopasan en 17 Junio 2016, 22:52 pm
pues el pobre Pedro debería empezar por acá (http://foro.elhacker.net/scripting/tutoriales_batch_y_bash_basicos_empieza_desde_0-t454010.0.html)


Título: Re: Pedro y su misión.
Publicado por: [Arg] $triker; en 18 Junio 2016, 00:31 am
Pueden hacer mejor que eso.

Actualizo: Al ejecutarse la entrada de Pedro en Run, se ejecuta desde System32. Sólo tiene que volver hasta su carpeta original.


Título: Re: Pedro y su misión.
Publicado por: Eleкtro en 18 Junio 2016, 01:54 am
Lo único que he entendido:
La primera vez que inicias el archivo.bat, el archivo.txt se encuentra en el mismo directorio de trabajo. Bien, todo perfecto. Luego no se que ocurre con Pedro y El Lobo, que cuando intentas volver a iniciar el archivo.bat, el archivo.txt está en otro lugar desconocido, como en otra dimensión, ¿pero quien lo ha movido hasta allá y por qué?. No me entero de nada.

De todas formas, si "archivo.txt" se encuentra en un directorio el cual conoces su ruta, entonces no me queda muy claro cual es el problema que encuentras para hallar esa ruta, suponiendo que ese sea el problema por que como ya digo no me he enterado. Da más detalles por favor, pero sin personajes inventados ...te lo pido xD, proporciona datos reales con los que poder ayudarte, empezando por la ubicación de esas rutas, los datos que le asignaste al valor de la clave de registro, y lo que pretendes conseguir. Información.

Actualizo: Al ejecutarse la entrada de Pedro en Run, se ejecuta desde System32. Sólo tiene que volver hasta su carpeta original.

Efectivamente. La CMD.exe se encuentra en el directorio del sistema, X:\Windows\System32, por ende, cuando ejecutas la CMD desde la entrada Run/RunOnce, ese es su directorio de trabajo inicial.

Si lo que pretendes es modificar el directorio de trabajo, entonces puedes utilizar el comando PUSHD:

Código
  1. @Echo OFF
  2. PUSHD "C:\Carpeta" & REM Con esta orden asignamos el directorio de trabajo indicado.
  3.    :: Deposite sus órdenes aquí.
  4. POPD & REM Con esta orden regresamos al directorio de trabajo anterior (System32).
  5. Pause&Exit /B 0

PD: ¿Era eso lo que querías?.

Saludos!.


Título: Re: Pedro y su misión.
Publicado por: [Arg] $triker; en 18 Junio 2016, 02:08 am
Está bien, perdón. Pensé que así prestarían más atención al problema :xD

El entorno es el siguiente:
Hay una carpeta a la que vamos a llamar X, porque podría ser cualquiera y no sé cuál es. A ella sólo se puede acceder mediante variables como %cd%.
En esa carpeta están:
-pedro.cmd
-pedrodisplay.cmd
pedro.cmd agrega una entrada de registro a Run con un enlace hacia sí mismo en la carpeta X (%cd%\pedro.cmd) y a la vez crea un valor de variable de entorno (SETX) cuyo nombre es "recover" y le pone el valor 1. Entonces reinicia la computadora.
Al reiniciarse Windows, lo que debería pasar es que pedro.cmd vería que el valor de la variable de entorno "recover" es 1, lo que indicaría que tiene que ejecutar el archivo de texto. Pero entonces entra el problema: Cuando se inicia al inicio de Windows, el CD es System32 y no la carpeta X. Y entonces se introduce el comando "start pedrodisplay.txt". Pero como CD está en System32, no lo encuentra, ya que pedrodisplay.txt está en la carpeta X. Entonces lo que intenté hacer es devolverlo a la carpeta X, pero no tuve manera de hacerlo porque CD está en System32.

De todas maneras, ya rodeé el problema (no le encontré solución pero sí una alternativa más compleja).


Título: Re: Pedro y su misión.
Publicado por: Eleкtro en 18 Junio 2016, 03:02 am
Entonces, cuando añades el valor de registro con los datos "%cd%\pedro.cmd", la variable dinámica "%CD%" se expande a "C:\Windows\System32", en lugar de expandirse al directorio desde donde se iniciío "pedro.cmd"?.

Para solucionar el problema, simplemente debes reemplazar el uso de la variable dinámica "%CD%", por la variable de argumento "%0" (utilizando el modificador de variable correspondiente), la cual apunta hacia la ruta del script en ejecución.

Ejemplo:
Código
  1. @Echo OFF
  2. (REG.exe ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /V "Título" /T "REG_SZ" /D "\"%~f0\"" /F) & REM "%~f0" = "C:\Ruta absoluta\pedro.cmd"
  3. Pause&Exit

Saludos.


Título: Re: Pedro y su misión.
Publicado por: [Arg] $triker; en 18 Junio 2016, 03:42 am
Entonces, cuando añades el valor de registro con los datos "%cd%\pedro.cmd", la variable dinámica "%CD%" se expande a "C:\Windows\System32", en lugar de expandirse al directorio desde donde se iniciío "pedro.cmd"?.

Exacto.

Para solucionar el problema, simplemente debes reemplazar el uso de la variable dinámica "%CD%", por la variable de argumento "%0" (utilizando el modificador de variable correspondiente), la cual apunta hacia la ruta del script en ejecución.

Ejemplo:
Código
  1. @Echo OFF
  2. (REG.exe ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /V "Título" /T "REG_SZ" /D "\"%~f0\"" /F) & REM "%~f0" = "C:\Ruta absoluta\pedro.cmd"
  3. Pause&Exit

Saludos.

Gracias, ya lo solucioné.

De paso, te quería preguntar, esas "variables raras" como "%0" y esas, ¿qué son? ¿Se pueden usar como cualquier otra variable? ¿Hay una lista de expresiones de ese tipo?


Título: Re: Pedro y su misión.
Publicado por: Eleкtro en 18 Junio 2016, 05:28 am
De paso, te quería preguntar, esas "variables raras" como "%0" y esas, ¿qué son? ¿Se pueden usar como cualquier otra variable? ¿Hay una lista de expresiones de ese tipo?

En mi tutorial puedes encontrar esta info:

Cita de: http://foro.elhacker.net/scripting/tema_bloqueado_hasta_finalizar_el_tuto_tutorial_extendido_de_aprendizaje_batch-t375135.0.html;msg1797955#msg1797955
  • 6.1 Variables especiales (o Variables de parámetro) (o Variables de argumentos)


Las variables especiales son un tipo de variables predefinidas que pueden cambiar su valor constantemente,
Estas son todas las variables especiales:

%0  %1  %2   %3  %4  %5  %6  %7  %8  %9   %*

En ellas se guarda el orden de los argumentos que le pasemos a nuestro script.

Un argumento es una cadena de caracteres delimitados por un espacio o por comillas dobles, esto quiere decir que una cadena encerrada entre comillas cuenta como un argumento
Código:
"Esto es un argumento"    "Y esto otro argumento"

Pero si no usamos comillas, los argumentos se separan por espacios:
Código:
Esto son cuatro argumentos
1       2     3         4

La variable %0 no la consideraremos realmente un argumento, porque en ella se guarda la ruta de nuestro script.
Código:
@Echo OFF
Echo %0
Pause >NUL

(http://img802.imageshack.us/img802/6132/captura2wd.png)

Si usamos una subrutina, el argumento %0 pasa a ser el nombre de la etiqueta de la subrutina, y será el siguiente número de variable (%1) el que realmente empezará a guardar el primer argumento que le pasemos:
Código:
@Echo OFF
call :subrutina "argumento 1"
:subrutina
Echo %0
Echo %1
Pause >NUL

(http://img32.imageshack.us/img32/3329/captura3r.png)

Podemos usar la variable especial con comodín %*, esta variable reune todos los argumentos que le pasemos al script:

Código:
@Echo OFF
call :subrutina arg1 arg2 arg3 arg4 arg5
:subrutina
Echo %*
Pause >NUL

(http://img690.imageshack.us/img690/4411/captura2iy.png)
(El argumento 0 se omite)



Habeis visto que solo existen 10 variables especiales con números, pero descontando la variable %0, nos quedan 9 variables, ¿que pasa si necesitamos usar más de 9 argumentos... si por ejemplo necesitamos usar el arhumento 10?

Bien, pues el valor de las variables especiales se puede desplazar hacia la izquierda son el comando SHIFT, consiguiendo que el valor que había por ejemplo en la variable %3 pase a la variable %2, y el valor de la imaginaria variable %10 pase a la variable %9, entonces ya podremos usar nuestro 10º argumento en la variable %9

Cita de: CMD
Código:
SHIFT /?

Cambia la posición de parámetros reemplazables

SHIFT [/n]

Si las extensiones de comando están habilitadas,
el comando SHIFT admitirá el modificador /n,
el cual informa al comando que empiece a cambiar en el argumento n, en donde n puede estar comprendido entre 0 y 8.

Por ejemplo:
    SHIFT /2

cambiará %3 a %2, %4 a %3, etc. y deja %0 y %1 sin modificar.

Ejemplo:
Código:
@Echo OFF
call :subrutina a b c d e

:subrutina
Echo Antes del "Left Shift":
Echo arg1 = %1
Echo arg2 = %2
Echo arg3 = %3
Echo arg4 = %4
Echo arg5 = %5

Echo+
SHIFT /1

Echo Despues del "Left Shift":
Echo arg1 = %1
Echo arg2 = %2
Echo arg3 = %3
Echo arg4 = %4
Echo arg5 = %5

Pause >NUL

(http://img853.imageshack.us/img853/4109/captura2em.png)


NOTA: El comando SHIFT no afecta a la variable especial %*, esta variable no se puede desplazar.





  • Expansión de variables especiales (o Argumentos) y de variables de FOR

La gran ventaja de las variables especiales y variables de FOR es que pueden ser expandidas para mostrar únicamente los datos que nos interesen, como por ejemplo, el tamaño del argumento, la extensión del archivo, la fecha de modificación, etc.

Esto se realiza usando el operador ~ seguido de uno de los siguientes caracteres (los caracteres se pueden combinar).


 %~0         - expande %0 quitando las comillas (") que pudiera haber
 %~f0        - expande %0 a un nombre de ruta completo
 %~d0        - expande %0 solo a una letra de unidad
 %~p0        - expande %0 solo a una ruta
 %~n0        - expande %0 solo a un nombre de archivo
 %~x0        - expande %0 solo a una extension de archivo
 %~s0        - ruta expandida contiene solo nombres cortos
 %~a0        - expande %0 a atributos de archivos
 %~t0        - expande %0 a fecha/hora del archivo
 %~z0        - expande %0 a tamaño del archivo
 %~$PATH:0   - busca los directorios de la lista de la variable de entorno de PATH y expande %0 al nombre del primero que se encuentre.


Ejemplo:
Código:
@Echo OFF

Echo Argumento con comillas:
Echo %0
Echo.
Echo Argumento sin comillas:
Echo %~0
Echo.
Echo Ruta completa del argumento:
Echo %~f0
Echo.
Echo Letra de unidad del argumento:
Echo %~d0
Echo.
Echo Ruta del argumento:
Echo %~p0
Echo.
Echo nombre del argumento:
Echo %~n0
Echo.
Echo Extension del argumento:
Echo %~x0
Echo.
Echo Ruta de nombre corto del argumento:
Echo %~s0
Echo.
Echo Atributos del argumento:
Echo %~a0
Echo.
Echo Fecha/Hora dle argumento:
Echo %~t0
Echo.
Echo Tamanyo del argumento:
Echo %~z0

Pause >NUL

(http://img687.imageshack.us/img687/9796/captura3fw.png)


Código:
@Echo OFF

FOR %%a in (*) DO (

     Echo Ruta:      %%~fa
     Echo Letra:     %%~da
     Echo Carpeta:   %%~pa
     Echo Nombre:    %%~na
     Echo Extension: %%~xa
     Echo Atributos: %%~aa
     Echo Fecha/H.:  %%~ta
     Echo Tamanyo:   %%~za
     Echo+

)

Pause >NUL

(http://img443.imageshack.us/img443/3202/captura4e.png)