【问题标题】:msiexec Powershell silent installmsiexec Powershell 静默安装
【发布时间】:2022-11-24 03:54:01
【问题描述】:

我正在寻找一个允许我静默安装 msi 文件的 Powershell 脚本。 我们有超过 25000 台个人电脑,所以我必须用脚本来做到这一点。

不幸的是,目前在执行后弹出一个窗口(Windows Installer),其中显示了 msi 文件的参数。仅此而已,没有弹出其他“错误消息”。

脚本应该做的第一件事是检查 PC 是台式机还是移动设备。 如果它是桌面设备,他应该在文件中写上“使用了桌面配置”。 同时,msi 安装程序应该以一些参数启动。 如果是笔记本电脑,程序应该几乎相同。

安装成功后,用户应注销。

我需要这个脚本来在我们公司实施 2FA。

目前的代码如下所示:

IF ( ((Get-ComputerInfo | select -expand CsPCSystemType) -LIKE "Desktop") )
    {
        Write-Output "Desktop Configuration was used." >> \\XXX\XXX\XXX\XXX\Log\$env:Computername.txt 
        
        
        msiexec.exe /i "%~dp0setup.msi" /passive /norestart /L*v "%~dp0setup.log"

    }    

ELSE {
        Write-Output "Laptop Configuration was used." >> \\XXX.XXX.XX\X\XX\XXX\XXXX\$env:Computername.txt 
        msiexec.exe /i "%~dp0setup.msi" /passive /norestart  /L*v "%~dp0setup.log"

    }   

Write-Output "Lock Configuration was used." >> \\XXX\XXX\XXX\XXX\Log\$env:Computername.txt
rundll32.exe user32.dll,LockWorkStation

非常感谢任何帮助。

【问题讨论】:

  • 不幸的是,目前我收到无法安装 msi 文件的错误。也许用确切的错误更新问题?
  • 完成 :) 非常抱歉我一开始没有这样做。它显示一个窗口 (Windows Installer),其中包含所有 msiexec 参数。没有其他错误信息。
  • 当通过 PowerShell 调用带有参数的可执行文件时,我通常会将参数作为数组传递,但我不确定这是否会解决您面临的问题。而不是 msiexec.exe /i "%~dp0setup.msi" /passive /norestart /L*v "%~dp0setup.log" 尝试 $parameters = "/i", "%~dp0setup.msi","/passive","/norestart","/L*v", "%~dp0setup.log" 然后像这样调用 msiexec &msiexec.exe $parameters
  • 日志文件包含什么?这可能会告诉您它不喜欢哪些命令行参数 - 例如 msi 文件可能丢失或不可用(我认为 %~dp0命令提示符,因此它可能会尝试查找字面上名为 %~dp0setup.msi 的文件,而不是扩展标记。此外,如果它是用于笔记本电脑和台式机的完全相同的 msiexec 命令,则无需在 if 的两个分支中复制它 - 只需将其放在后面即可。

标签: powershell if-statement windows-installer silent-installer


【解决方案1】:

令牌%~dp0(解析为当前脚本所在的目录)仅适用于批处理脚本。

在 PowerShell 中,将 $~dp0 替换为 $PSScriptRoot。这应该可以解决 msiexec 显示可用命令行选项的问题。

您的脚本的另一个问题是 msiexec 异步运行,当直接作为命令调用时。因此,您的脚本将在安装仍在运行时完成,这可能不是您想要的。这是因为 msiexec.exe 是一个 GUI 应用程序。要同步运行 GUI 应用程序,请使用 Start-Process -Wait


$Arguments = "/i", "`"$PSScriptRootsetup.msi`"", "/passive", "/norestart", "/L*v", "`"$PSScriptRootsetup.log`""
$msiProcess = Start-Process msiexec.exe -Wait -ArgumentList $Arguments -PassThru

# Check if installation was successful 
# 0 = ERROR_SUCCESS, 3010 = ERROR_SUCCESS_REBOOT_REQUIRED
if( $msiProcess.ExitCode -in 0, 3010 ) {
    Write-Host "Installation succeeded with exit code $($msiProcess.ExitCode)"
}

【讨论】:

  • 非常感谢 sooooooooooooooo,这就是解决方案 <3
【解决方案2】:

尝试传递静默开关(/qn!或/qb!)而不是/passive 标志。

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2015-01-03
    • 2011-11-11
    相关资源
    最近更新 更多