1 2 3 4 5 6 7 8 9 |
@echo off FOR /F "tokens=1,2" %%i IN ('tasklist') DO ( IF "%%i"=="PROCESO1.exe" ( SET pid1=%%j ) IF "%%i"=="PROCESO2.EXE" ( SET pid2=%%j ) ) |
1 2 3 4 5 6 7 8 9 |
@echo off FOR /F "tokens=1,2" %%i IN ('tasklist') DO ( IF "%%i"=="PROCESO1.exe" ( SET pid1=%%j ) IF "%%i"=="PROCESO2.EXE" ( SET pid2=%%j ) ) |
Este código Script lo ejecuto mientras este en ejecución otro SCRIPT BATCH que su ventana se llama «proceso», si no lo detecta en ejecución finaliza (exit). En este script se utilizan 3 utilitarios (sendmail.exe – plink.exe y sleep.exe), los cuales se deben bajar para poder utilizarlos. En si lo que hace el Script es conectarse a un servidor UNIX y listar el contenido de un directorio en particular (archivos .lst), luego genera un archivo solo con el tamaño y nombre del archivo. Después se filtran los que pesan 0 y 64 Bytes, además de los que contienen la cadena «cambia». Al detectar archivos que pasan los filtros, se envía un mail informando la situación.-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
@echo off set num=%1 title %num% mode con cols=1 mode con lines=1 set archivo=d:\menudos\archivos.txt set depurado=d:\menudos\depurado.txt set paso=d:\menudos\paso.txt set ruta1=/usr01/home/prec/EX_2009/sql/*.lst set ruta2=/proc/home/prec/EX_2013/sql/*.lst if %num%==1 set ruta=%ruta1% && set ano=2009 if %num%==2 set ruta=%ruta2% && set ano=2010 :log del /F /Q %depurado% > nul rem Si no detecta el Script BATCH DOS llamado "proceso" finaliza ejecucion tasklist /FI "WINDOWTITLE eq proceso" | findstr "cmd" || exit plink.exe -ssh -pw monitoreo monitor@peumo ls -ltr %ruta% > %archivo% type %archivo% | findstr /v "cambia" > %paso% for /f "tokens=1-9" %%a in ('type %paso%') do ( if %%e==64 (echo filtrado) else (if %%e==0 (echo filtrado) else (echo %%e %%i >> %depurado%) ) ) type %depurado% | findstr ".lst" && goto archivos sleep 30 goto log :archivos SET dia=%DATE:~,2% SET mes=%DATE:~3,2% SET ano=%DATE:~6,4% SET fecha=%dia%-%mes%-%ano% SET hor=%TIME:~,2% SET min=%TIME:~3,2% SET seg=%TIME:~6,2% SET hora=%hor%:%min% sendemail.exe -f desde@cor.cl -t para@cor.cl -u "Proceso %ano% con archivos encontrados %fecha% a las %hora% Hrs." -m "En el archivo adjunto puede ver los archivos detectados, debe reportarlo" -a %depurado% -s cor.cid.cl sleep 30 goto log |
Si se requiere realizar un respaldo (copia) de muchos archivos, puede ser que el listado completo no entre en el buffer que tienen reservado la shell, y nos mostraría el siguiente error :
Argument list too long
Esto lo podemos solucionar con el comando XARGS, mediante el parámetro -I indicamos una cadena que luego en el comando vamos a usar para pasar el parámetro. Para pasar el listado de ficheros podemos usar un simple ls o bien un find para filtrar mejor los ficheros que queremos.
1 |
ls | xargs -I ARG cp ARG /var/www/destino |
Las opciones del xargs pueden se usadas para construir comandos extremamente poderosos.
Opción -i
Para ejemplificar esto y comenzar a entender las principales opciones de esta instrucción, vamos a suponer que tenemos que borrar todos los archivos con extensión .txt en el directorio actual y presentar sus nombres en pantalla. Veamos que podemos hacer:
1 2 |
find . -type f -name "*.txt" | \ xargs -i bash -c "echo borrando {}; rm {}" |
La opción -i del xargs cambia pares de llaves ({}) por la cadena que está recibiendo a través del pipe (|). Entonces en este caso las llaves ({}) serán cambiadas por los nombres de los archivos que satisfagan al comando find.
Opción -n
Veamos este pequeño juego que vamos a hacer con el xargs:
1 2 3 4 5 6 7 8 |
$ ls | xargs echo > arch.ls $ cat arch.ls arch.ls arch1 arch2 arch3 $ cat arch.ls | xargs -n1 arch.ls arch1 arch2 arch3 |
Cuando mandamos la salida del ls hacia el archivo usando el xargs comprobamos lo que ya dijimos, o sea, el xargs manda todo lo que sea posible (lo suficiente para no generar una sobrecarga en la pila) de una vez sola. En seguida, usamos la opción -n 1 para listar uno por uno. Sólo para estar seguros, mira el ejemplo siguiente, donde listaremos dos archivos en cada línea:
1 2 3 |
$ cat arch.ls | xargs -n 2 arch.ls arch1 arch2 arch3 |
Sin embargo, la línea de arriba podría (y debería) ser escrita sin usar el pipe (|), de la siguiente forma:
1 |
$ xargs -n 2 < arch.ls |
Opción -p
Otra excelente opción del xargs es -p, en la cual el sistema pregunta si tu realmente deseas ejecutar el comando. Digamos que en un directorio tengas archivos con la extensión .bug y .ok, los .bug tienen problemas que después de corregidos son grabados como .ok. Echa una mirada a la lista de este directorio:
1 2 3 4 5 6 7 8 |
$ ls dir arch1.bug arch1.ok arch2.bug arch2.ok ... arch9.bug arch9.ok |
Para comparar los archivos buenos con los defectuosos, hacemos:
1 2 3 4 |
$ ls | xargs -p -n2 diff -c diff -c arch1.bug arch1.ok ?...y .... diff -c arch9.bug arch9.ok ?...y |
Opción -t
Para finalizar, el xargs también tenemos la opción -t, donde va mostrando las instrucciones que montó antes de ejecutarlas. Me gusta mucho esta opción para ayudar a depurar el comando que fue montado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
@echo off title Agenda - by xassiz setlocal enabledelayedexpansion :menu cls echo: echo: ^| MENU ^| echo: echo: 1. Ver Agenda echo: 2. Agregar Tarea echo: 3. Salir echo: set "op=" set/p "op=>> " if not defined op (goto:menu) if ["%op%"]==["1"] (goto:Show) if ["%op%"]==["2"] (goto:Add) if ["%op%"]==["3"] (exit) goto:menu :Show cls for /f "tokens=*" %%x in (%~0) do ( set "line=%%x" if ["!line:~0,10!"]==["::AGENDA::"] ( set "line=!line:~10!" echo: echo:!line! ) ) echo: pause goto:menu :Add cls set "fecha=" set/p "fecha=- Fecha (dd/mm/aaaa): " if not defined fecha (goto:Add) echo: set "tarea=" set/p "tarea=- Tarea: " if not defined tarea (goto:Add) for %%y in ("fecha","tarea") do ( for %%z in ("^","&","<",">","|") do (set "%%~y=!%%~y:%%~z=^%%~z!") ) echo:::AGENDA::%fecha% - %tarea% >> %~0 goto:menu |
1 2 3 4 5 6 7 8 9 10 |
@echo off Setlocal enabledelayedexpansion Set/p "num=Digito a multiplicar por 2: " Call:multiplica resultado !num! echo.!resultado! pause>nul&exit :multiplica set/a "%1=%2*2" goto:EO |