You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PowerShell脚本执行MSI安装包报错:安装包无法打开

PowerShell脚本执行MSI安装包报错:安装包无法打开

看起来你在Packer构建AMI时遇到了MSI安装失败的问题,报错提示安装包无法打开,我来帮你分析下问题根源并给出修复方案。

首先看脚本里的核心问题

你的$msi_install_path赋值这一行有明显错误:

$msi_install_path = Get-ChildItem "C:\Users\Administrator\Downloads\managesoft" -recurse | where {$_.extension -eq ".msi"} | % {Write-Host $_.FullName}

这里用% {Write-Host $_.FullName}只是把MSI文件的路径打印到控制台,并没有把实际的路径值赋值给变量!所以$msi_install_path实际上是空的(或者只是输出文本,不是有效的文件路径),当你执行msiexec.exe /i "$msi_install_path" /qn时,相当于给msiexec传了一个空路径,自然会报错找不到安装包。

修复脚本的关键步骤

把获取MSI路径的代码改成直接提取文件的FullName属性值:

# 获取MSI文件的完整路径(确保只取第一个找到的MSI,避免多个文件的情况)
$msi_install_path = Get-ChildItem "C:\Users\Administrator\Downloads\managesoft" -Recurse | Where-Object {$_.Extension -eq ".msi"} | Select-Object -First 1 -ExpandProperty FullName

额外的排查与优化建议

为了避免其他可能的问题,你可以在脚本里增加一些验证步骤:

  • 验证MSI文件是否存在:在执行安装前检查路径有效性,提前发现问题
    if (-not (Test-Path $msi_install_path)) {
        Write-Error "MSI文件不存在或无法访问:$msi_install_path"
        exit 1
    }
    
  • 生成安装日志:给msiexec加日志参数,方便后续排查安装细节
    msiexec.exe /i "$msi_install_path" /qn /L*V "C:\FlexNetInstallLog.txt"
    
  • 检查下载的压缩包完整性:如果经常出现包损坏的情况,可以用Get-FileHash对比预期的哈希值,确保下载的zip包没有问题
  • 确认MSI文件本身有效:可以在本地环境解压下载的zip包,手动尝试打开MSI文件,排除包本身损坏的可能

修复后的完整脚本参考

# 下载FlexNet代理压缩包
Invoke-WebRequest -Uri https://jfrog/artifactory/generic-flexera-flexera-one-virtual/PROD/Windows%20-%20Silent%20Install/managesoft.zip -OutFile "C:\Users\Administrator\Downloads\managesoft.zip" -Headers @{ "X-JFrog-Art-Api" = "$artifactory_key"}

# 解压压缩包到指定目录
Expand-Archive -Path C:\Users\Administrator\Downloads\managesoft.zip -DestinationPath C:\Users\Administrator\Downloads\managesoft

# 重命名MSI文件,去掉名称中的空格
Get-ChildItem "C:\Users\Administrator\Downloads\managesoft" -Recurse | Where-Object {$_.Extension -eq ".msi"} | Rename-Item -NewName { $_.Name -replace ' ','' }

# 获取MSI文件的完整路径
$msi_install_path = Get-ChildItem "C:\Users\Administrator\Downloads\managesoft" -Recurse | Where-Object {$_.Extension -eq ".msi"} | Select-Object -First 1 -ExpandProperty FullName

# 验证MSI路径是否有效
if (-not (Test-Path $msi_install_path)) {
    Write-Error "无法找到有效的MSI安装包:$msi_install_path"
    exit 1
}

# 执行静默安装并生成日志
msiexec.exe /i "$msi_install_path" /qn /L*V "C:\FlexNetInstallLog.txt"

备注:内容来源于stack exchange,提问作者SudhakaranR

火山引擎 最新活动