diff --git a/windows/win_msi b/windows/win_msi index 9eb6f1bafa5..12da6e1422c 100644 --- a/windows/win_msi +++ b/windows/win_msi @@ -45,7 +45,15 @@ options: description: - Path to a file created by installing the MSI to prevent from attempting to reinstall the package on every run -author: Matt Martz + msiname: + description: + - alternative way to check for the existence of an msi (can be used for both states (absent and present). + The msiname can be found by looking at name property of the the win32_product object for the item. + msiversionstring + description: + - used in conjunction with msiname - you cannot specify msiversionstring only. + The msiversionstring can be found by looking at version property of the the win32_product object for the item. +author: Matt Martz / Trond Hindenes ''' EXAMPLES = ''' @@ -54,5 +62,7 @@ EXAMPLES = ''' # Uninstall an MSI file - win_msi: path=C:\\\\7z920-x64.msi state=absent + +- win_msi: path=C:\\\\7z920-x64.msi msiname="myproduct" msiversionstring="3.2.0" ''' diff --git a/windows/win_msi.ps1 b/windows/win_msi.ps1 index 1c2bc8a3019..6f27e0eea34 100644 --- a/windows/win_msi.ps1 +++ b/windows/win_msi.ps1 @@ -24,34 +24,89 @@ $params = Parse-Args $args; $result = New-Object psobject; Set-Attr $result "changed" $false; -If (-not $params.path.GetType) +If (!($params.path)) { Fail-Json $result "missing required arguments: path" } -$extra_args = "" -If ($params.extra_args.GetType) +if (!(test-path $params.path)) +{ + Fail-Json $result "couldn't find a file at $($params.path)" +} + + +If ($params.extra_args) { $extra_args = $params.extra_args; } +Else +{ + $extra_args = "" +} + +if ($params.MsiVersionString) +{ + $MsiVersionString = $params.MsiVersionString +} + +if ($params.MsiName) +{ + $MsiName = $params.MsiName +} + +if (($MsiVersionString) -and (!($MsiName))) +{ + #If msiversionstring is specified, we need msiname as well + Fail-Json $result "missing required arguments: MsiName" +} + -If ($params.creates.GetType -and $params.state.GetType -and $params.state -ne "absent") +If (($params.creates) -and ($params.state -ne "absent")) { - If (Test-File $creates) + If (Test-Path ($params.creates)) { Exit-Json $result; } } -$logfile = [IO.Path]::GetTempFileName(); -if ($params.state.GetType -and $params.state -eq "absent") +if ($MsiName) { - msiexec.exe /x $params.path /qb /l $logfile $extra_args; + $AlreadyInstalledMsi = Get-WmiObject -Query "Select * from win32_product" | where {$_.Name -eq $MsiName} +} +ElseIf (($MsiName) -and ($MsiVersionString)) +{ + $AlreadyInstalledMsi = Get-WmiObject -Query "Select * from win32_product" | where {($_.Name -eq $MsiName) -and ($_.version -eq $MsiVersionString)} } Else { + if ($params.state -eq "absent") + { + #existing msi check not specify, assume msi does exist + $AlreadyInstalledMsi = $true + } + if ($params.state -eq "present") + { + #existing msi check not specify, assume msi does exist + $AlreadyInstalledMsi = $false + } +} + +if (($AlreadyInstalledMsi) -and ($params.state -eq "absent")) +{ + #Already installed, perform uninstall + msiexec.exe /x $params.path /qb /l $logfile $extra_args; +} +Elseif((!$AlreadyInstalledMsi) -and ($params.state -eq "present")) +{ + #Not already installed, perform the install + $logfile = [IO.Path]::GetTempFileName(); msiexec.exe /i $params.path /qb /l $logfile $extra_args; } +Else +{ + #Do nothing + Exit-Json $result; +} Set-Attr $result "changed" $true;