summaryrefslogtreecommitdiff
path: root/windows/win_unzip.ps1
diff options
context:
space:
mode:
authorschwartzmx <schwartzmx@gmail.com>2015-01-11 13:03:26 -0600
committerschwartzmx <schwartzmx@gmail.com>2015-01-11 13:03:26 -0600
commit99927a5c54aeca8ff18359f17d776a5f624d32a7 (patch)
tree08e3687030aba63c8e78e964272fc2a920556091 /windows/win_unzip.ps1
parenta95fabeeb2fff2d0e16b532d35da4dd60adb0b22 (diff)
downloadansible-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.ps1147
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;