批处理脚本安装MSI

14

我正在尝试写一个.bat文件。

我正在尝试使用脚本安装.msi文件,目前我们手动双击进行安装。

路径从d:/installed sw/$folder/.msi

路径到D:/program files/app/

$folder表示每次都不同,因为我们会得到要安装的新.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个回答

35
这是如何静默安装普通MSI文件的方法:
msiexec.exe /i c:\setup.msi /QN /L*V "C:\Temp\msilog.log"

简单解释:

 /L*V "C:\Temp\msilog.log"= verbose logging at indicated path
 /QN = run completely silently
 /i = run install sequence 
msiexec.exe命令行非常详细,支持各种选项。这里是相同命令行界面的另一个概述。这里有一个批注版本(已经损坏,通过way back machine重新开始)。
使用诸如for循环之类的结构,也可以使批处理文件变得更加简短,如此示例所示用于Windows更新。
如果在安装过程中需要选中复选框,则必须找到与该复选框相关联的适当公共属性,并将其设置为像这样的命令行:
msiexec.exe /i c:\setup.msi /QN /L*V "C:\Temp\msilog.log" STARTAPP=1 SHOWHELP=Yes

这些属性在每个MSI中都不同。您可以通过详细日志文件或通过在Orca或其他适当的工具中打开MSI来查找它们。您必须在对话框控件部分或属性表中查找属性名称。尝试先运行设置并创建详细日志文件,然后搜索消息"设置属性...",查看那里的属性名称。然后使用来自日志文件的值将此属性添加到命令行中。
此外,还要查看如何使用转换来自定义MSI以超越设置命令行参数:如何更好地使用MSI文件

我正在尝试上述内容,并将尝试使用演示.MSI文件。 此外,在安装过程中,我们通常会点击两个复选框,静默安装也会处理这个问题吗?谢谢。 - Aman
请查看我对答案的补充。请注意,一些MSI文件不是标准的,但上述描述应该适用于大多数情况。 - Stein Åsmul

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(命令行选项)

我已经额外添加了/quiet到所需选项/i中,以进行静默安装。

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

0

虽然它看起来与主题无关,但没有人注意到ERRORLEVEL。当我使用您的建议尝试在MSI安装后立即检查错误时,我故意让它失败,并注意到在命令行中所有工作都很好,而在批处理文件中,msiexec似乎没有设置错误。尝试了不同的方法,例如:

  • 使用start /wait
  • 使用!ERRORLEVEL!变量而不是%ERRORLEVEL%
  • 使用SetLocal EnableDelayedExpansion

什么都不起作用,最让我烦恼的是它在命令行中可以正常工作。


你有没有查看这个答案?:https://www.experts-exchange.com/questions/27389717/single-advertisement-for-multiple-programs-sccm.html。请查看“Invoke MSI”部分的“已接受的答案”。如果它对你有用,让我们知道,我们可以使用该信息扩展已接受的答案。 - Stein Åsmul
还有一个问题:https://dev59.com/a0rSa4cB1Zd3GeqPUjym - Stein Åsmul

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