diff options
author | schwartzmx <schwartzmx@gmail.com> | 2015-01-11 13:03:26 -0600 |
---|---|---|
committer | schwartzmx <schwartzmx@gmail.com> | 2015-01-11 13:03:26 -0600 |
commit | 99927a5c54aeca8ff18359f17d776a5f624d32a7 (patch) | |
tree | 08e3687030aba63c8e78e964272fc2a920556091 /windows/win_unzip.ps1 | |
parent | a95fabeeb2fff2d0e16b532d35da4dd60adb0b22 (diff) | |
download | ansible-modules-extras-99927a5c54aeca8ff18359f17d776a5f624d32a7.tar.gz |
updates docs, adds unzip func for bz2 gz tar msu¬
- Added functionality for unzipping/decompressing bzip gzip tar exe (self extracting) and msu (ms update) files to coincide with added functionality to win_zip¬
- Added functionality requires PSCX (it will be installed if it can't be imported)¬¬
- First try with chocolatey, if fail, direct install from msi
- Added recurse param to recursively unzip files from a compressed folder¬
- useful for example: unzipping a Log.zip file that contains a load of .gz files¬
- setting rm param to true will remove all compressed files after decompressing¬
Diffstat (limited to 'windows/win_unzip.ps1')
-rw-r--r-- | windows/win_unzip.ps1 | 147 |
1 files changed, 128 insertions, 19 deletions
diff --git a/windows/win_unzip.ps1 b/windows/win_unzip.ps1 index e77aa9e1..f31a6273 100644 --- a/windows/win_unzip.ps1 +++ b/windows/win_unzip.ps1 @@ -26,15 +26,17 @@ $result = New-Object psobject @{ changed = $false } -If ($params.zip) { - $zip = $params.zip.toString() +If ($params.src) { + $src = $params.src.toString() - If (-Not (Test-Path -path $zip)){ - Fail-Json $result "zip file: $zip does not exist." + If (-Not (Test-Path -path $src)){ + Fail-Json $result "src file: $src does not exist." } + + $ext = [System.IO.Path]::GetExtension($dest) } Else { - Fail-Json $result "missing required argument: zip" + Fail-Json $result "missing required argument: src" } If (-Not($params.dest -eq $null)) { @@ -53,22 +55,120 @@ Else { Fail-Json $result "missing required argument: dest" } -Try { - $shell = New-Object -ComObject Shell.Application - $shell.NameSpace($dest).copyhere(($shell.NameSpace($zip)).items(), 20) - $result.changed = $true +If ($params.recurse -eq "true" -Or $params.recurse -eq "yes") { + $recurse = $true } -Catch { - # Used to allow reboot after exe hotfix extraction (Windows 2008 R2 SP1) - # This will have no effect in most cases. - If (-Not ([System.IO.Path]::GetExtension($zip) -match ".exe")){ - $result.changed = $false - Fail-Json $result "Error unzipping $zip to $dest" - } +Else { + $recurse = $false } If ($params.rm -eq "true" -Or $params.rm -eq "yes"){ - Remove-Item $zip -Recurse -Force + $rm = $true + Set-Attr $result.win_unzip "rm" "true" +} +Else { + $rm = $false +} + +If ($ext -eq ".zip" -And $recurse -eq $false) { + Try { + $shell = New-Object -ComObject Shell.Application + $shell.NameSpace($dest).copyhere(($shell.NameSpace($src)).items(), 20) + $result.changed = $true + } + Catch { + Fail-Json $result "Error unzipping $src to $dest" + } +} +# Need PSCX +Else { + # Requires PSCX, will be installed if it isn't found + # Pscx-3.2.0.msi + $url = "http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=pscx&DownloadId=923562&FileTime=130585918034470000&Build=20959" + $msi = "C:\Pscx-3.2.0.msi" + + # Check if PSCX is installed + $list = Get-Module -ListAvailable + # If not download it and install + If (-Not ($list -match "PSCX")) { + # Try install with chocolatey + Try { + cinst -force PSCX + $choco = $true + } + Catch { + $choco = $false + } + # install from downloaded msi if choco failed or is not present + If ($choco -eq $false) { + Try { + $client = New-Object System.Net.WebClient + $client.DownloadFile($url, $msi) + } + Catch { + Fail-Json $result "Error downloading PSCX from $url and saving as $dest" + } + Try { + msiexec.exe /i $msi /qb + # Give it a chance to install, so that it can be imported + sleep 10 + } + Catch { + Fail-Json $result "Error installing $msi" + } + } + Set-Attr $result.win_zip "pscx_status" "pscx was installed" + $installed = $true + } + Else { + Set-Attr $result.win_zip "pscx_status" "present" + } + + # Import + Try { + If ($installed) { + Import-Module 'C:\Program Files (x86)\Powershell Community Extensions\pscx3\pscx\pscx.psd1' + } + Else { + Import-Module PSCX + } + } + Catch { + Fail-Json $result "Error importing module PSCX" + } + + Try { + If ($recurse) { + Expand-Archive -Path $src -OutputPath $dest -Force + + If ($rm) { + Get-ChildItem $dest -recurse | Where {$_.extension -eq ".gz" -Or $_.extension -eq ".zip" -Or $_.extension -eq ".bz2" -Or $_.extension -eq ".tar" -Or $_.extension -eq ".msu"} | % { + Expand-Archive $_.FullName -OutputPath $dest -Force + Remove-Item $_.FullName -Force + } + } + Else { + Get-ChildItem $dest -recurse | Where {$_.extension -eq ".gz" -Or $_.extension -eq ".zip" -Or $_.extension -eq ".bz2" -Or $_.extension -eq ".tar" -Or $_.extension -eq ".msu"} | % { + Expand-Archive $_.FullName -OutputPath $dest -Force + } + } + } + Else { + Expand-Archive -Path $src -OutputPath $dest -Force + } + } + Catch { + If ($recurse) { + Fail-Json "Error recursively expanding $src to $dest" + } + Else { + Fail-Json "Error expanding $src to $dest" + } + } +} + +If ($rm -eq $true){ + Remove-Item $src -Recurse -Force Set-Attr $result.win_unzip "rm" "true" } @@ -77,8 +177,17 @@ If ($params.restart -eq "true" -Or $params.restart -eq "yes") { Set-Attr $result.win_unzip "restart" "true" } - -Set-Attr $result.win_unzip "zip" $zip.toString() +# Fixes a fail error message (when the task actually succeeds) for a "Convert-ToJson: The converted JSON string is in bad format" +# This happens when JSON is parsing a string that ends with a "\", which is possible when specifying a directory to download to. +# This catches that possible error, before assigning the JSON $result +If ($src[$src.length-1] -eq "\") { + $src = $src.Substring(0, $src.length-1) +} +If ($dest[$dest.length-1] -eq "\") { + $dest = $dest.Substring(0, $dest.length-1) +} +Set-Attr $result.win_unzip "src" $src.toString() Set-Attr $result.win_unzip "dest" $dest.toString() +Set-Attr $result.win_unzip "recurse" $recurse.toString() Exit-Json $result; |