web-dev-qa-db-fra.com

Comment installer .MSI avec PowerShell

Je suis très nouveau dans PowerShell et j'ai quelques difficultés à comprendre.
Je souhaite installer un .MSI dans le script PowerShell.
Pouvez-vous m'expliquer comment faire ou me fournir un tutoriel pour débutant 

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

Pourquoi avoir si envie? Appelez simplement le fichier .msi:

& <path>\filename.msi

ou

Start-Process <path>\filename.msi

Edit: Liste complète des paramètres Start-Process

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

13
Adi Inbar
#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}
}

J'ai cherché tout cela moi-même et suis venu avec zilch mais j'ai finalement pavé ce script de travail ensemble. Ça marche très bien! Je pensais que je posterais ici, espérons que quelqu'un d'autre puisse en bénéficier. Il extrait une liste d'ordinateurs, copie les fichiers sur les ordinateurs locaux et l'exécute. :) faire la fête!

6
bonedog73

Une personne totalement nouvelle dans PowerShell ou dans d'autres interpréteurs de commandes peut être déroutée par la partie <path> de la réponse de @ Adi. 

pour rechercher la valeur de votre chemin à l'aide de l'interface graphique Windows, cliquez avec le bouton droit sur le fichier .msi, sélectionnez "Propriétés", puis "Détails". sous "Chemin du dossier", vous verrez ce qui doit être écrit.

de sorte que votre commande ressemble à (par exemple)

& C:\Users\YourName\YourDirectory\filename.msi

cela est évident pour la plupart des utilisateurs de StackOverflow, mais un vrai débutant peut facilement s'égarer.

4
ngks

Vous pouvez utiliser:

msiexec /i "c:\package.msi"

Vous pouvez également ajouter des paramètres supplémentaires facultatifs. Il existe des paramètres msi communs et des paramètres spécifiques à votre installateur. Pour les paramètres communs, appelez simplement msiexec

4
Andrey Marchuk

Lorsque vous essayez d'installer un MSI en mode silencieux via PowerShell à l'aide de cette commande:

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

Je recevais l'erreur:

L'exécutable spécifié n'est pas une application valide pour cette plate-forme de système d'exploitation.

J'ai plutôt opté pour msiexec.exe pour exécuter le MSI avec cette commande, et cela a fonctionné comme prévu:

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

J'espère que d'autres trouveront cela utile.

2
deadlydog

Après quelques essais et tribulations, j'ai pu trouver tous les fichiers .msi dans un répertoire donné et les installer.

foreach($_msiFiles in 
($_msiFiles = Get-ChildItem $_Source -Recurse | Where{$_.Extension -eq ".msi"} |
 Where-Object {!($_.psiscontainter)} | Select-Object -ExpandProperty FullName)) 
{
    msiexec /i $_msiFiles /passive
}
1
micsea64
#$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"

}
1
sumit