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
?????
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
#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!
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.
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
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.
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
}
#$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"
}