Ayuda con For /f

Iniciado por DUF, 15 Mayo 2013, 01:41 AM

0 Miembros y 1 Visitante están viendo este tema.

DUF

Hola Hakers,

Soy nuevo en estos temas y pues quiero aprender, estoy en mi primer batch, pero tengo el siguiente problema:

Tengo 3 archivos los cuales contienen la siguiente información:

Código (dos) [Seleccionar]
rem ********************************************************
rem ARCHIVO reporte.txt
rem ********************************************************
Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.



Código (dos) [Seleccionar]
rem ********************************************************
rem ARCHIVO reporte2.txt
rem ********************************************************
Tiempo de espera agotado para esta solicitud.

Respuesta desde 10.0.51.171: bytes=32 tiempo<1m TTL=128
Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.


Código (dos) [Seleccionar]

rem ********************************************************
rem ARCHIVO reporte3.txt
rem ********************************************************
Tiempo de espera agotado para esta solicitud.

Respuesta desde 10.0.51.171: bytes=32 tiempo<1m TTL=128
Respuesta desde 10.0.51.171: bytes=32 tiempo<1m TTL=128
Respuesta desde 10.0.51.171: bytes=32 tiempo<1m TTL=128


En el código marque el batch por pasos y en el paso 1 todo va bien con el "for /f..." pues si me da el valor esperado, posteriormente entro a un "if" donde tengo otro "for /f..." y ahí en ese paso al poner un "echo %resul2" me marca ECHO esta desactivado entro a un segundo "if" y me marca lo mismo con la variable %resul3%, no obtengo valor en mis variables resul2 y resul3

Mi código es el siguiente:

Código (dos) [Seleccionar]
@echo off
rem ********************************************************
echo PASO 1
rem ********************************************************

for /f "tokens=3" %%a in ('find /c /i "agotado" reporte.txt') Do set resul1=%%a
find /c /i "agotado" reporte.txt
type reporte.txt
echo EL RESULTADO ES %resul1%

rem ********************************************************
echo PASO 2
rem ********************************************************

if %resul1% GTR 2 (
for /f "tokens=3" %%a in ('find /c /i "agotado" reporte2.txt') Do set resul2=%%a
find /c /i "agotado" reporte2.txt
type reporte2.txt
echo.
echo %resul2%
echo EL RESULTADO ES %resul2%
)

rem ********************************************************
echo PASO 3
rem ********************************************************

if %resul2% GTR 2 (
for /f "tokens=3" %%a in ('find /c /i "agotado" reporte3.txt') Do set resul3=%%a
find /c /i "agotado" reporte3.txt
type reporte3.txt
echo.
echo EL RESULTADO ES %resul3%
) else (
echo EL EQUIPO RESPONDE
)
echo.
pause
exit


GRACIAS POR LA AYUDA.




MOD: Usa el botón de insertar código

Almapa

#1
He estado probando el código y parece que hasta que no terminan todas las operaciones que hay dentro del "if", no se definen las variables que defines en los bucles for ("resul2" y "resul3").
Si sacas las operaciones que siguen al "for" fuera del if para el caso en el que las variables "resul2" y "resul3" estén definidas si que funciona. Con este código me funciona.



@echo off
rem ********************************************************
echo PASO 1
rem ********************************************************

for /f "tokens=3" %%a in ('find /c /i "agotado" reporte.txt') do (set resul1=%%a)
find /c /i "agotado" reporte.txt
type reporte.txt
echo EL RESULTADO ES %resul1%

rem ********************************************************
echo PASO 2
rem ********************************************************

if %resul1% GTR 2 (
for /f "tokens=3" %%a in ('find /c /i "agotado" reporte2.txt') do (set resul2=%%a)

)
if "%resul2%" NEQ "" (
find /c /i "agotado" reporte2.txt
echo %resul2%
type reporte2.txt
echo EL RESULTADO ES %resul2%
)


rem ********************************************************
echo PASO 3
rem ********************************************************

if %resul2% GTR 2 (
for /f "tokens=3" %%a in ('find /c /i "agotado" reporte3.txt') Do set resul3=%%a
) else (
echo EL EQUIPO RESPONDE
)
if "%resul3%" NEQ "" (
find /c /i "agotado" reporte3.txt
type reporte3.txt
echo.
echo EL RESULTADO ES %resul3%
)
echo.
pause
exit



Un saludo

Eleкtro

Bienvenido a Batch,

El problema es que no estás expandiendo las variables dentro de los búcles.

Añade un:
Setlocal EnableDelayedExpansion

Y usa las variables con exclamaciones:
Echo !resul2!

O no añadas nada y usa Call:
Call %%resul2%%




http://foro.elhacker.net/scripting/tema_bloqueado_hasta_finalizar_el_tuto_tutorial_extendido_de_aprendizaje_batch-t375135.15.html

Cita de: Elektro H@cker
  • 6.3 Variables expandidas

Las variables expandidas son prácticamente igual que las variables standard, pero para poder usarlas se debe habilitar la expansión de las mismas con el comando SETLOCAL:
Setlocal enabledelayedexpansion

Ejemplo:
@Echo OFF
Setlocal enabledelayedexpansion
Set "VARIABLE=VALOR"
Echo !VARIABLE!
Pause >NUL




Esta técnica se usa comúnmente dentro de un FOR donde para poder mostrar variables tienen que estar expandidas.

Pero estas variables tienes sus inconvenientes, ya que al habilitar la expansión, solamente podremos usar el caracter ! como operador de variable, es decir, no podremos mostrar el caracter (Ni siquiera excluyendolo ni usando comillas).

Ejemplo:
@Echo OFF
Setlocal enabledelayedexpansion
Echo !Hola
Echo ^!Hola
Echo "!Hola"
Pause >NUL




NOTA: Siempre se puede evitar la expansión y su restricción de caracteres, eso lo explicaré cuando lleguemos a la temática FOR.


http://ss64.com/nt/delayedexpansion.html


PD: Usa el botón "Insertar código" cuando postees








DUF

Muchas gracias a todos los que colaboraron con su ayuda.  :D