使用批处理文件时,是否有命令可以用来检查 Access 2010 Runtime 当前是否已安装,如果尚未安装,则调用其安装?
这将在 Windows 7 和 Windows XP 上使用。
编辑:寻找一种方法来检查程序的安装,而不知道安装 Access Runtime 时文件放在哪里。
答案1
您可以从注册表中读取信息:
reg.exe QUERY HKLM\SOFTWARE\Classes\Access.Application.14\shell\Open\command /ve
此命令从注册表中读取 MSAccess.EXE 路径。您只需将其保存到变量中,然后删除其周围的垃圾即可。这可以使用“for”命令来完成。
答案2
作为注册表的替代方法,如果您想检查它是否已安装,wmic
可以这样做。但是,检查已安装程序的命令通常需要一点时间才能运行。
wmic product where "name like 'WhateverAccessRuntimeIsCalled'" get version
要检查它的实际名称(您需要确切的名称)和正确的版本,请将其安装在您自己的计算机上。然后,在您自己的计算机上:
wmic product get name,version>programlist.txt && notepad.exe programlist.txt && del programlist.txt
然后,您可以在批处理文件中运行查询命令:
setlocal EnableDelayedExpansion
for /f "skip=1 tokens=1 usebackq delims=." %%a in (`wmic product where "name like 'WhateverAccessRuntimeIsCalled'" get version`) do (
if /i "!_versionstring!" LSS "%%a" (
set _versionstring=%%a
)
)
if /i "%_versionstring%" LSS "WhateverTheMajorVersionNumberShouldBe" (
echo It's not installed
) else (
echo It is installed
)
Office 2010 的主版本号(第一个数字,以点分隔)为 14。当然,如果程序名称中包含“2010”,则无需检查版本号。如果程序不存在,%_versionstring%
则为空。
检查注册表肯定更快,但我认为这是检查基于 MSI 的程序是否安装的“正确”方法。
答案3
我很惊讶你没有找到该命令
IF NOT ACCESS2000RunTimeInstallation RUN ACCESS2000RuntimeInstallation
;-)
但无论如何,
原理如下。
我有一个名为 aa 的文件和一个名为 c:\windows 的目录。我没有一个名为 ab 的文件,也没有一个名为 c:\windows1 的目录
我们可以说
if exist a.a c:\program\program.exe
在下面的例子中,你可以用程序的路径替换“echo here”
现在找出 Access 2000 安装程序在硬盘中放入了哪些文件,并选择一个唯一的文件或它创建的目录,然后将其用于您的 IF 语句。
C:\>if exist a.a echo here
here
C:\>if exist a.b echo here
C:\>if exist c:\windows\nul echo here
here
C:\>if exist c:\windows1\nul echo here
C:\>
更新-
您还可以检查注册表
例如,无论什么程序,您可能都会在“添加/删除程序”中看到该程序。这是注册表中存储该程序的位置。您可以运行该命令并滚动浏览,以了解该命令
C:\>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Unins
tall | more
列出的一个程序是 Windows Media Player,你也需要
C:\>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Unin
stall\Windows Media Player"
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Windows M
edia Player
DisplayName REG_SZ Windows Media Player 10
UninstallString REG_SZ "C:\Program Files\Windows Media Player\Setup_wm.
exe" /Uninstall
DisplayIcon REG_SZ C:\Program Files\Windows Media Player\wmplayer.exe
ParentKeyName REG_SZ OperatingSystem
ParentDisplayName REG_SZ Windows Updates
C:\>
该“成功”的 reg query 命令将 ERRORLEVEL 设置为 0,表示没有错误。
C:\>echo %errorlevel%
0
如果键不存在,例如我会寻找 Windows Media Playerr(注意多余的 r)
C:\>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Unin
stall\Windows Media Playerr"
Error: The system was unable to find the specified registry key or value
C:\>echo %errorlevel%
1
C:\>
当 %errorlevel% >=1 时,表示错误。
因此,您可以测试 IF %errorlevel%==0,也可以测试 IF NOT %errorlevel%==0,还可以使用 ELSE
测试 ERRORLEVEL 的另一种语法是,不要执行 if errorlevel 0(愚蠢),因为它要求值 >=0。您可以说 IF ERRORLEVEL 1(即,如果值 >=1),或 IF NOT ERRORLEVEL 1(即,如果值不 >=1,即,如果值为 0 或更小 - 我怀疑它永远不会更小)。或者您使用 %errorlevel%。
答案4
为了简单地检查 Access Runtime 2010 是否已安装,我使用此行
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Office14.AccessRT" /v DisplayName
正如之前提到的,你可以获取 %errorlevel% 以获取进一步的说明
例如我编写的登录脚本:
@echo off
:: test whether your PC has Access or Access Runtime only if you are in the list
find/i "%COMPUTERNAME%" \\someserver\folder\list.txt >nul
if %errorlevel%==1 goto end
:: set some variables false because batch has no logical OR
set accessTest=False
set accessExeTest=False
if exist "C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" (
set accessExeTest=x86 )
if exist "C:\Program Files\Microsoft Office\Office14\MSACCESS.EXE" (
set accessExeTest=x86_64 )
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office\Microsoft Access 2010.lnk" (
set accessTest=True
)
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Office14.AccessRT" /v DisplayName
if %errorlevel%==0 (
set accessTest=True
)
:: execute only if a start menu entry or the registry key is found
if %accessTest%==True (
:: import registry key to flag the DB as trusted
reg import \\someserver\public\ACCESS\allowAccess.reg
:: choose from where to start access
if %accessExeTest%==x86 (
start "" "C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" \\someserver\public\ACCESS\someDB.accdb /runtime /nostartup
) else if %accessExeTest%==x86_64 (
start "" "C:\Program Files\Microsoft Office\Office14\MSACCESS.EXE" \\someserver\public\ACCESS\someDB.accdb /runtime /nostartup
)
:: log the ones without any form of MS Access
else (
echo %COMPUTERNAME%>>\\someserver\HWINFO\access.log )
)
:end
您还可以使用以下命令检查 MSACCESS.EXE 的位置
REG QUERY HKLM\SOFTWARE\Classes\Access.Application.14\shell\Open\command /ve
并搜索相关信息。但我注意到这并不总是可靠的。有时 *.exe 在那里但它不起作用。