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.

Respuesta
1

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.

¿Qué pasó con esto? Si consideras que tu problema está resuelto cierra la pregunta.

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:

  1. 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
  2. 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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas