Autor
|
Tema: Pedro y su misión. (Leído 4,029 veces)
|
[Arg] $triker;
Desconectado
Mensajes: 380
¿Yo, tóxico?
|
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.
|
|
« Última modificación: 18 Junio 2016, 00:39 am por EagleStrike »
|
En línea
|
|
|
|
tincopasan
Desconectado
Mensajes: 1.286
No es lo mismo conocer el camino que recorrerlo.
|
pues el pobre Pedro debería empezar por acá
|
|
|
En línea
|
|
|
|
[Arg] $triker;
Desconectado
Mensajes: 380
¿Yo, tóxico?
|
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.
|
|
« Última modificación: 18 Junio 2016, 01:23 am por EagleStrike »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
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: PUSHD "C:\Carpeta" & REM Con esta orden asignamos el directorio de trabajo indicado. :: Deposite sus órdenes aquí. POPD & REM Con esta orden regresamos al directorio de trabajo anterior (System32 ).
PD: ¿Era eso lo que querías?. Saludos!.
|
|
« Última modificación: 18 Junio 2016, 02:03 am por Eleкtro »
|
En línea
|
|
|
|
[Arg] $triker;
Desconectado
Mensajes: 380
¿Yo, tóxico?
|
Está bien, perdón. Pensé que así prestarían más atención al problema 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).
|
|
« Última modificación: 18 Junio 2016, 02:09 am por EagleStrike »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
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: (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"
Saludos.
|
|
« Última modificación: 18 Junio 2016, 03:06 am por Eleкtro »
|
En línea
|
|
|
|
[Arg] $triker;
Desconectado
Mensajes: 380
¿Yo, tóxico?
|
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: (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"
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?
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
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: - 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 "Esto es un argumento" "Y esto otro argumento" Pero si no usamos comillas, los argumentos se separan por espacios: 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. @Echo OFF Echo %0 Pause >NUL 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: @Echo OFF call :subrutina "argumento 1" :subrutina Echo %0 Echo %1 Pause >NUL Podemos usar la variable especial con comodín %*, esta variable reune todos los argumentos que le pasemos al script: @Echo OFF call :subrutina arg1 arg2 arg3 arg4 arg5 :subrutina Echo %* Pause >NUL (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 %9SHIFT /?
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: @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 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: @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 @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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Pedro Responde...Preguntale lo que quieras al alma de Pedro
Juegos y Consolas
|
luchodoc
|
7
|
16,794
|
25 Noviembre 2008, 23:00 pm
por Alamasy
|
|
|
Intentando hacer algo similar a "Pedro responde"
.NET (C#, VB.NET, ASP)
|
Argentino Canejo
|
2
|
5,428
|
3 Octubre 2012, 02:41 am
por Argentino Canejo
|
|
|
Pedro Sánchez: "Usted no es una persona decente Sr. Rajoy" (Video)
Foro Libre
|
RevolucionVegana
|
5
|
2,679
|
19 Diciembre 2015, 13:54 pm
por Senior++
|
|
|
Pilar de Borbón, Leo Messi y Pedro Almodóvar mantuvieron sociedades opacas en...
« 1 2 3 »
Foro Libre
|
Scaramanga
|
21
|
9,408
|
14 Abril 2016, 11:40 am
por kniki
|
|
|
Pedro García Aguado, de 'hermano mayor' a 'cazador de trolls' en La Sexta
Noticias
|
wolfbcn
|
1
|
1,506
|
28 Marzo 2017, 19:24 pm
por okik
|
|