Buenas quería saber como editar un archivo.ini con bat necesito editar cierta línea de un ini extenso que contiene espacios

Ejemplo necesito editar donde dice XPstyle=1 por XPstyle=123 sin que me cambie nada más ni me ponga caracteres extraños en el resto del ini ni me elimine las líneas en blanco, por favor necesito su ayuda

[ButtonbarVertical]
Buttonbar=%COMMANDER_PATH%\vertical.bar
Buttonheight=31
Buttonheight96=31
FlatIcons=1
SmallIcons=1
SmallIconSize=16
SmallIconSize96=16
DefaultDpi=96
XPstyle=1

[Packer]
ZIPlikeDirectory=1
InternalUnarj=0
InternalUnlzh=0
RAR=%COMMANDER_PATH%\Compresores\rar\winrar.exe
InternalZip=1
InternalUnzip=1
zipnt=0

1 respuesta

Respuesta
1

Prueba con esto:

@echo off
set carpeta=d:\carpeta prueba
set archivo=DC.ini
pushd %carpeta%
del /q kkk.ini>nul 2>&1
echo.> temp.txt
for /f "skip=2 tokens=1*" %%x in ('fc /LB1000 /n temp.txt "%archivo%" ^| findstr -v "*****"') do (
if "%%y" == "" echo.>> kkk.ini
if not "%%y" == "" (
   if "%%y" == "XPstyle=1" (echo XPstyle=123>>kkk.ini
      ) else echo %%y>>kkk.ini
   )
)
Popd

En las variables CARPETA y ARCHIVO pon el path de la carpeta en la que está el archivo INI que quieres cambiar y el nombre del archivo, respectivamente. Si el archivo INI tiene más de 1000 líneas modifica a un valor superior al máximo de líneas del INI el parámetro LB del comando FC.

El archivo modificado se deja en KKK.INI. Si compruebas que funciona como se espera puedes añadir, antes del comando POPD algo como:

copy /y kkk.ini "%archivo%"

Muchas gracias x Responder eres el unico q creo me puedes ayudar el,archivo tiene casi 2000 lineas, esta en una carpeta supongamos TC y se llama wincmd.ini, bat quiero q este en la misma carpeta q el archivo ini para q si la cambio de lugar sigua funcionando.Me puedes dar un ejemplo mas especifico con los datos anteriores Carpeta TC\wincmd.ini

A y lo que dice en XPstyle=1 no lo se puede ser 1 o puede ser ABC yo quiero que tenga lo que tenga que no lo Se, Localice la línea XPstyle= y ponga lo que yo quiera que en este caso es 123 para el ejemplo, Muchas Gracias de antemano Por favor si puede ayúdeme.

Tu Respuesta Funciona Lo q ase falta mejorarla para lo q yo quiero ya cambie el parametro LB a 2000 y ok, ahora lo que Yo quiero es que el bat este en la misma carpeta que el .ini para no tener q especificar la ruta y asi deveria de funcionar aunque lo cambie de lugar ¿o no?.Ademas lo q quiero es que localice la linea que quiera editar para el ejemplo XPstyle=1 y q tenga lo q tenga  sea 1 o abc  lo reemplace x lo q yo quiera

Algunos comentarios:

1. El LB a 2000 es correcto. Las modificaciones de ese parámetro influyen en lo que tarde el BAT en ejecutarse, por eso es mejor ajustarse un poco a la realidad en lugar de poner un valor enorme por defecto.

2. Tal como está planteado el BAT no es necesario que esté en la misma carpeta que el INI. Los comandos PUSHD y POPD hacen que esté donde esté el BAT trabaje sobre la carpeta indicada en la variable CARPETA y el archivo indicado en la variable ARCHIVO dentro de esa carpeta

3. No hay problema en modificar el BAT para que se centre en la línea que empiece por "XPStyle=" y la sustituya por otra.

Mira a ver si esta versión del BAT cumple todas tus expectativas:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=c:\TC
set archivo=wincmd.ini
set valor=123
pushd %carpeta%
del /q kkk.ini>nul 2>&1
echo.> temp.txt
for /f "skip=2 tokens=1*" %%x in ('fc /LB1000 /n temp.txt "%archivo%" ^| findstr -v "*****"') do (
if "%%y" == "" echo.>> kkk.ini
if not "%%y" == "" (
   set linea=%%y
   if "!linea:~0,8!" == "XPstyle=" (echo XPstyle=%valor%>>kkk.ini
      ) else echo %%y>>kkk.ini
   )
)
Popd

He estado pensando que tal vez, a pesar de todo, prefieras que el BAT esté en la carpeta del INI y así, como dices, no sería necesario usar la variable CARPETA, ni PUSHD/POPD.

Para eso podrías usar esta versión del BAT:

@echo off
Setlocal EnableDelayedExpansion
set archivo=wincmd.ini
set valor=123
del /q kkk.ini>nul 2>&1
echo.> temp.txt
for /f "skip=2 tokens=1*" %%x in ('fc /LB2000 /n temp.txt "%archivo%" ^| findstr -v "*****"') do (
if "%%y" == "" echo.>> kkk.ini
if not "%%y" == "" (
   set linea=%%y
   if "!linea:~0,8!" == "XPstyle=" (echo XPstyle=%valor%>>kkk.ini
      ) else echo %%y>>kkk.ini
   )
)

Bien eso Funciona perfecto pero si cambio XPstyle= x el nombre de otra linea para editarla  No me Funciona el bat no cambia nada solo funciona con XPstyle=, y cambie en los 2 lugares q aparece XPstyle= me parece que es xq hay q cambiar esto tambien if "!linea:~0,8!" me parece el experto sos voz

if "!linea:~0,8!"

Porque necesito editar más líneas no es solo XPstyle(OJO no en el mismo bat conque el bat me edite una sola línea me basta lo que me hace falta es que pueda trabajar con cualquier línea y no solo con XPstyle) y me parece que tu ultimo ejemplo funcionaria Bien para eso lo que hay que cambiar al parecer algo más que el nombre de la línea a editar

y no se que es

Por ejemplo con tu ultima respuesta has que se edite la línea de arriba de XPstyle que es DefaultDpi= por lo que tu quieras y dime lo que hay que cambiar para alternar de Línea a editar.

No acabo de entender muy bien que es lo que te propones, por eso me limitaré a explicarte lo que afecta a la línea en cuestión:

Hay que contar el número de caracteres a considerar en la línea. En el caso de "XPStyle=" son ocho caracteres desde el principio, por eso en

if "!linea:~0,8!"

el primer parámetro es cero (la cuenta empieza en cero) y el segundo es ocho. Para el que propones "DefaultDpi=" la cuenta sería 11, de modo que el IF sería

if "!linea:~0,11!" == "DefaultDpi=" (echo DefaultDpi=%valor%>>kkk.ini

Se podría intentar parametrizar con variables. Algo como:

@echo off
setlocal EnableDelayedExpansion
set archivo=wincmd.ini
set valor=123123
set param=DefaultDpi
set long=11
del /q kkk.ini>nul 2>&1
echo.> temp.txt
for /f "skip=2 tokens=1*" %%x in ('fc /LB2000 /n temp.txt "%archivo%" ^| findstr -v "*****"') do (
if "%%y" == "" echo.>> kkk.ini
if not "%%y" == "" (
   set linea=%%y
   if "!linea:~0,%long%!" == "%param%=" (echo %param%=%valor%>>kkk.ini
      ) else echo %%y>>kkk.ini
   )
)

No sé si queda claro que en la variable PARAM pones el literal del parámetro que quieres cambiar y en la variable LONG la longitud del literal (sumándole 1 para incluir el =)

OK ;Mil¡Gracias! Por Su Tiempo con esa Informacion Voy A Ver Si puedo Aser lo que me Propongo sino Le voy a dar mas detalles de en lo q estoy Trabajando Muchisimas Gracias Mister

Amigo con toda esa información que me proporcionaste logre casi todo lo que quería lo único que me falta es que el archivo kkk.ini quede con el nombre

wincmd.ini

reemplace al original y borar el archivo tem.txt

Bueno eso es bastante sencillo:

@echo off
Setlocal EnableDelayedExpansion
set archivo=wincmd.ini
set valor=123123
set param=DefaultDpi
set long=11
del /q kkk.ini>nul 2>&1
echo.> temp.txt
for /f "skip=2 tokens=1*" %%x in ('fc /LB2000 /n temp.txt "%archivo%" ^| findstr -v "*****"') do (
if "%%y" == "" echo.>> kkk.ini
if not "%%y" == "" (
   set linea=%%y
   if "!linea:~0,%long%!" == "%param%=" (echo %param%=%valor%>>kkk.ini
      ) else echo %%y>>kkk.ini
   )
)
copy /y kkk.ini %archivo%
del /q temp.txt>nul 2>&1
del /q kkk.ini>nul 2>&1

Bien Olvida lo Ultimo que puse. Ya Logre todo lo que quería Gracias A Dios por Encontrarte Y Gracias A Ti por Todo Tu Tiempo y Dedicación Muchísimas Gracias por Todo Dios Te Bendiga.Al Final Me quedo así

@echo off
Setlocal EnableDelayedExpansion
set archivo=wincmd.ini
set valor=123
del /q kkk.ini>nul 2>&1
echo.> temp.txt
for /f "skip=2 tokens=1*" %%x in ('fc /LB2000 /n temp.txt "%archivo%" ^| findstr -v "*****"') do (
if "%%y" == "" echo.>> kkk.ini
if not "%%y" == "" (
   set linea=%%y
   if "!linea:~0,5!" == "hola=" (echo hola=%valor%>>kkk.ini
      ) else echo %%y>>kkk.ini
   )
)
del /q temp.txt
Move /y kkk.ini wincmd.ini
cls
Echo Gracias a gggirald
Pause

Me alegro mucho de haberte sido de ayuda. Creo que debes adoptar la versión parametrizada porque es más cómodo concentrar las variables que hay que retocar y se corre menos riesgo de que se olvide algo. He visto que has hecho otra pregunta relacionada con esto. Por mi parte podríamos haber seguido por aquí, pero realmente lo correcto es abrir otra. Te contestaré por allí.

¡Gracias! Si Pensé en seguir por aquí lo que como ya este hilo se hizo tan largo y una vez vi creo que en este mismo foro que paso lo mismo se desviaron a otra Pregunta y respomdieron que lo correcto era hacerla aparte por eso la hice aparte,además La Pregunta inicial Ya Me la respondiste exelentemente Gracias

Aquí voy a poner dos versiones que no respetan las líneas en blanco pero a cambio no dividen las líneas de más de 128 caracteres. Primero la que trata solo un parámetro del archivo INI y cambia su valor:

@echo off
Setlocal EnableDelayedExpansion
set archivo=wincmd.ini
set par1=DefaultDpi
set long1=11
set val1=123123
del /q kkk.ini>nul 2>&1
for /f "usebackq tokens=*" %%y in ("%archivo%") do (
   set linea=%%y
   if "!linea:~0,%long1%!" == "%par1%=" (echo %par1%=%val1%>>kkk.ini
      ) else echo %%y>>kkk.ini
   )
)
copy /y kkk.ini %archivo%
Del /q kkk.ini>nul 2>&1

Y ahora una versión que permitiría cambiar hasta 3 parámetros a la vez:

@echo off
Setlocal EnableDelayedExpansion
set archivo=wincmd.ini
set par1=DefaultDpi
set long1=11
set val1=123123
set par2=hola
set long2=5
set val2=pepito
set par3=SmallIconSize
set long3=14
set val3=123123
del /q kkk.ini>nul 2>&1
for /f "usebackq tokens=*" %%y in ("%archivo%") do (
   set linea=%%y
   if "!linea:~0,%long1%!" == "%par1%=" (echo %par1%=%val1%>>kkk.ini
      ) else if "!linea:~0,%long2%!" == "%par2%=" (echo %par2%=%val2%>>kkk.ini
                ) else if "!linea:~0,%long3%!" == "%par3%=" (echo %par3%=%val3%>>kkk.ini
                          ) else echo %%y>>kkk.ini
   )
)
copy /y kkk.ini %archivo%
del /q kkk.ini>nul 2>&1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas