Skip to content

Commit

Permalink
improved msi
Browse files Browse the repository at this point in the history
  • Loading branch information
trondhindenes committed Jul 6, 2014
1 parent d568966 commit 7eac212
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 9 deletions.
12 changes: 11 additions & 1 deletion library/windows/win_msi
Original file line number Diff line number Diff line change
Expand Up @@ -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 = '''
Expand All @@ -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"
'''

71 changes: 63 additions & 8 deletions library/windows/win_msi.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 7eac212

Please sign in to comment.