Answers:
作为注册表的替代方案,如果要检查它是否已安装,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的程序的“正确”方法。
我很惊讶你没找到那个命令
IF NOT ACCESS2000RunTimeInstallation RUN ACCESS2000RuntimeInstallation
;-)
但无论如何,
这是原则。
我有一个名为aa的文件和一个名为c:\ windows的目录。我没有名为ab的文件,我没有名为c:\ windows1的目录
我们可以说
if exist a.a c:\program\program.exe
在下面的示例中,您可以将“echo here”替换为程序的路径
现在找出访问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查询命令将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的另一种语法,如果errorlevel 0(愚蠢)'cos要求值> = 0,则不要这样做。你说IF ERRORLEVEL 1(即如果值> = 1),或IF NOT ERRORLEVEL 1(即如果值不是> = 1,即如果值为0或更小 - 我怀疑它可能会更少)。或者您使用%errorlevel%。
IF EXIST
命令的工作原理并使用它来检查其他一些文件。如果我不知道安装程序放置的位置或Access 2010 Runtime 独有的文件,该怎么办?
要简单检查是否安装了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存在,但它不起作用。