elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Acciones sobre archivos de texto. [Batch]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 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 ... 35 Ir Abajo Respuesta Imprimir
Autor Tema: Acciones sobre archivos de texto. [Batch]  (Leído 445,137 veces)
oloco

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #160 en: 21 Julio 2011, 01:37 am »

Vale Leo. Gracias!


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #161 en: 21 Julio 2011, 08:29 am »

Bueno, a ver si he entendido, tu haces una consulta SQL la cual te devuelve los valores que comienzan con H y eso lo volcas a un archivo familia.txt...

Ahí hay que trabajar el archivo para que cada valor(ejemplo):

HEMILIO            
HRODRIGO
HCARMEN
HLORENA            

lo meta en una variable independiente, bueno, si he entendido bien, podríamos trabajar con un array:

Código:
@echo off
setlocal enabledelayedexpansion
set /a contador=0

rem "familia.txt" es el archivo conteniendo el resultado de la consulta:
rem szfamilyname
rem --------------------
rem HMAR
rem HTERESA
rem HLUZ

rem (3 rows affected)

for /f "tokens=*" %%_ in ('findstr /r ^H.*$ familia.txt') do (
set query[!contador!]=%%_
set /a contador+=1
)
echo No. de valores: !contador!

rem Los valores son guardados en el array "query".
rem Para mostrar los valores del array:
rem Primera posición:
echo !query[0]!
rem Segunda posición:
echo !query[1]!
rem Tercera posición:
echo !query[2]!
rem Y así consecutivamente...
rem Solo estoy mostrando hasta el 3, claro que puede haber muchos más.
pause

He comentado un poco el código para que lo entiendas mejor, sino cualquier duda la aclaramos.

Tomando el archivo familia.txt con:

Código:
C:\Users\leo>type familia.txt
szfamilyname
--------------------
HEMILIO
HRODRIGO
HCARMEN
HLORENA

(4 rows affected)
C:\Users\leo>

El código devuelve:

Código:
C:\Users\leo>code.cmd
No. de valores: 4
HEMILIO
HRODRIGO
HCARMEN

C:\Users\leo>
Lo cual es correcto.

Ahora, si quisieramos mostrar todos los valores:

Código:
@echo off
setlocal enabledelayedexpansion
set /a contador=0

for /f "tokens=*" %%_ in ('findstr /r ^H.*$ familia.txt') do (
set query[!contador!]=%%_
set /a contador+=1
)
echo No. de valores: !contador!

rem Los valores son guardados en el array "query".
rem Para mostrar los valores del array:
rem Primera posición:
echo !query[0]!
rem Segunda posición:
echo !query[1]!
rem Tercera posición:
echo !query[2]!
rem Y así consecutivamente...
echo.
echo Todos los valores son:
set /a contador-=1
for /l %%_ in (0,1,!contador!) do (
echo !query[%%_]!
)
pause

¿Me queda una duda, para qué utilizas Batch?, en el trabajo?, universidad?


« Última modificación: 21 Julio 2011, 08:34 am por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
oloco

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #162 en: 21 Julio 2011, 18:37 pm »

Hola de nuevo, Leo!
Verás, después de haber expuesto mi duda seguí investigando. He de decir que el ejemplo expuesto no es real. Con esto quiero decir que los datos obtenidos no son nombres de persona, sinó nombres de equipos (el ejemplo lo puse para tratar de hacerme entender mejor, pero pienso que fue un error).
El equipo con la base de datos al que se hace la consulta es un servidor, y los resultados obtenidos son los equipos que a él se conectan.
Una vez tenemos los datos, necesito hacer operaciones con ellos, como por ejemplo un ping, para obtener su IP y revisar que todos tengan conectividad y la misma máscara de subred... por ejemplo. Todo esto quisiera que se hiciese de forma automatizada, por ese motivo la importancia de tener una forma fácil de acceder a las variables.
Resumiendo: Mi script se conecta mediante psexec al servidor, hace la consulta sql y guarda los resultados a un fichero.
Ahora gracias a tu ayuda, puedo tener un contador que me indica cuantos resultados hay.
Sin embargo, sigo sin ver una forma de poder realizar operaciones con los equipos clientes, dado que su número es variable según el servidor al que se consulte.
Si siempre tuviese 2 clientes, en el script llamaría siempre a dos variables, con lo que se acaba el problema. Pero en mi caso, el script tiene que llamar a x variables:



Código
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a contador=0
  4.  
  5. rem "familia.txt" es el archivo conteniendo el resultado de la consulta:
  6. rem szfamilyname
  7. rem --------------------
  8. rem HMAR
  9. rem HTERESA
  10. rem HLUZ
  11.  
  12. rem (3 rows affected)
  13.  
  14. for /f "tokens=*" %%_ in ('findstr /r ^H.*$ familia.txt') do (
  15. set query[!contador!]=%%_
  16. set /a contador+=1
  17. )
  18. echo No. de valores: !contador!
  19.  
  20. rem Los valores son guardados en el array "query".
  21. rem Para mostrar los valores del array:
  22. rem Primera posicion:
  23. echo !query[0]!
  24. rem Segunda posicion:
  25. echo !query[1]!
  26. rem Tercera posicion:
  27. echo !query[2]!
  28. rem Y así consecutivamente...
  29. rem Solo estoy mostrando hasta el 3, claro que puede haber muchos mas.
  30. pause
  31.  
Aqui está mi problema. Si tuviese siempre tres resultados, pondría el código tal cual has expuesto, pero como los resultados pueden ser desde 1 hasta 12, no se muy bien como planteármelo para poder crear una orden de ping (entre otras) por cada uno de ellos.

Ante todo quiero agradecerte toda la ayuda que me estás brindando.
Espero puedas entender lo que intento explicarte, pues soy consciente de que esto no se me da demasiado bien y quizas estoy pasando cosas por alto.

Me mantengo a la espera.

Un abrazo!!

P.D Por cierto, respondiendo a tu pregunta. Este script lo utilizo para mi trabajo, y utilizo cmd pues los equipos a los que nos tenemos que conectar utilizan Windows XP o 2003, tienen unas directivas de seguridad elevadas y no tenemos permiso para utilizar utilidades de terceros.
« Última modificación: 21 Julio 2011, 18:40 pm por oloco » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #163 en: 21 Julio 2011, 20:30 pm »

Al utilizar un array, tienes total control sobre todos los valores sabiendo el número de ellos, es decir, en mi último script:

Código:
@echo off
setlocal enabledelayedexpansion
set /a contador=0

for /f "tokens=*" %%_ in ('findstr /r ^H.*$ familia.txt') do (
set query[!contador!]=%%_
set /a contador+=1
)
echo No. de valores: !contador!

rem Los valores son guardados en el array "query".
rem Para mostrar los valores del array:
rem Primera posición:
echo !query[0]!
rem Segunda posición:
echo !query[1]!
rem Tercera posición:
echo !query[2]!
rem Y así consecutivamente...
echo.
echo Todos los valores son:
set /a contador-=1
for /l %%_ in (0,1,!contador!) do (
echo !query[%%_]!
)
pause

Suponiendo que los valores fueran máquinas y yo quisiera saber cuales de ellas están online u offline:

Código:
@echo off
setlocal enabledelayedexpansion
set /a contador=0

for /f "tokens=*" %%_ in ('findstr /r ^H.*$ familia.txt') do (
set query[!contador!]=%%_
set /a contador+=1
)
echo No. de valores: !contador!
echo Todos los valores son:
set /a contador-=1
for /l %%_ in (0,1,!contador!) do (
ping -n 4 !query[%%_]! > nul 2>&1 && (
echo Máquina !query[%%_]! - online
) || (
echo Máquina !query[%%_]! - offline
)
)
pause
Código:
!query! es el array, si yo quiero acceder a la posición x:
!query[x]!
Saludos, cualquier duda nos dices.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
oloco

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #164 en: 21 Julio 2011, 20:57 pm »

Hola Leo.
Pienso que más o menos me va quedando algo más claro. Lo cierto es que me resulta bastante complejo, pero con ganas de aprender (además en mi trabajo me resultará muy util).
He ejecutado el código que has creado, y funciona correctamente menos en un punto. En este equipo tengo sólo dos clientes (debería reportar dos equipos asociados a este servidor), pero cuando ejecuto la parte del código que realiza el ping a cada uno de los valores del array, tambien lo realiza a un "equipo" cuyo valor es nulo.

Código
  1. Maquina H111            - online
  2. Maquina H112            - offline
  3. Maquina  - offline
  4. Press any key to continue . . .
  5.  

Me doy cuenta de que ese tercer valor es el que corresponde con !contador! dentro del código.
¿Alguna sugerencia?
Gracias!
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #165 en: 21 Julio 2011, 21:16 pm »

¿Puedo ver la tabla o el archivo de texto que usas cuando da error?
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
oloco

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #166 en: 21 Julio 2011, 21:42 pm »

Por supuesto. Este es el fichero temp.txt (en el que se graban los equipos):
Código:
szcomputername      
--------------------
H111
H112         

(2 rows affected)

y esto es el código que tengo en el script:
Código
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a contador=0
  4.  
  5. for /f "tokens=*" %%_ in ('findstr /r ^H.*$ temp.txt') do (
  6. set query[!contador!]=%%_
  7. set /a contador+=1
  8. )
  9. echo No. de valores: !contador!
  10.  
  11.  
  12.  
  13. echo REVISION DE LA SUBRED EN EL CONJUNTO DE CAJAS
  14.  
  15.  
  16. for /l %%_ in (0,1,!contador!) do (
  17. ping -n 1 !query[%%_]! > nul 2>&1 && (
  18. echo Maquina !query[%%_]! - online
  19. ) || (
  20. echo Maquina !query[%%_]! - offline
  21. )
  22. )
  23. pause
  24.  
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #167 en: 21 Julio 2011, 21:53 pm »

Sí, el problema está con la variable contador, que da un valor de más, solo hay que decrementarla y listo.

Código:
@echo off
setlocal enabledelayedexpansion
set /a contador=0
 
for /f "tokens=*" %%_ in ('findstr /r ^H.*$ temp.txt') do (
set query[!contador!]=%%_
set /a contador+=1
)
echo No. de valores: !contador!
echo REVISION DE LA SUBRED EN EL CONJUNTO DE CAJAS
rem Decrementamos la variable en una unidad.
set /a contador-=1
for /l %%_ in (0,1,!contador!) do (
ping -n 1 !query[%%_]! > nul 2>&1 && (
echo Maquina !query[%%_]! - online
) || (
echo Maquina !query[%%_]! - offline
)
)
pause
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
oloco

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #168 en: 21 Julio 2011, 22:04 pm »

Efectivamente Leo. Ya funciona todo correctamente.
Ahora, a partir de aquí, ya puedo seguir aumentando funciones al script para darle más funcionalidad, así que no sería extraño que vuelva a pasarme por aquí en busca de tu consejo.
Te agradezco enormemente la paciencia y tiempo gastados conmigo.

P.D Por cierto, podrías recomendarme alguna lectura, algún libro o manual para poder aprender nuevos conocimientos sobre batch?

Un saludo, y gracias por todo!!!
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Acciones sobre archivos de texto. [Batch]
« Respuesta #169 en: 21 Julio 2011, 22:08 pm »

ss64.com contiene ayuda sobre los comandos de Windows XP y algunos ejemplos.
robvanderwoude.com
http://www.robvanderwoude.com/batchstart.php también contiene mucha ayuda.
Y por supuesto este sitio, los temas pegados en esta sección.

Saludos.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Páginas: 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 ... 35 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Modificar archivos de texto [batch] [Perl] « 1 2 »
Scripting
bjeli1980 10 13,751 Último mensaje 17 Mayo 2010, 09:07 am
por bjeli1980
[BATCH] Ayuda guardando archivos de texto a php
Scripting
Geormarsch 2 4,359 Último mensaje 20 Septiembre 2011, 16:33 pm
por Poderoscuro1207
[BATCH] [APORTE] Rutina TEXTMAN para manipular archivos de texto
Scripting
Eleкtro 2 8,099 Último mensaje 15 Marzo 2014, 15:17 pm
por FranciskoAsdf
Como puedo arrastrar y concatenar archivos de texto en un BATCH
Scripting
PUCH84 6 10,021 Último mensaje 28 Abril 2014, 09:49 am
por PUCH84
Ayuda con batch para crear archivos de texto plano
Scripting
seu230 6 3,124 Último mensaje 5 Octubre 2018, 10:28 am
por seu230
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines