Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DA KILLER

#1
Pues creo que si lees el tutorial de sirdarkcat sabrás como hacer eso y mucho más...

http://foro.elhacker.net/scripting/programacion_batch_avanzada_nuevo-t132924.0.html

Fíjate sobre todo en los puntos primero, quinto y octavo.

CITO:

Variables y Argumentos:

Citar
Código (dos) [Seleccionar]

       %~f1        - regresa la ruta y el archivo de %1.
       %~d1        - regresa la letra de la unidad de %1.
       %~p1        - regresa solo la ruta del archivo %1.
       %~n1        - regresa solo el nombre de archivo %1.
       %~x1        - regresa solo la extension del archivo %1.
       %~s1        - regresa solo la ruta, con directorios, con nombres cortos del archivo %1.
       %~a1        - regresa los atributos del archivo.
       %~t1        - regresa la hora/fecha del archivo %1
       %~z1        - regresa el tamaño del archivo %1.


FOR:

CitarFOR es una herramienta muy completa, nos permite analizar segmentos de la salida de comandos, funciones y el contenido de archivos.

Tambien permite hacer bucles de la siguiente manera:

Código (dos) [Seleccionar]
FOR /L %%var IN (inicio,incremento,fin) DO (acciones)

inicio, es el valor inicial, incremento es la cantidad a sumar, y fin es la cantidad a detenerse, por ejemplo:

Código (dos) [Seleccionar]
FOR /L %%i IN (0,1,10) DO (echo %%i)
imprimira 0 1 2 3 4 5 6 7 8 9 10

sinembargo, la forma mas sencilla de usar FOR, es para numerar archivos, y hacer algo con ellos.. por ejemplo:

Código (dos) [Seleccionar]
FOR %%x in (x*) DO echo %%x
mostrará todos los archivos que empiezan con x.

para SOLO mostrar directorios:
FOR /D %%x in (m*) DO echo %%x
el modificador "/D", mostrará solo los directorios, que empiesen con m.

El comando se puede hacer "recursivo", es decir, que se ejecute  dentro de cada directorio, con el comando "/R", por ejemplo, en una estructura de directorios como la siguiente:


├───adios
│   └───algo
│       └───xx
└───hola


al ejecutar el comando:
Código (dos) [Seleccionar]
FOR /R /D %%x in (a*) DO echo %%x
C:\adios
C:\adios\algo


sinembargo, al ejecutar el comando..
Código (dos) [Seleccionar]
FOR /R %%x in (*x*) DO echo %%x
C:\ax.txt
C:\adios\sx.txt
C:\adios\wwx.txt
C:\adios\algo\kkx.txt
C:\adios\algo\xx\xx.txt
C:\hola\ax.txt
C:\hola\rx.txt


nos mostrara todos los archivos que coinciden con la sequencia especificada, incluso podriamos hacer un buscador en batch, con el uso de FINDSTR y FOR.

Tenemos otro modificador, /F que nos permite usar ciertas opciones para separar el resulado de las acciones.. comandos, cadenas, o archivos. Su sintaxis es la siguiente:

Código (dos) [Seleccionar]
FOR /F ["opciones"] %var IN (conjunto) DO (acciones)

conjunto puede ser:
conjunto de archivos -> sin comillas
cadena de caracteres -> con comillas dobles (" ")
comando -> con comilla simple (' ')

las opciones son las siguientes:
eol -> todo lo que este despues de este caracter sera ignorado (para cada linea)
skip -> numero de lineas a saltarse al principio del archivo/comando.
delims -> esto sirve para separar las strings.. si no se coloca esta opcion, se usaran como separadores "espacio" y "tab"
tokens -> esto es para especificar cuales segementos, delimitados por "delims", seran pasados a las variables.. por ejemplo:
1,2,3
solo pasara los primeros 3 segmentos.
1,2*
pasara 2 segmentos, el primero y todo lo que este despues (el * regresa todo el resto de la linea)
1,2-6,8,9*
regresara 4 segmentos, el primero, desde el segundo hasta el sexto, el octavo y el resto de la linea, despues del noveno, el signo de menos (-) genera intervalos.

por ultimo, esta la opcion:
usebackq -> que cambia la forma de interpretar si es string o comando, de la siguiente manera:
'cadena'
`comando`

Nota: [`] es diferente al caracter de acento [´]

por ejemplo, el siguiente comando:

Código (dos) [Seleccionar]
FOR /F "tokens=1,3-5,7-9,10* delims= " %%i IN ("George no es malvado, es bondadoso, siempre piensa en los demas.") DO echo %%i %%j %%k %%l tonto, %%m %%n %%o matar a %%p %%q

dara de resultado:
Código (dos) [Seleccionar]
George es malvado, es tonto, siempre piensa en matar a los demas.

FOR es un comando INCREÍBLEMENTE COMPLETO, y FINDSTR es el otro comando que te ayudará mucho, (recuerda que también puedes emplear FIND como filtro ;) ).



Finalmente FINDSTR está en el punto 8:

Citar
  • FINDSTR
extension de FIND, acepta expresiones regulares, y busqueda general (lo mas parecido que DOS tiene a grep), descripción detallada:

Busca cadenas en los archivos.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
[/F:archivo]
   [/C:cadena] [/G:archivo] [/D:lista de directorios] [/A:atributos de color]
   [cadenas] [[unidad:][ruta]nombredearchivo[ ...]]

  /B        Hace coincidir los modelos si están al principio de la línea.
  /E        Hace coincidir los modelos si están al final de la línea.
  /L        Literalmente utiliza cadenas de búsqueda.
  /R        Utiliza cadenas sde búsqueda como expresiones regulares.
  /S        Busca archivos que coinciden en el directorio actual y en todos
            los subdirectorios.
  /I        Especifica que la búsqueda no distingue mayúsculas de minúsculas.
  /X        Imprime líneas que coinciden con exactitud.
  /V        Sólo imprime líneas que no contienen una correspondencia.
  /N        Imprime el número de la línea antes de la línea que coincide.
  /M        Sólo imprime el nombre de archivo si el archivo contiene una
            correspondencia.
  /O        Imprime un carácter de desplazamiento antes de las líneas que
            coinciden.
  /P        Omite archivos con caracteres que no son imprimibles
  /A:attr   Especifica atributos de color con dos dígitos hexadecimales. Ver
            "color /?"
  /F:archivo  Lee la lista de archivos desde el archivo especificado
            (/ significa consola).
  /C:cadena   Utiliza una cadena especificada como una búsqueda de cadena
            literal.
  /G:archivo  Coje la búsqueda de archivos desde el archivo especificado
            (/ significa consola).
  /D:dir    Busca un signo de punto y coma de la lista delimitada de
            directorios
  cadenas   Texto que se debe buscar.
  [unidad:][ruta]nombredearchivo
            Especifica un archivo o  archivos que buscar.

Utiliza espacios para separar múltiples cadenas de búsqueda a no ser que
el argumento lleve un prefijo con /C.  Por ejemplo, 'FINDSTR "qué tal" x.y'
busca "qué" o "tal" en el archivo x.y.  'FINDSTR /C:"qué tal" x.y' busca
"qué tal" en el archivo x.y.

Expresión regular de referencia rápida:
  .        Comodín: cualquier carácter
  *        Repetir: cero o más ocurrencias de un carácter previo o de clase
  ^        Posición de línea: comienzo de la línea
  $        Posición de línea: fin de línea
  [clase]  Clase de carácter: cualquier carácter en la serie
  [^class] Clase inversa: cualquier carácter que no esté en la serie
  [x-y]    Intervalo: cualquier carácter que esté dentro del intervalo
           especificado
  \x       Escape: uso literal de un metacarácter x
  \<xyz    Posición de palabra: principio de palabra
  xyz\>    Posición de palabra: fin de palabra

Para obtener una información más completa sobre expresiones regulares de
FINDSTR referirse al Comando de referencia Command en línea.



Con ello deberías poder crear un script que almacene en un archivo las fechas de modificación de los archivos, así como su tamaño, si varían ambas variables lo reenvía.

Busca información sobre el comando AT para programar cada cuanto re-analiza los archivos, 24 hs, 72 hs., una semana, cada mes, lo que te sea más conveniente. También puedes gracias a %~z hacer una comparación lógica, si es mayor a X tamaño no actualizar, posponer por X tiempo, o bien dejar un aviso en otro archivo, el cual revises periódicamente.

En fin espero te sirva, saludos y suerte ;)
#2
Saludos gente, en un script quiero enviar un fichero de texto plano al puerto COM1, pero al estar inhabilitado el programa sólo repite como loro:

"El sistema no puede escribir en el dispositivo especificado."

Ya sé que es lógico que falle si el puerto no tiene conexión, pero lo que quiero es que si falla me devuelva un código de error a los "X" intentos fallidos.

Lo que hice fue:

Código (bash) [Seleccionar]

[...]
TYPE %FILE%.TXT > COM1 && Exit /B 0 || TYPE %FILE%.TXT > COM2 && Exit /B 0
[...]


Sé que la sintaxis está bien porque si cambio los comandos intenta ejecutar la primer instrucción, si es exitosa ejecuta la segunda, si falla en cualquiera de ellas pasa al OR ("||") intenta con la tercer instrucción y si es exitosa ejecuta la cuarta.

EDITO: Agrego que intenté con "if %errorlevel% NEQ 0" y tampoco funcionó :/

Otra cosa que ví hace mucho tiempo era la de redirigir la salida de los errores a otro destino, si no me equivoco era:

Código (bash) [Seleccionar]

COOMANDO | FILTRO >nul 2>&1


Si bien sé que es para que no se vean los códigos de error no entiendo que es "2" y "&1", si me pueden decir bajo que palabras clave buscar más información sobre el tema se los voy a agradecer.

Saludos y desde ya, muchas gracias.

EDITO 2:

Bueno, intenté modificar un poco la línea y la sintaxis es correcta sin lugar a dudas, lo que falla es la conexión con el puerto COM ya que la siguiente línea:

Código (dos) [Seleccionar]
TYPE *.TXT > TEST.TXT && Exit /B 0 || TYPE *.TXT > CON && Exit /B 0

Funciona perfectamente... y si trato de escribir sobre "COM" obtengo el mismo resultado que si quisiese redirigir a "NULL"  :¬¬

En fin lo que quiero evitar es que se repita el mensaje advirtiendo de la falla, saludos y gracias por leer!
#3
Primero que nada gracias a todos por sus respuestas.

Cita de: naderST en 25 Febrero 2012, 15:44 PM
PD: No se por qué estás usando "C++" si lo único que usas es cout. Yo en tu caso utilizaría C.

Porque tengo entendido que C++ es mejor para lo que es OOP, como sólo conozco las bases (iteración, selección, asignación, &c.) aún no me hace mucha diferencia, pero voy a tenerlo en cuenta.

Cita de: satu en 25 Febrero 2012, 21:52 PM
Otra cosa SÚPER IMPORTANTE NO UTILIZAR GOTO.

A muchos no les gusta el goto y no encuentro una razón válida para ello, se me quedó pegado del batch xD

Cita de: satu en 25 Febrero 2012, 21:52 PM
Código (cpp) [Seleccionar]

int size;
char *current;
size = ((sizeof argv[1]) - 1);
current = new char[size];


Sabía que por ahí era la cosa xD, muchísimas gracias! ;-)

Gracias armizh, pero no tengo claro todavía como funcionan esas definiciones, lo intentaré, tampoco sabía lo de el while(1) y por más que sea una única línea en los bucles for utilizo las llaves porque normalmente le voy agregando más código, y me parece más estructurado.

En fin gracias a todos y pueden cerrar el post ;)
#4
Saludos gente, como andan, perdón por no pasar pero estoy muy ocupado, es más casi ni he programado últimamente, y al volver me encontré con una laguna:

¿Cómo hago para pasar el valor de un argumento pasado al programa a un array char (string)?

Utilizo el compilador DEV-CPP 4.9.9.2 (Me ví obligado a hacerlo :'()

No recuerdo si era con un puntero o como era, era algo parecido a pasar un pointer a un valor de una estructura (creo).

Dejo el source, no hay apuro puesto que sólo es algo que se me dío por hacer, pero no me acuerdo :$

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

void Cls();

int main(int argc, char *argv[])
{

    int i, size;
   
    size = ((sizeof argv[1]) - 1);
   
    char current[size] = argv[1];

    i = 0;
    // Animación del texto...
    loop:
    Cls(); // Para no utilizar system("Cls");
    current[size] = current [0];
    for ( i = 0; i < size; i++ )
                               {
                               cout << current[i];
                               if (i != size)
                                            { current[i]= current[i+1]; }
                               }

    goto loop;
   
return 0; // En realidad nunca termina (por ahora)
}

void Cls()

{
     int i;
     i = 0;
     for ( i = 0; i < 2000; i++ )
                                {cout << " ";}
}


Desde ya gracias y saludos a todos!

PD: Si saben de alguna alternativa más veloz y portable a mi void Cls(); les estaré doblemente agradecido, como siempre las críticas son bienvenidas, bytes!
#5
Programación C/C++ / Re: Consulta [C++]
30 Marzo 2011, 13:43 PM
Bueno finalmente decidí que sería más simple declarar una varible char en lugar de int y copiar los caracteres.

Dejo el código:

Código (cpp) [Seleccionar]

[...]
char var1 [200] = "1995";
char vared [12] = " ";
vared [0] = var1[0];
vared [1] = var1[1];
[...]


Antes no me funcionaba porque no había definido la variable "vared".

Saludos, gracias y perdón de nuevo por las molestias.
#6
Programación C/C++ / Re: Consulta [C++]
29 Marzo 2011, 15:03 PM
Creo que me quedaré con el array  :P, veo que me falta mucho por conocer para tener aunque sea las bases del lenguaje, muchas gracias y cuando vuelva a mi casa subo el code del array por si alguien después lo pudiese usar para algo y se acaba el post.

De nuevo muchas gracias y cualquier consejo que me puedan dar para comenzar será bienvenido.
#7
Programación C/C++ / Consulta [C++]
29 Marzo 2011, 13:43 PM
Buenas, lamento molestar por esta pequeñez, pero es que no como buscarla en internet, creo que es un tipo de abstracción de datos, pero al buscarlo de dicha manera me salen las formas de armar estructuras, y por ahora estoy con lo básico.

Lo que yo deseo es tomar "x" caracteres de una variable, en este caso los dos primeros, pero la variable es de tipo int, no char y quería saber si se puede hacer de otra manera que no sea mediante un array en char.

Por si no se me entiende lo dejo en Batch

Código (bash) [Seleccionar]
@REM Esto es lo que quisiera hacer en C/C++...
@Echo Off
Setlocal EnableExtensions EnableDelayedExpansion
Color 0A
:: Declaracion de Variables
Set "var="
Set "deseado="
Echo.
Set /P "var=Por favor ingrese un numero entero: "
Set "deseado=!var:~0,2!
Echo. Presione [Cualquier Tecla] para Salir...
Pause >nul
Exit /B %errorlevel%


De nuevo disculpen las molestias y Desde Ya muchas Gracias.
#8
Es demasiado fácil, sin saber ABSOLUTAMENTE NADA de programación web llegue hasta el nivel 8.

Sigo otro día.

PD: Que HDP con la pass del 7 nunca me habría esperado esa jajaja.
#9
Podrías hacer que el batch al ser ejecutado por primera vez escribiese el código a uno o más archivos, ( en forma cifrada para que no fuese legible a primera vista) , luego los concatenase en otro archivo, lo descifrara y lo llamara desde allí.

Ó podrías hacer un batch que tuviese instrucciones "escondidas" es decir colocar el código en un apartado en forma cifrada, por otro lado un decodificador y por otro el conjunto de instrucciones necesarias para descifrar el archivo.

Hay un ejemplo de como lo podrías hacer en un acertijo de por aquí, me inspiró bastante "si lees esto eres dios".

Si lo encuentras tal vez me entiendas mejor lo de los comandos cifrados.

SaluDOS y suerte con tu proyecto.
#10
Muchas gracias, es una lástima que no haya compatibilidad, no le veo lo bueno a tener que abandonar todas las app's de 16 bits.

SaluDOS.