用于安装MSI的批处理脚本

时间:2014-08-10 14:15:54

标签: batch-file installer windows-installer silent-installer

我第一次尝试写一个 .bat

我正在尝试使用脚本安装.msi,目前我们通过双击手动安装。

来自的路径:d:/installed sw/$folder/.msi

的路径:D:/program files/app/

$folder表示每次都不一样,因为我们正在安装新的msi,这些msi是在当前日期创建的文件夹中提供的。

这是我正在尝试的脚本:

@echo off
Title HOST: Installing Updates on %computername%
echo %computername%
set server=\\SERVERNAME or PATH\msifolder
:select
cls
echo Select one of the Following MSI Install Folders for installation task.
echo.
dir %server% /A:D /B
SET /P MSI=Please enter the MSI Folder to install: 
SET source=%server%\%MSI%
echo Selected Installation %MSI%
echo.
echo.

:verify
ECHO Is This Correct?
echo.
echo.
ECHO 0: ABORT INSTALL
ECHO 1: YES
ECHO 2: NO,RE-SELECT
SET /p choice=Select YES, NO or ABORT? [0,1,2]:
     if /i [%choice%]==[0] endlocal&goto end
     if [%choice%]==[] goto BCurrentlocal
     if [%choice%]==[1] goto yes
 if [%choice%]==[2] goto no
 endlocal

:no
goto select
:yes
set FILENAME=%MSI%
call %source%\%FILENAME%.msi
echo beginning %MSI% installation
pause
echo Exiting Install Script....
PING -n 4 127.0.0.1 >nul
exit

set server一致,我将路径添加到

SET /P MSI适用于来自的路径。

然而,它无效。

任何人都可以指导我做错了吗?

3 个答案:

答案 0 :(得分:15)

这是以静默方式安装普通MSI文件的方法

msiexec.exe /i c:\setup.msi /QN /L*V "C:\Temp\msilog.log"

快速解释:

 /L*V "C:\Temp\msilog.log"= verbose logging
 /QN = run completely silently
 /i = run install sequence 

msiexec.exe command line非常广泛,支持各种选项。这是同一命令行界面的another overview。这是一个annotated versions(已被打破,通过后方机器复活)。

还可以使批处理文件缩短,使用for loops等结构,如此处针对Windows更新所示。

如果在设置过程中必须选中复选框,则必须在复选框中找到相应的 PUBLIC PROPERTIES 并将其设置为这样的命令行:

msiexec.exe /i c:\setup.msi /QN /L*V "C:\Temp\msilog.log" STARTAPP=1 SHOWHELP=Yes

每个MSI的这些属性都不同。您可以通过详细日志文件或在Orca, or another appropriate tool中打开MSI找到它们。您必须在对话框控件部分或属性表中查找属性名称。尝试运行设置并首先创建详细日志文件,然后在日志中搜索消息ala"设置属性..."然后看看属性名称是什么。然后将此属性与日志文件中的值一起添加到命令行。

另请参阅如何使用转换来自定义MSI,而不是设置命令行参数:How to make better use of MSI files

答案 1 :(得分:0)

以下是适合您的批处理文件:

@echo off
Title HOST: Installing updates on %computername%
echo %computername%
set Server=\\SERVERNAME or PATH\msifolder

:select
cls
echo Select one of the following MSI install folders for installation task.
echo.
dir "%Server%" /AD /ON /B
echo.
set /P "MSI=Please enter the MSI folder to install: "
set "Package=%Server%\%MSI%\%MSI%.msi"

if not exist "%Package%" (
   echo.
   echo The entered folder/MSI file does not exist ^(typing mistake^).
   echo.
   setlocal EnableDelayedExpansion
   set /P "Retry=Try again [Y/N]: "
   if /I "!Retry!"=="Y" endlocal & goto select
   endlocal
   goto :EOF
)

echo.
echo Selected installation: %MSI%
echo.
echo.

:verify
echo Is This Correct?
echo.
echo.
echo    0: ABORT INSTALL
echo    1: YES
echo    2: NO, RE-SELECT
echo.
set /p "choice=Select YES, NO or ABORT? [0,1,2]: "
if [%choice%]==[0] goto :EOF
if [%choice%]==[1] goto yes
goto select

:yes
echo.
echo Running %MSI% installation ...
start "Install MSI" /wait "%SystemRoot%\system32\msiexec.exe" /i /quiet "%Package%"

help cmdcmd /?命令提示符窗口中输入的最后一页输出中列出的字符在批处理文件中具有特殊含义。这里使用括号和方括号也在字符串中,这些字符应按字面解释。因此,有必要将字符串括在双引号中,或者转义那些字符为^的字符,如上面的代码所示,否则命令行解释器会因语法错误而退出批处理执行。

无法调用扩展名为MSI的文件。 * .msi文件不是可执行文件。在双击MSI文件时,Windows会在注册表中查找与此文件扩展名关联的应用程序以打开操作。要使用的应用程序是msiexec,命令行选项/i可以在MSI包中安装应用程序。

运行msiexec.exe /?以获取可用选项的GUI窗口或查看Msiexec (command-line options)

我已将/quiet添加到必需的选项/i以进行静默安装。

在上面的批处理代码中,命令start与选项/wait一起使用以启动Windows应用程序msiexec.exe并执行批处理文件,直到安装完成(或中止)。

答案 2 :(得分:0)

虽然它可能看起来没有主题,但没有人费心去检查ERRORLEVEL。当我使用你的建议时,我试图在MSI安装后直接检查错误。我故意失败并注意到在命令行上所有工作都很漂亮,而在批处理文件中msiexec dosn似乎设置了错误。尝试过不同的事情

  • 使用开始/等待
  • 使用!ERRORLEVEL!变量而不是%ERRORLEVEL%
  • 使用SetLocal EnableDelayedExpansion

没有什么可行的,而且大多数让我烦恼的是它在命令行中运行的事实。