我正在尝试编写一个从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时,我会从安装程序中弹出所有可能用于安装东西的命令,但实际上并没有安装它。
在静默模式下安装这些命令的正确命令是什么?
答案 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"
}