用于比较MSI文件和已安装版本的版本的批处理文件

时间:2014-10-22 19:26:15

标签: windows batch-file vbscript windows-installer version

我目前只安装了一个安装脚本,如果产品尚未安装(通过检查应用程序的EXE是否存在),但是我想更进一步,只安装它,如果MSI版本比安装版本更新。虽然脚本查询MSI会很好,如果这是不可能的,我总是可以在脚本中的变量中更新MSI版本...但是如果它是活动查询会很好不需要一直更新。

我一直无法找到任何能让我获得MSI版本的东西,而我见过MSI版本的唯一地方就是我查看文件属性 - >详细信息 - >主题:产品XYZ 10.2.3。

为了检查已安装的版本,我发现:

wmic datafile where name='c:\\windows\\system32\\notepad.exe' get version

返回两行,其中第二行是10,2,3(使用逗号代替小数)。

如果我使用:

wmic product where "name like 'Product XYZ%%'" get version

我得到了相同的结果但是采用了预期的十进制格式,但查询需要花费更长的时间来运行。但在任何一种情况下,我仍然需要弄清楚如何实际处理查询结果。

使用VBS可能会更容易,只要我可以在现有的批处理文件中调用它以及在我的批处理文件中处理VBS结果,我可以使用它。

提前致谢! 布赖恩

3 个答案:

答案 0 :(得分:0)

这显示了使用findstr。

提取特定信息的原理
@echo off

If "%~1"=="" goto help
If "%~1"=="/?" goto help
If /i "%~1"=="/h" goto help
If "%~1"=="-?" goto help
If /i "%~1"=="-h" goto help

set filepath=%~f1
set  file=%filepath:\=\\%
wmic datafile where name^="%file%" get version|findstr /i /v /c:"version"
echo %errorlevel%
goto finish

:help
Echo.
Echo. FileVer
Echo. -------
Echo.
Echo.    By David Candy 2013
Echo.
Echo. Purpose:
Echo.
Echo.    Reports the version number for an exe, dll, and similar files.
Echo.
Echo. Usage:
Echo.
Echo.    filever ^<executable file^>
Echo.
Echo.    filever [/h ^| -h ^| /? ^| -?]    Starts this help
Echo.
echo. Examples:
Echo.
Echo.    filever c:\windows\explorer.exe
Echo.    filever "C:\Program Files\Windows NT\Accessories\wordpad.exe"
Echo.    filever shell32.dll

Echo.
Echo.    For Help
Echo.
Echo.    filever 

Echo.    filever /?
Echo.

:finish
rem Pause if command double clicked
If /i "%cmdcmdline:~0,6%"=="cmd /c" pause

这显示使用For

set service=%1
for /f "skip=1 tokens=1,2,3* delims= " %%a in ('sc getkeyname %service%') do echo %%c

答案 1 :(得分:0)

这是使用makecab的方式:

; @echo off
;;goto :end_help
;;setlocal DsiableDelayedExpansion
;;;
;;;
;;; fileinf /l list of full file paths separated with ;
;;; fileinf /f text file with a list of files to be processed ( one on each line )
;;; fileinf /? prints the help
;;;
;;:end_help

; REM Creating a Newline variable (the two blank lines are required!)
; set NLM=^


; set NL=^^^%NLM%%NLM%^%NLM%%NLM%
; if "%~1" equ "/?" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; if "%~2" equ "" type "%~f0" | find ";;;" | find /v "find" && exit /b 0
; setlocal enableDelayedExpansion
; if "%~1" equ "/l" (
;  set "_files=%~2"
;  echo !_files:;=%NL%!>"%TEMP%\file.paths"
;  set _process_file="%TEMP%\file.paths"
;  goto :get_info
; )

; if "%~1" equ "/f" if exist "%~2" (
;  set _process_file="%~2"
;  goto :get_info
; )

; echo incorect parameters & exit /b 1
; :get_info
; set "file_info="

; makecab /d InfFileName=%TEMP%\file.inf /d "DiskDirectory1=%TEMP%" /f "%~f0"  /f %_process_file% /v0>nul

; for /f "usebackq skip=4 delims=" %%f in ("%TEMP%\file.inf") do (
;  set "file_info=%%f"
;  echo !file_info:,=%nl%!
; )

; endlocal
;endlocal
; del /q /f %TEMP%\file.inf 2>nul
; del /q /f %TEMP%\file.path 2>nul
; exit /b 0

.set DoNotCopyFiles=on
.set DestinationDir=;
.set RptFileName=nul
.set InfFooter=;
.set InfHeader=;
.Set ChecksumWidth=8
.Set InfDiskLineFormat=;
.Set Cabinet=off
.Set Compress=off
.Set GenerateInf=ON
.Set InfDiskHeader=;
.Set InfFileHeader=;
.set InfCabinetHeader=;
.Set InfFileLineFormat=",file:*file*,date:*date*,size:*size*,csum:*csum*,time:*time*,vern:*ver*,vers:*vers*,lang:*lang*"

以下是脚本调用fileinfo.bat

的示例
c:> fileinfo.bat /l C:\install.exe
    file:install.exe
    date:11/07/07
    size:562688
    csum:380ef239
    time:07:03:18a
    vern:9.0.21022.8
    vers:9.0.21022.8 built by: RTM
    lang:1033

答案 2 :(得分:0)

您可以调整此脚本。 pver变量是版本字符串,pname告诉您名称。你可以用vbs做更多的事情,因为有一个以Installer对象开头的整个脚本引擎。抱歉格式化,没有在SO上掌握它。

选项明确

公共安装程序,fullmsg,comp,prod,a,fso,pname,ploc,pid,psorce,pcache,pver

设置fso = CreateObject(“Scripting.FileSystemObject”)

设置a = fso.CreateTextFile(“prods.txt”,True)

'连接到Windows Installer对象 设置installer = CreateObject(“WindowsInstaller.Installer”) a.writeline(“产品”) 在错误恢复下 对于每个prod在installer.products

pid = installer.productinfo(prod,“ProductID”)

pname = installer.productinfo(prod,“ProductName”)

pver = installer.productinfo(prod,“VersionString”)

psorce = installer.productinfo(prod,“InstallSource”)

ploc = installer.productinfo(prod,“InstallLocation”)
 pcache = installer.productinfo(prod,“LocalPackage”)    a.writeline(prod&amp;“”&amp; pname&amp;“Version”&amp; pver&amp;“安装在”&amp; ploc&amp;“from”&amp; psorce&amp;“cached at”&amp; pcache)

下一步