在文件夹中安装所有.msi文件

时间:2018-07-20 18:41:49

标签: python powershell windows-installer

我正在尝试编写一个从Python脚本开始的Powershell脚本,该脚本将允许我检查并安装某个文件夹中包含的每个.msi文件。

这是我到目前为止所拥有的:

$msiFiles = Get-ChildItem -Path "***PATH TO FOLDER***" -Recurse -Include *.msi

foreach($file in $msiFiles)
{

    Write-Host "$file is being installed"
    Start-Process "msiexec.exe" -arg "/I $file /qb ADDLOCAL=ALL ALLUSERS=TRUE" -Wait
    Write-Host "$file is finished being installed"


}

我想以静默方式安装这些msi,因此我看不到或不需要蚂蚁GUI交互。当安装msi时,我会从安装程序中弹出所有可能用于安装东西的命令,但实际上并没有安装它。

在静默模式下安装这些命令的正确命令是什么?

2 个答案:

答案 0 :(得分:2)

通常,如果调用msiexec除了显示一个描述命令行语法的对话框外什么也不做,这意味着存在语法问题

语法错误的可能来源是您用作"..."自变量的-arg字符串(全名:-Args或{{ 1}}}中嵌入了-ArgumentList,但没有嵌入引号:

也就是说,例如,如果 $file的值已嵌入空格 ,则生成的{{1 }}在语法上将是无效的,因为路径的以空格分隔的标记被每个视为一个参数。

Bill_Stewart's helpful answer展示了如何通过将其包含在$file中来{strong>在C:\Msi Installers\foo.msi 周围使用嵌入式引用来解决此问题( msiexec是PowerShell的转义字符)。

如果您坚持将参数作为单个字符串传递,则可以使用:

$file

但是,可以说,更干净不是将单个,类似于命令行的字符串作为 only 参数传递,而是将参数作为数组的个元素 传递,这确实是`" / `旨在接受的参数(其参数类型为{{1 }}):

Start-Process msiexec.exe -Args "/I `"$file`" /qb ADDLOCAL=ALL ALLUSERS=TRUE" -Wait

请注意, -ArgumentList是如何通过嵌入式引号传递的,不幸的是,由于a bug in Start-Process是必需的(<从Windows PowerShell v5.1 / PowerShell Core v6.1.0开始)


您也可以高级 中构建参数数组;注意这是在 expression 模式下完成的(语法更像常规编程语言),因此数组元素 all 需要引用;还请注意我如何使用引号定义 literal 参数:

-Args

答案 1 :(得分:1)

尝试一下:

$msiFiles = Get-ChildItem -Path "***PATH TO FOLDER***" -Recurse -Include *.msi

foreach ( $file in $msiFiles ) {
  $fullPath = $file.FullName
  Write-Host "'$fullPath' is being installed"
  Start-Process -FilePath msiexec.exe -ArgumentList "/I `"$fullPath`"","/qb","ADDLOCAL=ALL","ALLUSERS=TRUE" -Wait
  Write-Host "$fullPath is finished being installed"
}