判断MSI/EXE是否支持特定的标志/参数?

13
我正在创建一个可以运行MSIs和EXEs的自动更新程序。这些MSIs/EXEs不是我自己的。如果存在任何无人值守/静默安装选项,我想使用它们。是否有一种方法可以确定某个MSI/EXE是否具有某种无人值守安装支持,并且如果存在,则获取正确的参数,以便在运行文件时将其传递给该文件?我知道,'/quiet'是默认的静默安装选项,但我也对EXEs以及可能已经定制了此选项的任何MSIs感到好奇。
这个问题-检测无人值守安装的msi参数 -类似,但答案中的链接已经失效并且我无法从答案中找到我需要的信息。
谢谢。

它们是以何种方式出现问题?出现错误吗?有些东西只是没有显示出来?在您的问题中具体说明这一点可能会让人们帮助您解决问题。 - Merlyn Morgan-Graham
这个链接 - http://www.scriptbox.at.tt/index.php?search=Get%20MSI-File%20properties.vbs&site=1 - 是答案中提到的含有一个脚本的链接,但已经失效了。 - Chad
3个回答

43

1
与其他答案中的脚本和已失效链接程序相比,这个非常简单明了。感谢您! - matt wilkie

5
如果是MSI文件,那么参数是标准的,您可以使用msiexec /?命令获取选项列表,或查看MSDN上的文档。对于任意EXE文件,没有办法检测它支持哪些选项(如果有的话)。尝试从供应商处获取文档,或尝试使用/?开关...

好的,我明白了,很难轻易地确定一个可执行文件是否具有某些功能,但问一下也是值得的。我不知道供应商是谁,所以不能只是阅读他们的文档。谢谢。 - Chad
1
@Chad,你可以尝试使用文本编辑器查看exe文件中的字符串。通常情况下,你可以在那里看到所有的开关:程序需要这些字符串来比较参数。如果.exe是Unicode编码,你会看到每个字符之间有“空格”。虽然这类似于逆向工程,但有时会有所帮助。 - Alexey Ivanov

3
< p >(注意:我在您提到的检测无人值守安装的msi参数问题上发布了这个回答的一个变体。)

Lessmsi是一个非常好的工具,如果您愿意使用GUI并进行一些手动调查,它肯定可以在这里发挥作用。

您可以尝试以下命令:

lessmsi l -tProperty <msi_name>

但是上述内容很可能并不能满足您的全部需求。

一种确保获取所有可能属性的方法是使用MSI文件执行安装、修复或卸载,并记录该过程,如Jon Heese的回答中所述。

如果您希望在日志文件中筛选更少的文本,则可以将日志设置为仅记录属性:

<msi_name> /lp! <msi_property_logfile>

或者

msiexec /lp! <msi_property_logfile> /i <msi_name>

我更喜欢一种通过“提取”来绕过安装/卸载/修复的方法。这种方法比lessmsi更具优势,因为它不需要第三方实用工具(即lessmsi),也不需要您干扰任何安装。您确实需要足够的磁盘空间来实际安装程序(并且可能需要一些额外的空间以确保安全)。然后您可以执行以下操作:

msiexec /a <msi_name> /lp! <msi_property_logfile> TARGETDIR=<absolute_path_to_extract_to>

请注意,<absolute_path_to_extract_to> 可以指向不存在的目录(命令将创建必要的目录或失败)。
如果您因任何原因不喜欢安装界面,可以添加/qr选项,这将“减少”并可能消除UI,而不会影响属性记录过程。但是请注意,如果您比缩小的UI更低(即/qb|/passive/qn|/quiet),则您的<msi_property_logfile>可能会缺少某些属性。
以下命令可以有效地为某个目录中的每个MSI文件生成一个属性日志文件(使用DIR /B而不是DIR /B/S以不递归子目录;如果要保留提取的文件,请删除RD命令):
cmd /C "FOR /F delims^=^| %G IN ('DIR /B/S "%DirToSearch%\*.msi"') DO msiexec /a "%G" /qr /lp! "%~nG_log.txt" TARGETDIR="%~dpnG_extract" && RD /S/Q "%~dpnG_extract""

如果您想以PowerShell运行它,可以使用以下命令:

cmd /C "FOR /F delims^=^| %G IN ('DIR /B/S ""%DirToSearch%\*.msi""') DO msiexec /a ""%G"" /qr /lp! ""%~nG_log.txt"" TARGETDIR=""%~dpnG_extract"" && RD /S/Q ""%~dpnG_extract"""

完成该进程后,只需打开日志文件并注意以Jon Heese提到的Property(S):/Property(C):开头的行。

一般而言,可为安装设置的参数/属性会记录在大写字母中,例如,ALLUSERS可以设置为ALLUSERS=1,以使安装适用于所有用户。


感谢您的决定!这是一个很棒的程序!任务是以静默模式安装UACoreSvcSetup.msi并传递主机名和端口的值。这些参数未包含在官方文档中!!!运行lessmsi,选择文件,Table ViewCustomAction表。msiexec /i UACoreSvcSetup.msi UAVR_SERVERNAME="servername" UAVR_SERVERPORT="123" - KUL

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