Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: ruvenhr en 12 Junio 2013, 11:22 am



Título: Ayuda Script batch/powershell
Publicado por: ruvenhr en 12 Junio 2013, 11:22 am
Hola buenas,

Primero decir que me encana este foro, siempre cuando busco algo acabo dando vueltas por aqui jajaja :D Mercii a todos  ;-) ;-)

Ahora una pregunta que tengo sobre los scripts:

En el trabajo me han dado la tarea de crear un archivo de text (.txt) a partir de un archivo que se crea automaticamente (copia de seguridad de robocopy).

Teniendo el archivo de robocopy (en adelante kk.txt) y querer extraer una parte del texto a un nuevo fichero (en adelante salidakk.txt) preferiblemente en batch?


Necesito extraer las primeras 14 lineas, después hay una separación de guiones (-------------).

Aparecen los datos que no necesito y al acabar esos datos aparece otra separación por guiones.

Finalmente aparece un pequeño resumen sobre como ha ido la copia:
Total de archivos, errores, velocidades, tamaños... Esto también lo necesito extraer.

Mis pruebas (en batch) me han llevado al siguiente resultado:

Código
  1. @echo off
  2. echo Creando Nuevo archivo...
  3. findstr "ROBOCOPY  Total Directorios Bytes Velocidad" kk.txt >>salidakk.txt


Pero me extrae tambien algunos datos del centro del archivo (entre la separacion de los guiones).

Que podria intentar?

Muchas gracias de antelación  ;D


Título: Re: Ayuda Script batch/powershell
Publicado por: Eleкtro en 12 Junio 2013, 11:48 am
Hola,

Antes de nada, haz el favor de leer mi firma.

Y prueba a usar el siguiente script, de esta manera:
Código
  1. TextMan.bat SR 1 14 "kk.txt"    

Saludos!





TextMan.bat:
Código
  1. @Echo OFF
  2.  
  3.  
  4. :: TEXT MANIPULATOR ROUTINE v0.5
  5. :: by Elektro H@cker
  6.  
  7.  
  8. REM SYNTAX:
  9. ::
  10. :: TEXTMAN [ACTION] [LINE(S)] [FILE] [TEXT]
  11. ::
  12. :: * [LINE(S)] parameter is Optional for some actions
  13. :: * [TEXT] parameter is Optional for some actions
  14.  
  15.  
  16. REM ACTIONS:
  17. ::
  18. ::  AB  = ADD_BEGINNING      * Add text to the beginning of a line.
  19. ::  AE  = ADD_ENDING         * Add text to the end of a line.
  20. ::  E   = ERASE              * Delete a line.
  21. ::  I   = INSERT             * Add a empty line (Or a line with text).
  22. ::  RL  = REPLACE_LINE       * Replace a entire line.
  23. ::  RS  = REPLACE_STRING     * Replace word from line.
  24. ::  RSA = REPLACE_STRING_ALL * Replace word from all lines.
  25. ::  C+  = CHARACTER_PLUS     * Delete the first "X" characters from all lines.
  26. ::  C-  = CHARACTER_LESS     * Delete the last  "X" characters from all lines.
  27. ::  L+  = LINE_PLUS          * Cut the first "X" amount of lines.
  28. ::  L-  = LINE_LESS          * Cut the last  "X" amount of lines.
  29. ::  GL  = GET_LINE           * Delete all except "X" line.
  30. ::  GR  = GET_RANGE          * Delete all except "X" range of lines.
  31.  
  32.  
  33. REM EXAMPLES:
  34. ::
  35. :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
  36. ::                                                                         ::
  37. :: Delete the line 3                                                       ::
  38. :: Call :TEXTMAN E 3 "Test.txt"                                            ::
  39. ::                                                                         ::                                                                        
  40. :: Add a string to the beginning of line 3                                 ::
  41. :: Call :TEXTMAN AL 3 "Test.txt" "Elektro H@cker"                          ::
  42. ::                                                                         ::                                                                      
  43. :: Add a string to the end of line 3.                                      ::
  44. :: Call :TEXTMAN AR 3 "Test.txt" "Elektro H@cker"                          ::
  45. ::                                                                         ::                                                                      
  46. :: Add a empty line at line 3.                                             ::
  47. :: Call :TEXTMAN I 3 "Test.txt"                                            ::
  48. ::                                                                         ::                                                                      
  49. :: Add a line with a word at line 3.                                       ::
  50. :: Call :TEXTMAN I 3 "Test.txt" "Elektro H@cker"                           ::
  51. ::                                                                         ::    
  52. :: Replace the line 3 with "Elektro H@cker".                               ::
  53. :: Call :TEXTMAN RL 3 "Test.txt" "Elektro H@cker"                          ::
  54. ::                                                                         ::
  55. :: Replace the words "Elektro" to "H@cker" in line 3.                      ::
  56. :: Call :TEXTMAN RS 3 "Test.txt" "Elektro" "H@cker"                        ::
  57. ::                                                                         ::
  58. :: Replace the words "Elektro" to "H@cker" in all lines.                   ::
  59. :: Call :TEXTMAN RSA "Test.txt" "Elektro" "H@cker"                         ::
  60. ::                                                                         ::
  61. :: Delete the first 3 characters in all lines.                             ::
  62. :: Call :TEXTMAN C+ 3 "Test.txt"                                           ::
  63. ::                                                                         ::
  64. :: Delete the last 3 characters in all lines.                              ::
  65. :: Call :TEXTMAN C- 3 "Test.txt"                                           ::
  66. ::                                                                         ::
  67. :: Delete the first 3 lines.                                               ::
  68. :: Call :TEXTMAN L+ 3 "Test.txt"                                           ::
  69. ::                                                                         ::
  70. :: Delete the last 3 lines.                                                ::
  71. :: Call :TEXTMAN L- 3 "Test.txt"                                           ::
  72. ::                                                                         ::
  73. :: Delete all except the line number 3.                                    ::
  74. :: Call :TEXTMAN SL 3 "Test.txt"                                           ::
  75. ::                                                                         ::
  76. :: Delete all except the 3 to 9 range of lines.                            ::
  77. :: Call :TEXTMAN SR 3 9 "Test.txt"                                         ::
  78. ::                                                                         ::
  79. :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
  80.  
  81.  
  82. :TEXTMAN
  83. (SET /A "A=0", "LINE=0", "TOTAL_LINES=0")  &  (CALL :%~1 %* || (ECHO Invalid parameter & Exit /B 1)) & (GOTO:EOF)
  84. :AB
  85. (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (if "%%B" EQU "" ((Echo %~4)>> "%~3.NEW") ELSE ((Echo %~4%%B)>> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  86. :AE
  87. (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %%B%~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  88. :E
  89. (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B) >> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  90. :I
  91. (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF     "%%LINE%%" EQU "%~2" (IF NOT "%~4" EQU "" ((Echo %~4) >> "%~3.NEW") ELSE (Echo+>> "%~3.NEW"))" & (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW"))))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  92. :RL
  93. (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  94. :RS
  95. (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (CALL SET "STRING=%%B" &&     (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((CALL ECHO %%STRING:%~4=%~5%%)>> "%~3.NEW")))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  96. :RSA
  97. (For /F "tokens=1* delims=]" %%A in ('type "%~2" ^| find /n /v ""') DO (CALL SET "STRING=%%B" && (if "%%B" EQU "" (Echo+>> "%~2.NEW") ELSE ((CALL ECHO %%STRING:%~3=%~4%%)>>"%~2.NEW")))) && (CALL :RENAMER "%~2") & (GOTO:EOF)
  98. :C+
  99. (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~%~2%% >>      "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  100. :C-
  101. (For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~0,-%~2%% >>   "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
  102. :L+
  103. (Call SET /A "A=%~2") && (Call TYPE "%~3" |@MORE +%%A%% > "%~3.NEW") && (CALL :RENAMER "%~3") & (GOTO:EOF)
  104. :L-
  105. (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%!!|@%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%B >> "%~3.NEW"))
  106. :GL
  107. (Call SET /A "A=%~2" && Call SET /A "A-=1") && (Call TYPE "%~3" |@MORE +%%A%% > "%temp%\getline.tmp") && (For /F "tokens=1* delims=]" %%A in ('type "%temp%\getline.tmp" ^| find /n /v ""') DO ((if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)> "%~3.NEW"))) && ((CALL :RENAMER "%~3") & (GOTO:EOF)))
  108. :GR
  109. (For /F "tokens=1* delims=]" %%A in ('type "%~4" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "(IF "%%LINE%%" GEQ "%~2" IF "%%LINE%%" LEQ "%~3" (if "%%B" EQU "" (Echo+>> "%~4.NEW") ELSE ((Echo %%B)>> "%~4.NEW"))) && (IF "%%LINE%%" EQU "%~3" Exit /B 1)" || ((CALL :RENAMER "%~4") & (GOTO:EOF)))))
  110.  
  111. :RENAMER
  112. (REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)


Título: Re: Ayuda Script batch/powershell
Publicado por: ruvenhr en 12 Junio 2013, 11:52 am
Hoola,

Muchas gracias y lo siento por lo del código lo he leído tarde.

Ahora probare el código con TextMan y cuento como va.

Muchas gracias y de verdad perdón por lo del código :)


Título: Re: Ayuda Script batch/powershell
Publicado por: ruvenhr en 12 Junio 2013, 12:35 pm
Hoola de nuevo  ;D

Gracias por el código pero no consigo hacerlo funcionar, no me edita el kk.txt ni me crea ningún archivo nuevo, pero cuando lo hace lo hace al revés.

Me crea un nuevo archivo con el texto que hay entre las lineas separadoras de guiones.


También tarda un rato en funcionar ya que son 95.000 lineas de txt jajaja

Mercii


Título: Re: Ayuda Script batch/powershell
Publicado por: Eleкtro en 12 Junio 2013, 12:56 pm
Entonces usa esto:

Código
  1. @Echo OFF
  2. Setlocal enabledelayedexpansion
  3.  
  4. FOR /F "Usebackq Tokens=*" %%@ IN ("1.txt") DO (
  5. Set /A "Line+=1"
  6. If not !Line! GTR 14 (Echo %%@)
  7. )
  8.  
  9. Pause&Exit

Saludos


Título: Re: Ayuda Script batch/powershell
Publicado por: ruvenhr en 12 Junio 2013, 13:01 pm
Vale perfecto, editando el numero de lineas y creando un nuevo archivo me lo ha extraído perfecto.

Ahora la pregunta que no me sabe contestar nadie, para hacer lo mismo desde el final?

El principal problema es que el archivo kk.txt no tiene siempre el mismo tamaño de lineas.

Así que no se puede restar las lineas de X, porque X siempre va a ser diferente.


Muchas gracias de verdad :D


Título: Re: Ayuda Script batch/powershell
Publicado por: Eleкtro en 12 Junio 2013, 13:24 pm
Es muy sencillo:

Código
  1. @Echo OFF
  2. Setlocal enabledelayedexpansion
  3.  
  4. Set "File=kk.txt"
  5. Set /A "Cut=14" & REM Las lineas que queremos conservar, desde abajo.
  6.  
  7. FOR /F %%@ IN ('Type "%File%" ^| Find /v /c ""') DO (Set /A "Length=%%@-%Cut%")
  8.  
  9. for /f "tokens=1* delims=]" %%A in ('Type "%File%" ^| Find /n /v ""') do (
  10. Set /A "Line+=1"
  11. If !Line! GTR %length% (Echo %%B)
  12. )
  13.  
  14. Pause&Exit

PD1: ten en cuenta que ninguna línea empiece con el caracter: "]"

PD2: Para una mayor eficacia primero deberías hacerle un "reverse" el archivo de texto (darle la vuelta para que las lineas de abajo queden arriba del todo, y así se procesan primero) y usar el primer script en lugar de este último.

Hay muchas aplicaciones commandline para manejar archivos de texto y efectuar todo tipo de acciones... una de ellas es Tail:

Código
  1. Tail.exe --lines=14 "kk.txt"
(Con eso consigues hacer lo mismo que hace mi último script)

Saludos


Título: Re: Ayuda Script batch/powershell
Publicado por: ruvenhr en 13 Junio 2013, 09:47 am
Hoola bueno días,

Lo siento por dejar ayer de contestar de golpe, pero en la oficina entro un gran imprevisto y tuve que dejarlo todo.

Antes de nada muchísimas gracias, ya tengo el script creado y funcionando, siguiendo tus pasos e investigando un poco al final funciona :)

Ahora ya que el ordenador coja el solo los datos  ;D jajaja

Dejo el codigo esta vez bien insertado jajja



Código:
@echo off & setLocal enableDELAYedeXpansion
title: Extraer Datos kk.txt
set N=
echo extrayendo datos principio
for /f "tokens=* delims= " %%a in (kk.txt) do (
set /a N+=1
if !N! gtr 10 goto :done
>> salidakk.txt echo.%%a
)
:done
cls
echo extrayendo datos final
for /f "tokens=* delims= " %%a in (kk.txt) do (
set var8=!var7!
set var7=!var6!
set var6=!var5!
set var5=!var4!
set var4=!var3!
set var3=!var2!
set var2=!var1!
set var1=!var!
set var=%%a
)
echo !var8! >> salidakk.txt
echo !var7! >> salidakk.txt
echo !var6! >> salidakk.txt
echo !var5! >> salidakk.txt
echo !var4! >> salidakk.txt
echo !var3! >> salidakk.txt
echo !var2! >> salidakk.txt
echo !var1! >> salidakk.txt
echo !var! >> salidakk.txt
cls
echo Datos Extraidos a salidakk.txt

pause



por si a alguien le pudiera servir.


Resumiendo: Cojer los primeros datos y los ultimos del archivo creado por ROBOCOPY.


Muchisimas gracias otra vez.  ;-)


Título: Re: Ayuda Script batch/powershell
Publicado por: Eleкtro en 13 Junio 2013, 17:46 pm
Le puedes hacer algunas PEQUEÑAS mejoras al code que has mostrado, prueba a usarlo de esta manera:

Código:
@echo off & setLocal enableDELAYedeXpansion
Title Extraer Datos kk.txt

echo extrayendo datos principio

(for /f "usebackq delims=" %%a in ("kk.txt") do (
set /a N+=1
if !N! gtr 10 (goto :done)
Echo %%a
))> "salidakk.txt"

:done
cls
echo extrayendo datos final

for /f "usebackq delims=" %%a in ("kk.txt") do (
set "var8=!var7!"
set "var7=!var6!"
set "var6=!var5!"
set "var5=!var4!"
set "var4=!var3!"
set "var3=!var2!"
set "var2=!var1!"
set "var1=!var!"
set "var=%%a"
)

(For /L %%X in (1,1,8) Do (Echo !Var%%X!))>>"salidakk.txt"

cls
echo Datos Extraidos a salidakk.txt

Pause&Exit

Saludos!


Título: Re: Ayuda Script batch/powershell
Publicado por: ruvenhr en 17 Junio 2013, 10:39 am
Hoola buenaas,

Enserio muchas gracias, no tengo palabras, el mejor sin duda.

aunque aun le tengo que pillar un poco el truco al nuevo script jaja funciona de 10.


No se que decir, simplemente recomendable 100% y perfecto todo.  ;D

Muchas gracias de nuevo. :D

Saludos.