如何使用PowerShell安装.MSI

时间:2013-07-24 05:07:35

标签: powershell windows-installer

我是PowerShell的新手,对理解有些困难 我想在PowerShell脚本中安装.MSI 可以请解释我如何做到这一点或提供我初学者水平教程。

$wiObject = New-Object -ComObject WindowsInstaller.Installer
?????

8 个答案:

答案 0 :(得分:14)

为何如此喜欢它?只需调用.msi文件:

& <path>\filename.msi

Start-Process <path>\filename.msi

编辑:启动过程参数的完整列表

https://ss64.com/ps/start-process.html

答案 1 :(得分:6)

#Variables
$computername = Get-Content 'M:\Applications\Powershell\comp list\Test.txt'
$sourcefile = "\\server\Apps\LanSchool 7.7\Windows\Student.msi"
#This section will install the software 
foreach ($computer in $computername) 
{
    $destinationFolder = "\\$computer\C$\download\LanSchool"
    #This section will copy the $sourcefile to the $destinationfolder. If the Folder does not exist it will create it.
    if (!(Test-Path -path $destinationFolder))
    {
        New-Item $destinationFolder -Type Directory
    }
    Copy-Item -Path $sourcefile -Destination $destinationFolder
    Invoke-Command -ComputerName $computer -ScriptBlock { & cmd /c "msiexec.exe /i c:\download\LanSchool\Student.msi" /qn ADVANCED_OPTIONS=1 CHANNEL=100}
}

我自己一直在寻找这个,并想出了zilch,但最后拼凑了这个工作剧本。它工作得很棒!我以为我希望其他人可以受益。它会提取计算机列表,将文件复制到本地计算机并运行它。 :)聚会!

答案 2 :(得分:5)

对于PowerShell或其他命令shell全新的人可能会对@ Adi的答案中的<path>部分感到困惑。

使用Windows GUI查找路径的值,右键单击.msi文件,选择“属性”,然后选择“详细信息”。在“文件夹路径”下,您将看到需要编写的内容。

所以你的命令看起来像(例如)

& C:\Users\YourName\YourDirectory\filename.msi
对于大多数使用StackOverflow的人来说,这是显而易见的,但真正的新手很容易误入歧途。

答案 3 :(得分:4)

您可以使用:

msiexec /i "c:\package.msi"

您还可以添加更多可选参数。有一些常见的msi参数和参数,这些参数和参数特定于安装程序。对于常见参数,只需调用msiexec

即可

答案 4 :(得分:4)

尝试使用此命令通过PowerShell静默安装MSI时:

Start-Process $webDeployInstallerFilePath -ArgumentList '/quiet' -Wait

我收到了错误:

  

指定的可执行文件不是此OS平台的有效应用程序。

我转而使用msiexec.exe使用此命令执行MSI,它按预期工作:

$arguments = "/i `"$webDeployInstallerFilePath`" /quiet"
Start-Process msiexec.exe -ArgumentList $arguments -Wait

希望其他人觉得这很有用。

答案 5 :(得分:1)

#$computerList = "Server Name"
#$regVar = "Name of the package "
#$packageName = "Packe name "
$computerList = $args[0]
$regVar = $args[1]
$packageName = $args[2]
foreach ($computer in $computerList)
{
    Write-Host "Connecting to $computer...."
    Invoke-Command -ComputerName $computer -Authentication Kerberos -ScriptBlock {
    param(
        $computer,
        $regVar,
        $packageName
        )

        Write-Host "Connected to $computer"
        if ([IntPtr]::Size -eq 4)
        {
            $registryLocation = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\"
            Write-Host "Connected to 32bit Architecture"
        }
        else
        {
            $registryLocation = Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
            Write-Host "Connected to 64bit Architecture"
        }
        Write-Host "Finding previous version of `enter code here`$regVar...."
        foreach ($registryItem in $registryLocation)
        {
            if((Get-itemproperty $registryItem.PSPath).DisplayName -match $regVar)
            {
                Write-Host "Found $regVar" (Get-itemproperty $registryItem.PSPath).DisplayName
                $UninstallString = (Get-itemproperty $registryItem.PSPath).UninstallString
                    $match = [RegEx]::Match($uninstallString, "{.*?}")
                    $args = "/x $($match.Value) /qb"
                    Write-Host "Uninstalling $regVar...."
                    [diagnostics.process]::start("msiexec", $args).WaitForExit() 
                    Write-Host "Uninstalled $regVar"
            }
        }

        $path = "\\$computer\Msi\$packageName"
        Write-Host "Installaing $path...."
        $args = " /i $path /qb"
        [diagnostics.process]::start("msiexec", $args).WaitForExit()
        Write-Host "Installed $path"
    } -ArgumentList $computer, $regVar, $packageName
Write-Host "Deployment Complete"

}

答案 6 :(得分:1)

经过一番试验和磨难后,我能够找到给定目录中的所有.msi文件并进行安装。

foreach($_msiFiles in 
($_msiFiles = Get-ChildItem $_Source -Recurse | Where{$_.Extension -eq ".msi"} |
 Where-Object {!($_.psiscontainter)} | Select-Object -ExpandProperty FullName)) 
{
    msiexec /i $_msiFiles /passive
}

答案 7 :(得分:0)

在powershell 5.1中,您实际上可以使用install-package,但是它不需要额外的msi参数。

install-package .\file.msi

否则将启动并等待:

start -wait file.msi ALLUSERS=1,INSTALLDIR=C:\FILE