Agregar una línea de texto a un archivo .bat
Espero estén muy bien. Quería consulta si me podrían ayudar con algo, tengo un archivo .bat el cual ya esta creado, pero necesito añadir una línea de texto más debido a una actualización, Ejemplo:
@echo off SET DATADRIVER=%~d0 SET DATAEXEDIR=%~d0 %DATADRIVER% cd %DATAEXEDIR% if exist ..\bat\dtacustom.bat goto :custom :custom ..\bat\dtacustom.bat %1 :end exit
a eso mismo, necesito añadirle una línea de texto debajo de "cd %DATAEXEDIR%", quedando de la siguiente manera
@echo off SET DATADRIVER=%~d0 SET DATAEXEDIR=%~d0 %DATADRIVER% cd %DATAEXEDIR% start updtdatal.exe if exist ..\bat\dtacustom.bat goto :custom :custom ..\bat\dtacustom.bat %1 :end exit
solo necesito añadir el "start updtdatal.exe" sin que se modifique nada mas del texto.Espero se entienda la idea, y me pueda ayudar. Muchísimas gracias.Un abrazo.
1 Respuesta
No le veo ningún problema a la modificación del BAT que planteas, de modo que las preguntas serían:
¿Has probado el bat modificado?
Si lo has probado, ¿cuál es el problema?
Hola, lamento si no se entendió bien la idea
Necesito poder crea un .BAT que me añada una línea de código ("start updtdatal.exe") en un archivo .TXT, solo añadir ese código y mantener lo demás que ya se encuentra dentro del mismo .TXT,
dejo el mismo ejemplo
este es el .TXT
@echo off SET DATADRIVER=%~d0 SET DATAEXEDIR=%~d0 %DATADRIVER% cd %DATAEXEDIR% if exist ..\bat\dtacustom.bat goto :custom :custom ..\bat\dtacustom.bat %1 :end exit
a ese mismo, con un archivo .bat necesito añadirle el "start updtdatal.exe" y al ejectuarlo, el txt me quede así
@echo off SET DATADRIVER=%~d0 SET DATAEXEDIR=%~d0 %DATADRIVER% cd %DATAEXEDIR% start updtdatal.exe if exist ..\bat\dtacustom.bat goto :custom :custom ..\bat\dtacustom.bat %1 :end exit
con la línea de código "start updtdatal.exe" debajo de "cd %DATAEXEDIR%"
se entiende mejor?,
Muchas gracias por la ayuda
Saludos.
Hola, buenas tardes,
Mirando algunos comentarios, llegue a este código que me crea lo que necesito, pero al ejecutarlo me agrega la línea de código al final de el archivo np1shell.bat
@echo off title Light_Start color 70 set ruta=D:\Nodos\General\Beb\new1\bat\np1shell.bat echo. cls echo start updtServiceExec.exe >> %ruta% echo. echo fijate en el archivo, se agrego "start updtServiceExec.exe". echo. echo Si esta correcto, pulsa "s" para continuar y reiniciar echo Si quieres continuar sin reinicar, preciona "n" pause cls set/p reinciar= reinciamos, "s" "n"? echo. if %reinciar%==s goto reinciarse else goto noreiniciar :noreiniciar cls echo Cambios Aplicados, adios. pause exit :reinciarse cls echo Cambios Aplicados, ahora reiniciaremos. pause>nul shutdown -l exit
me gustaría saber si hay alguna forma de mandar ese mismo código "start updtServiceExec.exe" pero que me lo guarde en la línea N°6 del archivo np1shell.bat, y no al final del todo como lo esta haciendo ahora
adjunto imagen de prueba
Muchas gracias nuevamente
Saludos.
No entraré en la posible utilidad de lo que pides. Si el ejemplo que aportas lo guardo en un archivo ENTRADA.TXT, el siguiente BAT dejará en SALIDA.TXT el archivo modificado:
@echo off del /q salida.txt>nul 2>&1 set nomarch=entrada.txt set cadena="cd" set linea=start updtdatal.exe for /f "tokens=*" %%a in (%nomarch%) do ( echo %%a>>salida.txt echo "%%a" ^^| find %cadena%>nul&&echo %linea%>>salida.txt ) goto :EOF
Resulta que no vi el último aporte hasta después de enviar el mío, porque no estaba conectado a red. No sé si de todas formas te sirve el BAT que te proponía, aunque espero que sí. Ya nos dirás.
Está claro que si incluyes una línea mediante un ECHO {loquesea} >> {archivoexistente} se añade al final del archivo porque ese es el modo de trabajo de ">>". Para adaptar mi BAT a tus necesidades creo que quedaría así:
@echo off del /q salida.txt>nul 2>&1 set nomarch=D:\Nodos\General\Beb\new1\bat\np1shell.bat set cadena="cd" set linea=start updtServiceExec.exe for /f "tokens=*" %%a in (%nomarch%) do ( echo %%a>>salida.txt echo "%%a" ^^| find %cadena%>nul&&echo %linea%>>salida.txt ) Pause
Si, una vez comprobado que funciona como esperas, quieres reescribir el NPQSHELL.BAT solo tendrías que añadir, por ejemplo,
copy /y salida.txt %normarch%
Muchas gracias!,
me funciono de maravilla!, pero me quedan unas dudas
¿hay alguna forma de validar si ya tiene el "start uptServiceExec.exe"? y en caso de que ya exista, dejar en un mensaje en pantalla?
lo otro, ¿Cómo hiciste que apareciera exactamente en la línea 6?, estuve mirando el código pero no entiendo donde ejecutas eso.
Quiero aprender de esto, me tiene emocionado,
si me puedes contestar esas preguntas me seria de mucha ayuda para entender como funciona
Gracias!, un abrazo
Me alegro mucho.
Respecto a la primera duda, sí que hay forma de comprobar, antes de insertar la línea del START que el EXE a lanzar no esté activo. Esto obliga a concretar un poco el BAT de inserción porque ya hay que partir de que la línea a inserta contiene un START y la variable, ahora, sería el EXE (en la versión actual no nos importa lo que se inserta, variable LINEA). Ahora no puedo dedicarme mucho a preparar esta otra versión, pero lo haré en cuanto tenga tiempo.
Por cierto, además de sacar un mensaje advirtiendo del hecho de que el EXE ya está activo, ¿se debe cancelar la inserción o se mantiene la modificación del BAT?
Respecto a la segunda duda lo que hace el BAT es localizar una línea en el archivo tratado que contenga la cadena "CD" y, si la encuentra, insertar el contenido de la cadena LINEA antes de seguir copiando en SALIDA.TXT las restantes líneas del archivo de entrada. Si hubiera que comprobar no solo que la línea contiene "CD" sino que son los primeros caracteres de la línea habría que complicar un poco el BAT.
Cuando tenga la nueva versión probada en mi entorno te la pasaré por aquí. Te adelanto que se basará en usar el comando TASKLIST.
Al final he tenido un ratillo para dedicarlo a este asunto. Esta es la versión que te propongo:
@echo off del /q salida.txt>nul 2>&1 set nomarch=D:\Nodos\General\Beb\new1\bat\np1shell.bat set cadena="cd" set programa=updtServiceExec.exe for /f "tokens=1 delims= " %%a in ('tasklist /NH /FO TABLE /FI "imagename eq %programa%"') do if "%%a"=="%programa%" echo el programa %%a ya esta activo&goto :EOF for /f "tokens=*" %%a in (%nomarch%) do ( echo %%a>>salida.txt echo "%%a" ^^| find %cadena%>nul&&echo start %programa%>>salida.txt ) echo copy /y salida.txt %normarch% Pause
Esta versión no modifica el BAT de NOMARCH si el programa ya está activo pero informa de esa circunstancia por consola. Si se quiere otro comportamiento no habría mucho problema en habilitarlo. Tampoco reescribe el archivo NOMARCH. En lugar de eso se presenta en consola el comando COPY que haría la reescritura. Para que fuera efectiva solo habría que suprimir el "ECHO" de la penúltima línea.
Ya nos dirás.
Hola, disculpa la demora en responder,
Me funciono bien, solo hice algunas modificaciones para validar que en los archivos ya no existiera el código de "updtServiceExec.exe", con FIND y un IF %errorlevel%
lo que si, ahora note que hay algunos archivos(np1shell.bat) que tienen 2 "cd" dentro, entonces la variable "Cadena" hace que se duplique, dado existen 2 "cd" dentro del mismo archivo,
quería consultar si de casualidad se podrá hacer que solo tome el primer "cd" que encuentre, que es el que esta en la linea5, para que no se duplique el "updtServiceExec.exe" en caso de que se encuentren 2 líneas con "cd"
espero se entienda
Gracias!, un abrazo
Te propongo algo como esto:
@echo off del /q salida.txt>nul 2>&1 set nomarch=D:\Nodos\General\Beb\new1\bat\np1shell.bat set cadena="cd" set /a nrep=0 set programa=updtServiceExec.exe for /f "tokens=1 delims= " %%a in ('tasklist /NH /FO TABLE /FI "imagename eq %programa%"') do if "%%a"=="%programa%" echo el programa %%a ya esta activo&goto :EOF for /f "tokens=*" %%a in (%nomarch%) do ( echo %%a>>salida.txt echo "%%a" ^^| find %cadena%>nul&&call :tratacadena ) echo copy /y salida.txt %normarch% Pause :tratacadena if nrep==0 (echo start %programa%>>salida.txt&set /a nrep=1) goto :eof
Creo que valdrá para que solo trate el primer CD. Seguramente se podría incluir el tratamiento dentro del propio FOR/FIND pero por si hay que hacer más cosas creo que es mejor crear una "subrutina" para ello. Ya nos dirás.
Muchas gracias por la respuesta,
Ahora lo probé, pero no hace nada, si bien esta claro se que le quita el "ECHO" para que copie a la ruta, no vi diferencia en el np1shell.
Te dejo el código que estuvimos trabajando y que adapte, este es el que aplique a bastantes maquinas para que pueda levantar el nuevo servicio
@echo off Color 70 del /q salida.txt>nul 2>&1 set rutaNP1=E:\newpos1\bat\np1shell.bat find "updtServiceExec" %rutaNP1%>nul if %errorlevel% equ 0 ( color c echo. echo Ya se encuentra el comando "Start updtServiceExec.exe" APLICADO echo. echo NO se permite -Duplicidad- echo. timeout 5 exit) else (echo Buscando...) if exist %rutaNP1% ( echo Ruta encontrada) else ( echo No se ha podido encontrar el archivo timeout 5 exit) set cadena="cd" set linea=start updtServiceExec.exe for /f "tokens=*" %%a in (%rutaNP1%) do ( echo %%a>>salida.txt echo "%%a" ^^| find %cadena%>nul&&echo %linea%>>salida.txt ) copy /y salida.txt %rutaNP1%>nul Echo. Echo Cambios Aplicados Echo. Echo Verificar en np1shell(linea6) que se encuentre "start updtServiceExec.exe" timeout 5 exit
El inconveniente es que en algunas maquinas tienen dentro del código 2 o más "CD" como te comente, por lo que en realidad ahora más que validar el primer "CD" y copiarlo, necesito eliminar el segundo "updtServiceExec.exe" que se encuentre, dado que se encuentra duplicado en algunas maquinas y nos da un error el levantar los demás servicios, he buscado algunas soluciones pero solo he logrado eliminar el archivo completo ja ja
Pensaba algo como... si encuentra duplicado el "updtServiceExec.exe" eliminar el segundo, pero no logro llevarlo a algo real, solo elimino el archivo completo
Quizás se te ocurre algo mucho mejor y real, me seria de gran ayuda
Un abrazo
Entiendo que estamos ante dos problemas diferentes:
- Crear un bat que revise todos los entornos y elimine las duplicidades de la línea "start updtServiceExec.exe" provocadas por la presencia de más de una línea que empiece por "cd" en algún BAT ya tratado o por la nueva aplicación del BAT a un BAT ya tratado
- Crear un bat que añada la línea de "start updtServiceExec.exe" solo tras la primera línea que empiece por "cd" y solo si esa línea no existe ya.
Para el punto 2 era el último BAT aportado aunque ahora me da la impresión de que interpreté mal tu comentario del 11 de agosto ¿Hay alguna forma de validar si ya tiene el "start uptServiceExec.exe"? Ahora me parece que no se trataba de comprobar si ya estaba lanzada la tarea en la máquina sino si el bat ya incluía esa línea.
Imagino que lo que pretendes con el bat que has aportado es que valga para los dos problemas. Este es el que te propongo:
@echo off Setlocal EnableDelayedExpansion Color 70 del /q salida.txt>nul 2>&1 set rutaNP1=E:\newpos1\bat\np1shell.bat set linea=start updtServiceExec.exe set /a nrep=0 for /f "tokens=3" %%a in ('find /c "%linea%" %rutaNP1%') do ( if "%%a"=="encuentra" ( echo No se ha podido encontrar el archivo %rutaNP1% goto :salir ) if %%a equ 0 goto :insertar if %%a equ 1 ( Color c echo. echo Ya se encuentra el comando "%linea%" APLICADO echo. echo NO se permite -Duplicidad- echo. goto :salir ) if %%a gtr 1 goto :limpiar ) goto :salir :insertar set cadena="cd" echo Se va a insertar "%linea%" en archivo %rutaNP1% for /f "tokens=*" %%a in (%rutaNP1%) do ( echo %%a>>salida.txt echo "%%a" ^^| find %cadena%>nul&&if !nrep!==0 (echo %linea%>>salida.txt&set /a nrep=1) ) copy /y salida.txt %rutaNP1%>nul Echo. Echo Cambios Aplicados Echo. Echo Verificar en %rutaNP1% (linea6) que se encuentre "%linea%" goto :salir :Limpiar Echo se va a limpiar el archivo %rutaNP1% for /f "tokens=*" %%a in (%rutaNP1%) do ( echo "%%a" ^^| find "%linea%">nul&&if !nrep!==0 (echo %%a>>salida.txt&set /a nrep=1) echo "%%a" ^^| find "%linea%">nul||echo %%a>>salida.txt ) copy /y salida.txt %rutaNP1%>nul Echo. Echo Cambios Aplicados Echo. Echo Verificar en %rutaNP1% (linea6) que se encuentre "%linea%" y solo en esa linea :Salir Timeout 5 exit
Ya me dirás
- Compartir respuesta