Dudas sobre Text Manipulator Routine de Elektro

Iniciado por ElPulga, 28 Enero 2014, 21:27 PM

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

ElPulga

Hola: Este es mi primer post aqui, hace rato lo descubri y lo leo seguido, y hoy decidi registrarme.
La duda que tengo es sobre el batch creado por Elektro para manipular texto de un archivo.

Hasta ahora solo lo he usado haciendo una llamada dentro un bat, pero esta vez necesito algo mas complejo.

si pongo dentro de mi bat:
Call :TEXTMAN I 135 "archivo" "texto"
funciona

Pero si pongo:
Call :TEXTMAN I 135 "archivo" "texto"
Call :TEXTMAN RL 237 "archivo" "texto"

obtengo un error y solo ejecuta la primera linea.
Obviamente dentro de mi archivo bat pongo el codigo tanto para I como para RL.

Es posible alguna solucion para que yo dentro de un bat llame mas de una vez a :TEXTMAN?

Gracias

Eleкtro

#1
Hola, he probado a llamar al método utilizando el parámetro "I" seguido del parámetro "RL" y en mi caso me funcionó, quizás sea un error muy específico :-/.

¿Te sale algún mensaje de error?
¿Puedes describir el mensaje de error?
¿Puedes mostrar el contenido exacto de la linea 237?
También sería buena idea que mostrases el script completo que estás usando para llamar al TextMan.

De todas formas aquí tienes la última versión que hice del script por si estuvieras usando una versión antigua...
Citar@Echo OFF


:: TEXT MANIPULATOR ROUTINE v0.5
:: by Elektro H@cker


REM SYNTAX:
::
:: TEXTMAN [ACTION] [LINE(S)] [FILE] [TEXT]
::
:: * [LINE(S)] parameter is Optional for some actions
:: * [TEXT] parameter is Optional for some actions


REM ACTIONS:
::
::  AB  = ADD_BEGINNING      * Add text to the beginning of a line.
::  AE  = ADD_ENDING         * Add text to the end of a line.
::  E   = ERASE              * Delete a line.
::  I   = INSERT             * Add a empty line (Or a line with text).
::  RL  = REPLACE_LINE       * Replace a entire line.
::  RS  = REPLACE_STRING     * Replace word from line.
::  RSA = REPLACE_STRING_ALL * Replace word from all lines.
::  C+  = CHARACTER_PLUS     * Delete the first "X" characters from all lines.
::  C-  = CHARACTER_LESS     * Delete the last  "X" characters from all lines.
::  L+  = LINE_PLUS          * Cut the first "X" amount of lines.
::  L-  = LINE_LESS          * Cut the last  "X" amount of lines.
::  GL  = GET_LINE           * Delete all except "X" line.
::  GR  = GET_RANGE          * Delete all except "X" range of lines.


REM EXAMPLES:
::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
::                                                                         ::
:: Delete the line 3                                                       ::
:: Call :TEXTMAN E 3 "Test.txt"                                            ::
::                                                                         ::                                                                        
:: Add a string to the beginning of line 3                                 ::
:: Call :TEXTMAN AL 3 "Test.txt" "Elektro H@cker"                          ::
::                                                                         ::                                                                      
:: Add a string to the end of line 3.                                      ::
:: Call :TEXTMAN AR 3 "Test.txt" "Elektro H@cker"                          ::
::                                                                         ::                                                                      
:: Add a empty line at line 3.                                             ::
:: Call :TEXTMAN I 3 "Test.txt"                                            ::
::                                                                         ::                                                                      
:: Add a line with a word at line 3.                                       ::
:: Call :TEXTMAN I 3 "Test.txt" "Elektro H@cker"                           ::
::                                                                         ::    
:: Replace the line 3 with "Elektro H@cker".                               ::
:: Call :TEXTMAN RL 3 "Test.txt" "Elektro H@cker"                          ::
::                                                                         ::
:: Replace the words "Elektro" to "H@cker" in line 3.                      ::
:: Call :TEXTMAN RS 3 "Test.txt" "Elektro" "H@cker"                        ::
::                                                                         ::
:: Replace the words "Elektro" to "H@cker" in all lines.                   ::
:: Call :TEXTMAN RSA "Test.txt" "Elektro" "H@cker"                         ::
::                                                                         ::
:: Delete the first 3 characters in all lines.                             ::
:: Call :TEXTMAN C+ 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete the last 3 characters in all lines.                              ::
:: Call :TEXTMAN C- 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete the first 3 lines.                                               ::
:: Call :TEXTMAN L+ 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete the last 3 lines.                                                ::
:: Call :TEXTMAN L- 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete all except the line number 3.                                    ::
:: Call :TEXTMAN SL 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete all except the 3 to 9 range of lines.                            ::
:: Call :TEXTMAN SR 3 9 "Test.txt"                                         ::
::                                                                         ::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::


:TEXTMAN
(SET /A "A=0", "LINE=0", "TOTAL_LINES=0")  &  (CALL :%~1 %* || (ECHO Invalid parameter & Exit /B 1)) & (GOTO:EOF)
:AB
(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)
:AE
(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)
:E
(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)
:I
(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)
:RL
(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)
:RS
(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)
:RSA
(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)
:C+
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~%~2%% >>      "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:C-
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~0,-%~2%% >>   "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:L+
(Call SET /A "A=%~2") && (Call TYPE "%~3" |@MORE +%%A%% > "%~3.NEW") && (CALL :RENAMER "%~3") & (GOTO:EOF)
:L-
(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%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%B >> "%~3.NEW"))
:GL
(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)))
:GR
(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)))))

:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)

Saludos!








ElPulga

La parte del codigo que llama a TEXTMAN es el siguiente:


cd %PROGRAMFILES%\Zabbix Agent\
Call :TEXTMAN I 135 "zabbix_agentd.conf" "HostMetadataItem=system.uname"
Call :TEXTMAN RL 237 "zabbix_agentd.conf" "UserParameter=specHWShort,cscript.exe /nologo "C:\Program Files\Zabbix Agent\specHWShort.vbs" "

:TEXTMAN
(SET /A "A=0", "LINE=0", "TOTAL_LINES=0")  &  (CALL :%~1 %* || (ECHO Invalid parameter & Exit /B 1)) & (GOTO:EOF)
:I
(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)
:RL
(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)

:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)


La linea 237 no tiene nada, probe con RL por que no me dejaba correr 2 veces I
El error es
"))) && (CALL :RENAMER "zabbix_agentd.conf") & (GOTO:EOF) was unexpected at this
time.


Espero que ayude.
Gracias.

Eleкtro

#3
Segúramente el error sea por las comillas dobles, la comilla doble está reservada y debes escapar el símbolo si lo quieres utilizar dentro de un argumento:
Código (dos) [Seleccionar]
Call :TEXTMAN RL 237 "zabbix_agentd.conf" "UserParameter=specHWShort,cscript.exe /nologo ^"C:\Program Files\Zabbix Agent\specHWShort.vbs^" "

Si te sigue sin funcionar prueba a escapar también el símbolo del "=" por si están afectando al FOR:
Código (DOS) [Seleccionar]
Call :TEXTMAN I 135 "zabbix_agentd.conf" "HostMetadataItem^=system.uname"
Call :TEXTMAN RL 237 "zabbix_agentd.conf" "UserParameter^=specHWShort,cscript.exe /nologo ^"C:\Program Files\Zabbix Agent\specHWShort.vbs^" "


Y si aún así te sigue sin funcionar, deberías utilizar alguna utilidad externa como SED ~> http://gnuwin32.sourceforge.net/packages/sed.htm

PD: Imagino que despues de llamar al método estarás haciendo una pausa en el código como esto:
Call :TEXTMAN ...
Call :TEXTMAN ...
Pause


...De lo contrario, es normal que te de un error.

Saludos!








ElPulga

No, no funciona, me sigue tirando el mismo error y no me agrega la segunda linea.

El tema es que este archivo que estoy modificando lo hago luego de instalar un programa, si tambien tengo que instalar SED se va a complicar mas.

Ver que puedo hacer, si hay algun ejemplo mejor me ayudaria bastante.

Gracias.