批处理脚本:将一个变量替换为另一个

时间:2012-06-12 11:19:13

标签: batch-file replace

好的,基本上我要做的是创建一个脚本,用另一个变量更新一个变量。

我已经创建了所有脚本,因此它从注册表中提取新数据并设置它,现在我只需要它来更新旧变量。

示例脚本

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

现在我要替换current_shockwave_version&的值。 current_flash_version,从注册表中提取变量。将有许多管理员使用此脚本,我试图添加一个简单的更新功能,以便他们可以在完全更新的计算机上运行此替换功能。

1 个答案:

答案 0 :(得分:0)

目前还不是很清楚你想要什么结果,但我认为你只想读一次注册表值然后更新那些行。

set current_shockwave_version=1
set current_flash_version=1

使用新值。
最简单的方法是将两行移动到 config.bat 文件中,然后您可以使用类似

的内容
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

编辑:对于替换同一批文件的评论
更换同一个批处理文件中的值并不是一个好主意,因为这样做需要在批处理运行时重写批处理。
这可以做到,但它很棘手,特别是如果值的长度不一样,批处理将有点不可靠。

您可以在将数据库值的设置移动到文件末尾时解决此问题,但IMO最好不要更改当前正在运行的批处理。

@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##