Acciones sobre archivos de texto. [Batch]

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

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

ovpaez

ok.. en el archivo de texto tengo la palabra usuario la cual se va a reemplazar dinamicamente con lo q traiga una variable... ya q  plantilla.inf es mi  archivo plano es una plantilla .. alli coloque usu en vez de la variable (pero es un ejemplo).. pero el codigo que te coloque hace el reemplazo de la variable perfectamente.. alli no tengo problemas.. pero necesito seguir ejecutando instrucciones.. pero primero necesito reemplazar ese archivo completamente y luego ejecutar ese archivo que estoy reemplazando ya que es una plantilla de politica se seguridad de windows... obvio todo dentro del mismo Script... Espero me haya sabido explicar... 

leogtz

¿Y el contenido del archivo?
¿Como se yo donde debo reemplazar?... para eso es el contenido del archivo.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

ovpaez

#22
[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=
[Event Audit]
[Registry Values]
MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineAccessRestriction=1,"O:BAG:BAD:(A;;CCDC;;;AN)(A;;CCDCLC;;;WD)(A;;CCDCLC;;;usuario)"
MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineLaunchRestriction=1,"O:BAG:BAD:(A;;CCDC;;;AN)(A;;CCDCLC;;;WD)(A;;CCDCLC;;;usuario)"
[Privilege Rights]
SeSecurityPrivilege = *usuario
[File Security]
"%SystemDrive%\DOCS",0,"D:PAR(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1301bf;;;usuario)(A;OICI;FA;;;SY)(A;OICI;0x1200a9;;;BU)"








Ese es el archivo a reemplazar.. y la palabra usuario es la q se va a reemplazar por usu como te puse el codigo anteriormente...

pero despues de reemplazar... desde del eof se cierra y no ejecuta otra instruccion la solucion fue hacer dos .bat pero es demasiado ineficiente se q se puede hacer en el mismo script eso creo!!?????




leogtz

Mira, si es que he entendido lo que quieres hacer, pues es fácil.

Lo explicaré:

Suponiendo que queremos cambiar una linea en el archivo "file.txt" (Esto lo modificas a tu gusto):

C:\>type "FILE.TXT"
[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=
[Event Audit]
[Registry Values]
MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineAccessRestriction=1,"
O:BAG:BAD:(A;;CCDC;;;AN)(A;;CCDCLC;;;WD)(A;;CCDCLC;;;usuario)"
MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineLaunchRestriction=1,"
O:BAG:BAD:(A;;CCDC;;;AN)(A;;CCDCLC;;;WD)(A;;CCDCLC;;;usuario)"
[Privilege Rights]
SeSecurityPrivilege = Este es mi texto
[File Security]
"%SystemDrive%\DOCS",0,"D:PAR(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1301bf;
;;usuario)(A;OICI;FA;;;SY)(A;OICI;0x1200a9;;;BU)"

C:\>


Ejecutamos este codigo:
Código (dos) [Seleccionar]
@echo off
for /f "tokens=1 delims=:" %%_ in ('type "file.txt" ^| findstr /r /n "^SeSecurityPrivilege"') do (
set "linea=%%_"
)
if not defined linea (
echo No hay coincidencia.
echo El programa cerrara ahora.
set /p =
exit /b 1
)
set "contenido=Este es mi texto" // Esto es por lo que se cambiara
echo Linea a editar : %linea%
echo Se editara por : SeSecurityPrivilege = %contenido%
(
echo %linea%
echo SeSecurityPrivilege = %contenido%
echo w
echo e
) | edlin /b file.txt > nul 2>&1
for /l %%_ in (1,1,3) do echo.
type "file.txt"
set /p =


El codigo buscara la linea a editar y la cambiara por esto:
echo SeSecurityPrivilege = %contenido%


Despues de ejecutar el codigo:

C:\>code.bat
Linea a editar : 11
Se editara por : SeSecurityPrivilege = Este es mi texto

[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=
[Event Audit]
[Registry Values]
MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineAccessRestriction=1,"
O:BAG:BAD:(A;;CCDC;;;AN)(A;;CCDCLC;;;WD)(A;;CCDCLC;;;usuario)"
MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineLaunchRestriction=1,"
O:BAG:BAD:(A;;CCDC;;;AN)(A;;CCDCLC;;;WD)(A;;CCDCLC;;;usuario)"
[Privilege Rights]
SeSecurityPrivilege = Este es mi texto
[File Security]
"%SystemDrive%\DOCS",0,"D:PAR(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1301bf;
;;usuario)(A;OICI;FA;;;SY)(A;OICI;0x1200a9;;;BU)"


C:\>

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

ovpaez

#24
Q pena  :-[

Bueno Creo que entendi el codigo que me diste.. Peroooo si te diste cuenta en el archivo hay varios sitios donde se encuentra la palabra usuario... Y lo de reemplazar las palabras que quiero en el archivo de texto ya eso lo programe este es el codigo
Código (dos) [Seleccionar]

if %1'==' (set p1=usuario
set p2=%varusuario%
set p3=Plantilla.inf) else (set p1=%1&& set p2=%2&& set p3=%3)
echo.>$
for /f "tokens=1,* delims=]" %%A in ('"type %p3%|find /n /v """') do (
    set "current=%%B"
    if defined current (
call :stng %p1% %p2%
    ) else echo.>>$
)
type $>%p3%
type %p3%
:stng
call set current=%%current:%1=%2%%
echo %current%>>$

goto : EOF




Ese codigo me reemplaza en el archivos todas las palabras usuario por usu, por el SID o variable que yo desee... Ese codigo va dentro de un bat donde se encuentran otras instrucciones...

if %1'==' (set p1=usuario
set p2=%varusuario%
set p3=Plantilla.inf) else (set p1=%1&& set p2=%2&& set p3=%3)
echo.>$
for /f "tokens=1,* delims=]" %%A in ('"type %p3%|find /n /v """') do (
    set "current=%%B"
    if defined current (
call :stng %p1% %p2%
    ) else echo.>>$
)
type $>%p3%
type %p3%
:stng
call set current=%%current:%1=%2%%
echo %current%>>$

goto : EOF

secedit /configure /cfg plantilla.inf /db secsetup.sdb /verbose

:: ------- Firewall-----
netsh.exe firewall set service type=REMOTEADMIN mode=ENABLE scope=ALL    
netsh.exe firewall show state

echo Configure los permisos del WMI con el usuario %filecontent% y luego presione Enter
pause

net stop winmgmt
net start winmgmt

Shutdown -r -t 00


Este es el bat

Como ya te he dicho lo hace todo pero hasta el eof ya la siguientes instrucciones no las realiza... y necesito q se ejecute todo :( y todo se debe realizar en un Script  para darle click y ya









leogtz

No, claro que no, solo se olvido tu duda.

Una pregunta, ¿aceptarías una solución en Perl?, por que no tengo acceso a sistemas con Windows.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

danibcn

Buenos tardes! :D

Me gustaría saber como ejecutar un bat o si hay un programa ya para modificar unos archivos de texto para eliminar ciertas palabras o lineas y que te lo guarde sin crear archivos a parte.

por ejemplo tengo 100 txt

y en todos quiero eliminar la palabra 'señor', reemplazar 'río' por 'lago' y cuando encuentre 'mar' eliminar desde 'mar' hasta la última linea o poder eliminar 6 ultimas lineas ;)

Quien me puede echar una mano?

0x0309

mira, lo mejor es que utilices un programa que te haga el trabajo, y simplemente lo llamas con parámetros.
Hay uno muy bueno que se llama gsar.exe

http://gnuwin32.sourceforge.net/packages/gsar.htm

Esta es su ayuda:


gsar, ver 1.21 -- Copyright (C) 1992-2008 Tormod Tjaberg & Hans Peter Verne

Usage: gsar [options] [infile(s)] [outfile]
Options are:
-s<string> Search string
-r[string] Replace string. Use '-r' to delete the search string from the file
-i         Ignore case difference when comparing strings
-B         just display search & replace Buffers
-f         Force overwrite of an existing output file
-o         Overwrite the existing input file
-c[n]      show textual Context of match, 'n' is number of bytes in context
-x[n]      show context as a heX dump, 'n' is number of bytes in context
-b         display Byte offsets of matches in file
-l         only List filespec and number of matches (default)
-h         suppress display of filespec when displaying context or offsets
-du        convert a DOS ASCII file to UNIX (strips carriage return)
-ud        convert a UNIX ASCII file to DOS (adds carriage return)
-F         'Filter' mode, input from stdin and eventual output to stdout
-G         display the GNU General Public Licence

Ctrl characters may be entered by using a ':' in the string followed by the
ASCII value of the character. The value is entered using ':' followed by three
decimal digits or ':x' followed by two hex numbers. To enter ':' use '::'


Por ejemplo yo tengo el siguiente script para modificar rápidamente el boot.ini y activar dep para todos los programas y servicios. Esto normalmente, se hace yendo a Propiedades de pc ... y varios clics. En cambio yo automaticé el proceso. Activar dep para todos los programas es para aumentar la seguridad del equipo y que no te vulneren el sistema operativo con drivers.


@echo off
reg.exe delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /f >nul 2>&1
(set file=%SystemDrive%\boot.ini)
attrib.exe -a -s -h -r "%file%" >nul 2>&1
gsar.exe -i -o -sNoExecute=OptIn -rNoExecute=OptOut "%file%" >nul 2>&1
if not errorlevel 1 (
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\NoExecuteState" /v LastNoExecuteRadioButtonState /t REG_DWORD /d 13013 /f >nul 2>&1
)
attrib.exe +a +s +h +r "%file%" >nul 2>&1


Lo que hace mi código es reemplazar en el boot.ini:
NoExecute=OptIn
por
NoExecute=OptOut

Si es que existe el texto OptIn, sino devuelve errorlevel 1 que significa que no reemplazo nada porque no encontró el texto de entrada en el archivo.

Yo te recomiendo este programa porque lo he probado y funciona bien.

P3YOX

#29
BUENAS  Soy bastante novato  En esto del batch pero  copiando y pagando analisando he conseguido resultados  pero aún asi no me alcansa la suerte es por eso que necesito tu ayuda  ^^   tengo un batch  pesca un archivo de texto y lo  ingresa a una variante  y  ese contenido  lo transformo  sin ningun problema  EL  PROBLEMA SE PRODUCE  que no puedo encontrar un codigo queme tome  todo  el contenido del texto y me lo ingrese a mi  variante solo conseguí uno  que me  tome la primera linea  no todo el contenido del txt  esto es lo  que tengo

Citarecho.
for /f  %%a in (nuevo.txt) do (
set var=%%a
goto next)
:next
echo %var:~0%
set var=%var:~0%
etc
etc...

Y tambien la posivilidad d eke  me  intregre  varios archivos de  texto con  nombrs en comun ala variante  como por ejemplo  un  *00.txt
de antemanos gracias