批处理文件REG QUERY命令在32位注册表中搜索而非64位。

5
在我的批处理文件中,我正在执行一个简单的命令来获取VirtualBox的安装路径。
REG QUERY HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBox /v InstallDir

当我从命令行执行批处理文件时,它的表现非常出色,但是如果我从Inno Setup启动相同的批处理文件,则不会给出任何值。

经过长时间的测试,我发现只有在从Inno Setup启动批处理文件时,它才会仅搜索注册表的32位部分。

为了验证这个理论,我查看了那里的一个32位注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\NuGet\Repository

在我的批处理文件中,我输入了以下命令(请注意,我没有指定Wow6432Node,这是错误的)
REG QUERY HKEY_LOCAL_MACHINE\SOFTWARE\NuGet\Repository\

实际上,当从命令行运行批处理文件时,它无法找到注册表键。但是,当从Inno Setup启动相同的批处理文件时,它可以很好地找到\NuGet\repository。

现在的问题是,如何使用我的批处理文件获取64位注册表键(Virtual Box),以便它可以从命令行和Inno Setup中都能正常工作?


1
首先,您不需要运行批处理文件来获取注册表值。Inno Setup直接支持此功能的支持函数。但是,让您感到困惑的是registry redirector,以及您正在运行64位命令提示符和32位Inno Setup安装程序的事实。从64位命令提示符执行的批处理文件查看了64位注册表节点,而从32位Inno Setup运行时查看了32位注册表节点。要获得您所要求的内容,您需要运行32位命令提示符。 - TLama
那个需求简直是通往地狱的捷径!但是,我已经帮助了许多自杀式的需求,为什么不帮你的呢 :-) 你如何在Inno Setup中运行批处理文件,以及你想支持哪种位数的命令提示符?对于Inno Setup,可以有一个简单的解决方案,例如通过指定一个你喜欢的位数的reg.exe路径作为执行函数(或脚本条目)的工作目录。但我不确定这是否是最好的方法,因为我不是批处理脚本或命令提示符的粉丝。 - TLama
我这样调用批处理文件:Exec('cmd', '/C ' + ExpandConstant('{tmp}') + '\Batch.bat ' + dest_path, '', SW_HIDE, ewWaitUntilTerminated, ReturnCode); - Amaranth
理想情况下,我希望支持所有位数。32位cmd到32位虚拟机(或64位到64位)可以正常工作。我可以轻松支持64位cmd到32位虚拟机(如果第一次找不到,请在Wow6432Node中检查)。问题出在32位cmd和64位虚拟机上。如果没有通过这种方式获取注册表键的方法,我想我可以在C:驱动器中搜索VBoxManage.exe文件。 - Amaranth
2
你不能在32位和64位的cmd.exe上运行那个单行批处理文件。你需要以某种方式扩展你的批处理脚本。目前,其中一个会失败。这是因为它们每个都调用不同的reg.exe,具体取决于它们的位数。就像你执行的64位命令行和32位Inno Setup一样(其中一个失败取决于你查询的节点)。 - TLama
显示剩余2条评论
3个回答

5

5
这是我最终采取的做法,因为没有更多时间来处理它。它适用于所有情况,除非Virtual Box 64位安装在非默认文件夹中并且批处理文件在32位环境中调用。
set vb_path=""

for /f "tokens=1-2*" %%A in ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBox" /v InstallDir') do (
  set vb_path="%%C\VBoxManage.exe"
)

IF %vb_path%=="" (
  REM Virtual Box not found. Search in 32 bit virtual box from 64 bit cmd
  for /f "tokens=1-2*" %%A in ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Oracle\VirtualBox" /v InstallDir') do (
    set vb_path="%%C\VBoxManage.exe"
  )
)

IF %vb_path%=="" (
  REM Still not found. Must be 32 bit env. with 64 bit Virtual Box
  REM Search in default installation folders.
  IF EXIST "%ProgramFiles(x86)%\Oracle\VirtualBox\VBoxManage.exe" (
    set vb_path="%ProgramFiles(x86)%\Oracle\VirtualBox\VBoxManage.exe"
  ) ELSE (
    IF EXIST "%ProgramW6432%\Oracle\VirtualBox\VBoxManage.exe" (
      set vb_path="%ProgramW6432%\Oracle\VirtualBox\VBoxManage.exe"
    )
  )
)

IF %vb_path%=="" (
  ECHO VirtualBox folder not found in registry or default installation path!
  EXIT /b 1
)

0
如果我想知道使用批处理文件,Windows 版本 x86 或 x64,我会使用简单的脚本(未在 Inno Setup 中测试)。
@echo off
rem DISCOVERY WINDOWS VERSION x86 or x64

reg query HKLM\Hardware\Description\System\CentralProcessor\0 | find /i "x86" > nul 2>&1
if %errorlevel% equ 1 goto x64

rem DISPLAY OS NAME AND VERSION 

:x86
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
SET CURRENTKEY=HKLM\Software\Microsoft\Windows NT\CurrentVersion
FOR /F "TOKENS=2,*" %%A IN ('reg query "%CURRENTKEY%" 2^>NUL^|FIND /I "ProductName"') DO ECHO                       %%B 32 Bits found...
echo.
ping -n 5 localhost >nul 
cls
goto systemx86

:x64  
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
SET CURRENTKEY=HKLM\Software\Microsoft\Windows NT\CurrentVersion
FOR /F "TOKENS=2,*" %%A IN ('reg query "%CURRENTKEY%" 2^>NUL^|FIND /I "ProductName"') DO ECHO                       %%B 64 Bits found...
echo.
ping -n 5 localhost >nul 
cls
goto systemx64

rem YOUR SCRIPTS BELOW

:systemx86
echo Start your commands for x86! by Iremar Domingos
pause

:systemx64
echo Start your commands for x64! by Iremar Domingos
pause

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接