Acciones sobre archivos de texto. [Batch]

Iniciado por leogtz, 24 Enero 2009, 00:30 AM

0 Miembros y 4 Visitantes están viendo este tema.

Eleкtro

Cita de: Segadorfelix en  4 Diciembre 2012, 22:48 PM
EDITO:Ya lo resolví, venia en batch avanzado, era esto:
Código (dos) [Seleccionar]
FOR /F "tokens=3*" %r IN (archivo.txt) DO (echo %r %s)
PD:XD

Si lo prefieres todo en un único token:
Código (dos) [Seleccionar]

@Echo OFF
FOR /F "tokens=2,*" %%A IN (archivo.txt) DO (echo %%B)
Pause&Exit








lucaslopezld123

Cita de: Segadorfelix en  3 Diciembre 2012, 04:30 AM
Si pero solo al archivo.
Resumiendo, lo que EleKtro H@cker intenta decir:
Código (dos) [Seleccionar]


    @Echo OFF
    Call :TEXTMAN L- 2 "Archivo.txt"
    Pause&Exit


    :: TEXT MANIPULATOR ROUTINE v0.2
    :: by Elektro H@cker
     
    rem USO:
   rem  :TEXTMAN [ACCIÓN] [LÍNEA] [ARCHIVO] [TEXTO (Opcional)]
     
     
    REM ACCIONES:
    REM
    REM  AL  = ADD_LEFT           * AÑADIR TEXTO AL PRINCIPIO DE UNA LÍNEA
    REM  AR  = ADD_RIGHT          * AÑADIR TEXTO AL FINAL DE UNA LÍNEA
    REM  E   = ERASE              * ELIMINAR UNA LÍNEA
    REM  I   = INSERT             * INSERTAR UNA LÍNEA (VACÍA O CON TEXTO)
    REM  RL  = REPLACE_LINE       * REEMPLAZAR UNA LÍNEA
    REM  RS  = REPLACE_STRING     * REEMPLAZAR PALABRAS DE UNA LÍNEA
    REM  RSA = REPLACE_STRING_ALL * REEMPLAZAR PALABRAS EN TODAS LAS LÍNEAS
    REM  C+  = CHARACTER_PLUS     * ELIMINAR LOS PRIMEROS "X" CARACTERES EN TODAS LAS LÍNEAS
    REM  C-  = CHARACTER_LESS     * ELIMINAR LOS ÚLTIMOS  "X" CARACTERES EN TODAS LAS LÍNEAS
    REM  L+  = LINE_PLUS          * CORTAR LAS PRIMERAS "X" LÍNEAS
    REM  L-  = LINE_LESS          * CORTAR LAS ÚLTIMAS  "X" LÍNEAS
     
     
    REM EJEMPLOS DE USO:
     
    :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
    ::
    :: Elimina la línea 3
    :: Call :TEXTMAN E 3 "Test.txt"
    ::
    :: Añade una frase al principio de la línea 3
    :: Call :TEXTMAN AL 3 "Test.txt" "Elektro H@cker"
    ::
    :: Añade una frase al final de la línea 3
    :: Call :TEXTMAN AR 3 "Test.txt" "Elektro H@cker"
    ::
    :: Inserta una línea vacía en la línea 3
    :: Call :TEXTMAN I 3 "Test.txt"
    ::
    :: Inserta una línea con texto en la línea 3
    :: Call :TEXTMAN I 3 "Test.txt" "Elektro H@cker"
    ::
    :: Reemplaza la línea 3 por completo
    :: Call :TEXTMAN RL 3 "Test.txt" "Elektro H@cker"
    ::
    :: Reemplaza las palabras "Elektro" por "H@cker" en la línea 3
    :: Call :TEXTMAN RS 3 "Test.txt" "Elektro" "H@cker"
    ::
    :: Reemplaza las palabras "Elektro" por "H@cker" en todas las líneas
    :: Call :TEXTMAN RSA "Test.txt" "Elektro" "H@cker"
    ::
    :: Elimina los 3 primeros caracteres de todas las líneas
    :: Call :TEXTMAN C+ 3 "Test.txt"
    ::
    :: Elimina los 3 uúltimos caracteres de todas las líneas
    :: Call :TEXTMAN C- 3 "Test.txt"
    ::
    :: Elimina las 3 primeras líneas
    :: Call :TEXTMAN L+ 3 "Test.txt"
    ::
    :: Elimina las 3 últimas líneas
    :: Call :TEXTMAN L- 3 "Test.txt"
    ::
    :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::

     
:TEXTMAN
(SET /A "A=0", "LINE=0", "TOTAL_LINES=0")  &  (CALL :%~1 %* || (ECHO Parametro incorrecto & Exit /B 1)) & (GOTO:EOF)
:AL
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (Echo %%@ >> "%~nx3.NEW") ELSE (Echo %~4%%@ >> "%~nx3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:AR
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (Echo %%@ >> "%~nx3.NEW") ELSE (Echo %%@%~4 >> "%~nx3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:E
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (Echo %%@ >> "%~nx3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:I
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" && (CMD /C "IF     "%%LINE%%" EQU "%~2" (IF NOT "%~4" EQU "" (Echo %~4 >> "%~nx3.NEW") ELSE (Echo. >> "%~nx3.NEW"))" & Echo %%@ >> "%~nx3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:RL
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (Echo %%@ >> "%~nx3.NEW") ELSE (Echo %~4 >> "%~nx3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:RS
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (Echo %%@ >> "%~nx3.NEW") ELSE (CALL SET "STRING=%%@" && CALL ECHO %%STRING:%~4=%~5%% >> "%~nx3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:RSA
(For /F "usebackq tokens=*" %%@ in ("%~2") DO (CALL SET "STRING=%%@" && (CALL ECHO %%STRING:%~3=%~4%% >> "%~2.NEW"))) && (CALL :RENAMER "%~2") & (GOTO:EOF)
:C+
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~%~2%% >>    "%~nx3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:C-
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~0,-%~2%% >> "%~nx3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:L+
(Call SET /A "A=%~2") && (Call TYPE "%~3" | @MORE +%%A%% > "%~nx3.NEW") && (CALL :RENAMER "%~3") & (GOTO:EOF)
:L-
(FOR /F %%X IN ('TYPE "%~3"') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%@ >> "%~nx3.NEW"))
:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~nx1.BAK" "%TEMP%\" >NUL) & (REN "%~nx1.NEW" "%~nx1") & (GOTO:EOF)


perdon no entiendo, el archivo textman como lo consigo? donde lo pego?
si mi texto se llama "repote.txt" cual seria la sintaxis para borrar las ultimas dos lineas?

Eleкtro

#222
@lucaslopezld123

Unos comentarios más arriba te explico cual es el código que debes usar.

El archivo textman es ese, es una subrutina y se debe pegar al final de tu script batch.

Exactamente lo que debes usar, como ya te expliqué, es esto:
Código (DOS) [Seleccionar]

   @Echo OFF
   
   REM con este comando cortas las 2 últimas lineas de archivo.txt
   Call :TEXTMAN L- 2 "Archivo.txt"
   REM aquí el resto de tu código
   Pause&Exit




   REM esta parte del código la dejas abajo del todo del script
   ::---------------------------------------------------------------------------
   :TEXTMAN
   :L-
   (FOR /F %%X IN ('TYPE "%~3"') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%!!|@%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%@ >> "%~nx3.NEW"))
   :RENAMER
   (REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~nx1.BAK" "%TEMP%\" >NUL) & (REN "%~nx1.NEW" "%~nx1") & (GOTO:EOF)


Saludos








lucaslopezld123

#223
Cita de: EleKtro H@cker en  7 Diciembre 2012, 21:48 PM
@lucaslopezld123

Unos comentarios más arriba te explico cual es el código que debes usar.

El archivo textman es ese, es una subrutina y se debe pegar al final de tu script batch.

Exactamente lo que debes usar, como ya te expliqué, es esto:
Código (DOS) [Seleccionar]

   @Echo OFF
   
   REM con este comando cortas las 2 últimas lineas de archivo.txt
   Call :TEXTMAN L- 2 "Archivo.txt"
   REM aquí el resto de tu código
   Pause&Exit




   REM esta parte del código la dejas abajo del todo del script
   ::---------------------------------------------------------------------------
   :TEXTMAN
   :L-
   (FOR /F %%X IN ('TYPE "%~3"') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%!!|@%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%@ >> "%~nx3.NEW"))
   :RENAMER
   (REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~nx1.BAK" "%TEMP%\" >NUL) & (REN "%~nx1.NEW" "%~nx1") & (GOTO:EOF)


Saludos

Hola Muchas gracias por el aporte, consulta
es posible que el codigo tenga algun fallo? no hace lo esperado
elimina 4 lineas y mientras lo hace dice "...no puede encontrar la ubicacion"
la ruta y nombre esta ok de hecho escribe los datos, solo que no borra lo que deberia.
Gracias

Eleкtro

#224
Como ya comenté había un fallo en esa función pero juraría haber posteado la correción y haber editado los comentarios con el nuevo código (Parece que no xD) :-/

Es un fallo del foro al postear el código con formato "DOS", un error el cual nadie me hace caso y no lo arreglan xD

Aqui tienes el código sin formato:

@Echo OFF
   
REM con este comando cortas las 2 últimas lineas de archivo.txt
Call :TEXTMAN L- 4 "test.txt"
REM aquí el resto de tu código
Pause&Exit
   
   
   
REM esta parte del código la dejas abajo del todo del script
::---------------------------------------------------------------------------
:TEXTMAN
:L-
(FOR /F %%X IN ('TYPE "%~3"') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%@ >> "%~nx3.NEW"))
:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~nx1.BAK" "%TEMP%\" >NUL) & (REN "%~nx1.NEW" "%~nx1") & (GOTO:EOF)


Un saludo.








maurorap

#225
Estimado:

Cuando trabajo con Edlin por ejemplo con este bloque de codigo

Código (dos) [Seleccionar]
@echo off
(
echo 15
echo String fechaExpiracion = "%fechaCaducidadLicencia%";
echo e
) | edlin licencia.jsp


este lo ocupo para reemplazar la linea 15 con el texto

String fechaExpiracion = "%fechaCaducidadLicencia%";
Al final del archivo me genera una linea, que por ejemplo con notepad es un cuadrado ( al  ingresarlo a google lo transforma en "?").
Como logro que no me ingrese esa linea despues de editar esa linea del archivo? ( en realidad lo hace al reemplazar cualquier linea)

saludos y de antemano gracias!!!

lucaslopezld123

#226
quiero eliminar las ultimas dos lineas, ahora si funciona, pero luego todo el codigo en adelante no puede encontrar la ruta especificada.
que estoy haciendo mal?

aqui esta el codigo

@ECHO OFF
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i:\INS\NINFUS set DRIVE=%%i:
ECHO INICIALIZANDO
For /l %%A in (1,1,3) do (<nul (SET/p z=.) & >nul ping 127.0.0.1 -n 2 )
%DRIVE%\Ins\reg\registros.exe
%DRIVE%\Ins\reg\Launcher.exe
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
FOR /f "tokens=1,2,3* delims=." %%a IN ('ver') DO (
SET WVer=%%a
SET WVer=!WVer:~-1!
SET WVer=!WVer!.%%b.%%c
SET WVer=!WVer:]=!
)
IF DEFINED ProgramFiles(x86) (
SET OSBit=64bits
) ELSE (
SET OSBit=32bits
)
set hora=%time%
SET DIA=%DATE%
@ECHO %DIA%>>%DRIVE%\ReporteINS.txt
@echo %COMPUTERNAME%>>%DRIVE%\ReporteINS.txt
@ECHO %OS% %osbit% ver%WVer%>>%DRIVE%\ReporteINS.txt
@echo Comenzo= %hora:~0,8%>>%DRIVE%\ReporteINS.txt
@ECHO Instalacion Incompleta>>%DRIVE%\ReporteINS.txt
@echo ------------------->>%DRIVE%\ReporteINS.txt
pause
set hora=%time%
Call :TEXTMAN L- 2 "%DRIVE%\ReporteINS.txt"

@echo Termino= %hora:~0,8%>>%DRIVE%\ReporteINS.txt
@echo Modo Automatico>>%DRIVE%\ReporteINS.txt
@echo ------------------->>%DRIVE%\ReporteINS.txt

Pause&Exit

::---------------------------------------------------------------------------
:TEXTMAN
:L-
(FOR /F %%X IN ('TYPE "%~3"') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%@ >> "%~nx3.NEW"))
:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~nx1.BAK" "%TEMP%\" >NUL) & (REN "%~nx1.NEW" "%~nx1") & (GOTO:EOF)
::---------------------------------------------------------------------------

Eleкtro

Cita de: lucaslopezld123 en 22 Diciembre 2012, 16:40 PM
quiero eliminar las ultimas dos lineas, ahora si funciona, pero luego todo el codigo en adelante no puede encontrar la ruta especificada.
que estoy haciendo mal?

No entendí bien tu problema, pero creo que he arreglado una errata en el TEXTMAN y te he mejorado el código en general, pruébalo, y si no te funciona explica mejor donde tienes problemas:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (if exist "%%i:\INS\NINFUS" set "DRIVE=%%i:")

ECHO INICIALIZANDO

For /l %%A in (1,1,3) do (<nul (SET/p z=.) & >nul ping 127.0.0.1 -n 2 )

%DRIVE%\Ins\reg\registros.exe 2>NUL
%DRIVE%\Ins\reg\Launcher.exe  2>NUL

FOR /F "Tokens=2 Delims==" %%# IN ('wmic os get version /Format:list') DO (Set "WVER=%%#")

IF DEFINED ProgramFiles(x86) (SET OSBit=64bits) ELSE (SET OSBit=32bits)

(
ECHO %DATE%
ECHO %COMPUTERNAME%
ECHO %OS% %osbit% ver%WVer%
ECHO Comenzo= %time:~0,8%
ECHO Instalacion Incompleta
ECHO ----------------------
)>>"%DRIVE%\ReporteINS.txt"


Call :TEXTMAN L- 2 "%DRIVE%\ReporteINS.txt"

(
ECHO Termino= %time:~0,8%
ECHO Modo Automatico
ECHO ---------------
)>>"%DRIVE%\ReporteINS.txt"

Pause&Exit

::---------------------------------------------------------------------------
:TEXTMAN

:L-
(FOR /F %%X IN ('TYPE "%~3"') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%@ >> "%~3.NEW"))
:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)
::---------------------------------------------------------------------------








lucaslopezld123

MAESTRO!!!!!!!!!!
ALGUNAVEZ TE DIJERON QUE SOS MUY, PERO MUY GROSO!!!??
muchisimas gracias quedo perfecto!

me encantaria saber que es eso de "2>NUL"

un genio total usted! jeje :D

Segadorfelix

Cita de: lucaslopezld123 en 23 Diciembre 2012, 02:51 AM
me encantaria saber que es eso de "2>NUL"
Redirige todos los errores a valor nulo.