Script por lotes: reemplazar una variable con otra

OK, básicamente, lo que estoy tratando de hacer es crear un script que actualice una variable con otra.

Ya he creado todo el script, por lo que extrae los nuevos datos del registro y los configura, ahora solo necesito actualizar una variable anterior.

Script de ejemplo

set current_shockwave_version=1
set current_flash_version=1

FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer" /v CurrentVersion ') DO SET Installed_Flash_Version=%%B
FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Shockwave 11\currentupdateversion" ') DO SET Installed_Shockwave_Version=%%B

Ahora quiero reemplazar el valor de current_shockwave_version y current_flash_version con las variables extraídas del registro. Habrá un grupo de administradores que usarán este script y estoy tratando de agregar una función de actualización fácil para que puedan ejecutar esta función de reemplazo en una computadora que esté completamente actualizada.

preguntado el 12 de junio de 12 a las 12:06

¿Entonces, cuál es el problema? ¿No está funcionando? Por favor elabora. -

1 Respuestas

No está muy claro qué resultado desea, pero supongo que solo desea leer el valor del registro una sola vez y luego actualizar las líneas.

set current_shockwave_version=1
set current_flash_version=1

Con los nuevos valores.
La forma más fácil es mover las dos líneas a una config.bat archivo, entonces puedes usar algo como

call config.bat
echo current_flash_version = %current_flash_version%

:UpdateValues
FOR /F "tokens=2*" %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer" /v CurrentVersion ') DO SET Installed_Flash_Version=%%B
FOR /F "tokens=2*" %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Shockwave 11\currentupdateversion" ') DO SET Installed_Shockwave_Version=%%B
(
  echo set current_shockwave_version=%Installed_Shockwave_Version%
  echo set current_flash_version=%Installed_Flash_Version%
) > config.bat

EDIT: Al comentario de reemplazar en el mismo archivo por lotes
No es una buena idea reemplazar los valores en el mismo archivo por lotes, ya que para hacer esto necesita volver a escribir el lote mientras se está ejecutando.
Esto se puede hacer, pero es complicado, especialmente si la longitud de los valores no será la misma, el lote funcionará un poco poco confiable.

Podrías resolverlo cuando muevas la configuración del base de datos valores hasta el final del archivo, pero en mi opinión, no es la mejor idea cambiar el lote que se está ejecutando actualmente.

@echo off
call :setValues
echo current_flash_version = %current_flash_version%
call :UpdateValues
echo new current_flash_version = %current_flash_version%
exit /b

:UpdateValues
FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer" /v CurrentVersion ') DO SET Installed_Flash_Version=%%B
FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Shockwave 11\currentupdateversion" ') DO SET Installed_Shockwave_Version=%%B
REM ** Copy and modify the own batch
findstr /v /r "##DB##$" "%~f0" > "%~f0.tmp"
(
  (echo set "current_shockwave_version=%Installed_Shockwave_Version%" ^& REM ##DB##)
  (echo set "current_flash_version=%Installed_Flash_Version%" ^& REM ##DB##)
) >> "%~f0.tmp"
(
  copy "%~f0.tmp" "%~f0"
  del "%~f0.tmp"
)
call :setValues
exit /b

:setValues
set "current_shockwave_version=1" & REM ##DB##
set "current_flash_version=1" & REM ##DB##

Respondido el 12 de junio de 12 a las 14:06

Perdón por la confusión, quiero hacer una función de reemplazo para reemplazar el valor original de la versión flash con el número de versión extraído del registro. Cuando se ejecute el script, ya tendrá la versión configurada. Estoy tratando de agregar una función que extraerá los números de versión del registro y reemplazará el número por la variable current_software_version (por ejemplo, flash y shockwave). También necesito que todo esto esté contenido en el archivo por lotes único. He visto a algunas personas jugar con la función findstr pero no he encontrado un buen ejemplo que haga lo que quiero fácilmente. - Nick W.

Planearé reiniciar el archivo por lotes después de que se realicen las ediciones. El objetivo de esta función será convertirlo en un proceso automatizado para que cuando otros administradores intenten actualizar el script, no rompan accidentalmente el script u otra cosa. editar: también los valores debemos ser del mismo largo. - Nick W.

Pero los valores pueden volverse más largos, ya que a veces una versión puede ser mayor a 10 - Jeb

cierto, pero la forma en que se almacenan en el registro es bastante consistente. De todos modos, ejecuté su script y no tuve mucha suerte, simplemente repite que el valor actualizado es el mismo que la longitud inicial: Nick W.

¿Quitaste el REM delante de las declaraciones de copiar/del? Pero primero podría mirar en su archivo adjunto con .tmp - Jeb

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.