# encoding: utf-8
# api: powershell
# title: Add-on.InstallPortable.p
# description: This file was uploaded by a PowerGUI Script Editor Add-on.
# version: 3.0
# type: module
# author: Adam Driscoll
# license: CC0
# x-poshcode-id: 4267
# x-archived: 2013-06-29T07:03:33
# x-published: 2013-06-26T14:59:00
#
#
#######################################################################################################################
# File: Add-on.InstallPortable.psm1 #
# Author: Adam Driscoll #
# Publisher: Quest Software #
# Copyright: © 2011 Quest Software. All rights reserved. #
# Usage: To load this module in your Script Editor: #
# 1. Open the Script Editor. #
# 2. Select "PowerShell Libraries" from the File menu. #
# 3. Check the Add-on.InstallPortable module. #
# 4. Click on OK to close the "PowerShell Libraries" dialog. #
# Alternatively you can load the module from the embedded console by invoking this: #
# Import-Module -Name Add-on.InstallPortable #
# Please provide feedback on the PowerGUI Forums. #
#######################################################################################################################
Set-StrictMode -Version 2
#region Define the Win32WindowClass
if (-not ('PowerShellTypeExtensions.Win32Window' -as [System.Type])) {
$cSharpCode = @'
using System;
namespace PowerShellTypeExtensions {
public class Win32Window : System.Windows.Forms.IWin32Window
{
public static Win32Window CurrentWindow {
get {
return new Win32Window(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle);
}
}
public Win32Window(IntPtr handle) {
_hwnd = handle;
}
public IntPtr Handle {
get {
return _hwnd;
}
}
private IntPtr _hwnd;
}
}
'@
Add-Type -ReferencedAssemblies System.Windows.Forms -TypeDefinition $cSharpCode
}
#endregion
#region Initialize the Script Editor Add-on.
$minimumSdkVersion = [System.Version]'1.0'
if ($Host.Name �ne 'PowerGUIScriptEditorHost') {
return
}
if (-not (Get-Variable -Name PGVersionTable -ErrorAction SilentlyContinue)) {
[System.Windows.Forms.MessageBox]::Show([PowerShellTypeExtensions.Win32Window]::CurrentWindow,"The ""$(Split-Path -Path $PSScriptRoot -Leaf)"" Add-on module requires PowerGUI 3.0 or later. The current PowerGUI version is $($Host.Version).$([System.Environment]::NewLine * 2)Please upgrade to the latest version of PowerGUI and try again.",'PowerGUI 3.0 or later is required',[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Null
return
} elseif ($PGVersionTable.SDKVersion -lt $minimumSdkVersion) {
[System.Windows.Forms.MessageBox]::Show([PowerShellTypeExtensions.Win32Window]::CurrentWindow,"The ""$(Split-Path -Path $PSScriptRoot -Leaf)"" Add-on module requires version $minimumSdkVersion or later of the PowerGUI Script Editor SDK. The current SDK version is $($PGVersionTable.SDKVersion).$([System.Environment]::NewLine * 2)Please upgrade to the latest version of PowerGUI and try again.","Version $minimumSdkVersion or later of the SDK is required",[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Null
return
}
#endregion
#region Load resources from disk.
$iconLibrary = @{
InstallPortableIcon16 = New-Object System.Drawing.Icon -ArgumentList "$PSScriptRoot\usb.ico",16,16
InstallPortableIcon32 = New-Object System.Drawing.Icon -ArgumentList "$PSScriptRoot\usb.ico",32,32
}
$imageLibrary = @{
InstallPortable16 = $iconLibrary['InstallPortableIcon16'].ToBitmap()
}
#endregion
if (-not ($clearConsoleCommand = $PGSE.Commands['ToolsCommand.InstallPortableCommand'])) {
$InstallPortableCommand = New-Object -TypeName Quest.PowerGUI.SDK.ItemCommand -ArgumentList 'ToolsCommand','InstallPortableCommand'
$InstallPortableCommand.Text = '&Install Portable'
$InstallPortableCommand.Image = $imageLibrary['InstallPortable16']
$InstallPortableCommand.ScriptBlock = {
#
# Open a FolderBrowserDialog to navigate to the folder to place PowerGUI in.
#
$dialog = New-Object System.Windows.Forms.FolderBrowserDialog
$dialog.ShowDialog()
$destination = $dialog.SelectedPath
if ($destination -ne $null -and $destination.LastIndexOf([system.IO.Path]::DirectorySeparatorChar) -lt 0)
{
$destination = "$destination$([system.IO.Path]::DirectorySeparatorChar)"
}
if (-not [String]::IsNullOrEmpty($destination))
{
$i = 0
#
# Progress bar that doesn't actually report actual progress....makes you feel better about it though...
#
Write-Progress -Activity "Installing PowerGUI to USB Key..." -Status "Processing..." -PercentComplete $i
Start-Job -Name "InstallPortable" -FilePath "$PSScriptRoot\InstallPortable.ps1" -ArgumentList $destination,$PGHome,"PowerGUI"
#
# Hack because the Job returned by Start-Job always returns completed...even when it has not...
#
while(-not (Test-Path -Path (Join-Path $destination "PowerGUI ScriptEditor_x86.exe")))
{
Write-Progress -Activity "Installing PowerGUI to USB Key..." -Status "Processing..." -PercentComplete $i
#
# In case it takes longer than 25 seconds...
#
$i++
if ($i -gt 100)
{
$i = 0
}
Start-Sleep -Milliseconds 250
}
Write-Progress -Activity "Installing PowerGUI to USB Key..." -Status "Processing..." -Completed
#
# In case there was an error
#
$jobResult = Receive-Job -Name "InstallPortable"
if ($jobResult -ne $null)
{
throw $jobResult
}
}
}
$PGSE.Commands.Add($InstallPortableCommand)
$ToolBar = $PGSE.Toolbars | Where { $_.Title -eq "Standard" }
$ToolBar.Items.Add($InstallPortableCommand)
}
#region Clean-up the Add-on when it is removed.
$ExecutionContext.SessionState.Module.OnRemove = {
#region Remove the install portable toolbar button from the Standard toolbar.
$standardToolbar = $null
foreach ($item in $pgse.Toolbars) {
if ($item.Title -eq 'Standard') {
$standardToolbar = $item
break
}
}
if (($standardToolbar) -and
($newAddonToolbarButton = $standardToolbar.Items['ToolsCommand.InstallPortableCommand'])) {
$standardToolbar.Items.Remove($newAddonToolbarButton) | Out-Null
}
#endregion
if (($viewMenu = $PGSE.Menus['MenuBar.View']) -and
($installPortableCommand = $viewMenu.Items['ToolsCommand.InstallPortableCommand'])) {
$viewMenu.Items.Remove($installPortableCommand) | Out-Null
}
if ($installPortableCommand =
$PGSE.Commands['ToolsCommand.InstallPortableCommand']) {
$PGSE.Commands.Remove($installPortableCommand) | Out-Null
}
}
#endregion
# SIG # Begin signature block
# MIIPIgYJKoZIhvcNAQcCoIIPEzCCDw8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU5AxIA2EVAIt/MCwdiKxi3AzO
# EFWgggz6MIIEDTCCAvWgAwIBAgILBAAAAAABI54PrLMwDQYJKoZIhvcNAQEFBQAw
# VzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV
# BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAx
# MjgxMzAwMDBaFw0xNzAxMjcxMjAwMDBaMIGBMQswCQYDVQQGEwJCRTEZMBcGA1UE
# ChMQR2xvYmFsU2lnbiBudi1zYTElMCMGA1UECxMcUHJpbWFyeSBPYmplY3QgUHVi
# bGlzaGluZyBDQTEwMC4GA1UEAxMnR2xvYmFsU2lnbiBQcmltYXJ5IE9iamVjdCBQ
# dWJsaXNoaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAopt1
# KqcTuglxJBjfoQZiKRKe3J51c+jfVldplhNWT/LIvAFY7SaGcgtg9RnFVQNXm7kQ
# yaHUdED/bADo5lM3/rfaeT64UjjpgSyfDjNSps1wzkpdYvTRZ168l0oHyrzdjUex
# zfFlW4UBsEtr3s2OLvVQ6KOcnSaYazZjQQNwRPBf4iV1eVB9X6EGokYMVZVHFNOR
# RoZomecn9JTsmkFR95bUeozhRJdocQPYWG+9tBBC7g1mdUaLRJbSMAASB2P3RJsB
# cMpWb5xYlyonF4sucVJtRqunKw9/FkhkyFL6BhcAB3TXRbMM9XiVc+gK7sTgcowe
# Eaoeu17O+bQA7nO9zQIDAQABo4GuMIGrMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
# Af8EBTADAQH/MB0GA1UdDgQWBBQVUXkafAxZ+drN2MQ6E5rJeC1/TTAzBgNVHR8E
# LDAqMCigJqAkhiJodHRwOi8vY3JsLmdsb2JhbHNpZ24ubmV0L1Jvb3QuY3JsMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj/
# /P1LMA0GCSqGSIb3DQEBBQUAA4IBAQC1eKaifAS3f8l/fWq8cfopMGDC9GIe/n9D
# Hptu4rIfcwuFdlt99U5JBi/U+reRQO/tb42OE4NUxSoCPQqk3JkLer13L8xAwY/z
# xIxOcroQfOb/ZCvHzmyn/NeafI5GjQGDTUI725w/nzJhV9cXsLM2ZvCz/URvgTex
# lE6nViWJ9YrWbRFiYnlcQpACGNOcI/wI6GRFuS1+gFtOr8OKKZKDeB+RQTSvhcX9
# B5lOLFz+x/0XuyUlMU1ytbUpS0iaN28TxxFOSkUefi8xnKvoUq/WZ5c0iF8OJ2pm
# UtFax6wwLCA43Sv/OuvOEEWConsboSBzVpsqk+YEUQZsG9wviZSTMIIEDjCCAvag
# AwIBAgILAQAAAAABHfPLkTMwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCQkUx
# GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExFjAUBgNVBAsTDU9iamVjdFNpZ24g
# Q0ExITAfBgNVBAMTGEdsb2JhbFNpZ24gT2JqZWN0U2lnbiBDQTAeFw0wODEyMDEx
# NzIyMTZaFw0xMTEyMDExNzIyMTZaMGgxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5R
# dWVzdCBTb2Z0d2FyZTEXMBUGA1UEAxMOUXVlc3QgU29mdHdhcmUxJzAlBgkqhkiG
# 9w0BCQEWGGVpbmFyLm15a2xldHVuQHF1ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEF
# AAOBjQAwgYkCgYEAo8H3TLiL3ZuyDnISttAV2LQBnEVPzsYBTKRTzYzc/F7mJEIk
# AP3obTb310inr0QQoeOMLBw8PqzhkYtGI/iTyGgDEjXHRUlJrjXJkqPVzwER+y8n
# ErZDfNlAhICZMfVQ0woKubOlzFdyRZddSS2yCNkHvt1hE4eQpf/2km6xgwECAwEA
# AaOCAUAwggE8MB8GA1UdIwQYMBaAFNJb80smS6Ww5139Vn/28S44TlOgME4GCCsG
# AQUFBwEBBEIwQDA+BggrBgEFBQcwAoYyaHR0cDovL3NlY3VyZS5nbG9iYWxzaWdu
# Lm5ldC9jYWNlcnQvT2JqZWN0U2lnbi5jcnQwOQYDVR0fBDIwMDAuoCygKoYoaHR0
# cDovL2NybC5nbG9iYWxzaWduLm5ldC9PYmplY3RTaWduLmNybDAJBgNVHRMEAjAA
# MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzBLBgNVHSAERDBC
# MEAGCSsGAQQBoDIBMjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdsb2JhbHNp
# Z24ubmV0L3JlcG9zaXRvcnkvMBEGCWCGSAGG+EIBAQQEAwIEEDANBgkqhkiG9w0B
# AQUFAAOCAQEADEv3HbOXij3ilFpZ7zaa3FPCKPx+6G9uS0D57wOb4JfGazsDzd5p
# ClujkMtSppWrKgacKZSphZDlxlfJjOjOtzuIr87qrFyzIPo0y42bYQiKzxcy7Ofv
# t9ET+LYDAV87JaindZr7lvjK3CpVZ8YRSLy0M8vF3vlaOTMbX/L79+MXwxvETloG
# mN0lz7E+24JpzdAiryyn7oY2KvS+Rsw+s0blzeeej7HOgb0HqWNcBRth2xWgcOuN
# M7II1o4/24VvMKNDh7/SaH8/E2ps51tZXIHEB3QVIA+0zJu5kouW+d3WoD8yjysA
# irVeWiRAHWhrcP0iiBUxtBieZQBU2F879DCCBNMwggO7oAMCAQICCwQAAAAAASOe
# D68kMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xv
# YmFsU2lnbiBudi1zYTElMCMGA1UECxMcUHJpbWFyeSBPYmplY3QgUHVibGlzaGlu
# ZyBDQTEwMC4GA1UEAxMnR2xvYmFsU2lnbiBQcmltYXJ5IE9iamVjdCBQdWJsaXNo
# aW5nIENBMB4XDTA0MDEyMjEwMDAwMFoXDTE3MDEyNzEwMDAwMFowYzELMAkGA1UE
# BhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExFjAUBgNVBAsTDU9iamVj
# dFNpZ24gQ0ExITAfBgNVBAMTGEdsb2JhbFNpZ24gT2JqZWN0U2lnbiBDQTCCASIw
# DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALCx8oAAcM7sw4y0l+3GCYwmb4nf
# Z1mBz94UE0zCsUXiU3VB+gc2b7oRcCiUfG1yvQcVJWU6Cf+F3Pp7XjeHOOTHSwiA
# mJ6KzVgJAsDDAUmWWIiJJln1bca5wfsYJe3YYk7KCmxdcO/O05spCwnG9u62FtQ8
# VI7MXeCv290jCTJ7MoEWYgoGy3rPNCG2bza2sc7Lmik1QD6dWHz/rYKY+rjVico1
# 3cvNVwbLm+S/lKiAmF93lvC256t0eUAhpmPp0AeRvYU4tK6WrKH/FHPapUW4TYbO
# Kjzv1N8oDnWpqIgTwuR8YJPyJcwDhJfmTrafLda1izQ8q9U4Osg9xLH5lM0CAwEA
# AaOCAWcwggFjMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
# A1UdDgQWBBTSW/NLJkulsOdd/VZ/9vEuOE5ToDBKBgNVHSAEQzBBMD8GCSsGAQQB
# oDIBMjAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3Lmdsb2JhbHNpZ24ubmV0L3Jl
# cG9zaXRvcnkwOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL2NybC5nbG9iYWxzaWdu
# Lm5ldC9wcmltb2JqZWN0LmNybDBOBggrBgEFBQcBAQRCMEAwPgYIKwYBBQUHMAKG
# Mmh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5uZXQvY2FjZXJ0L1ByaW1PYmplY3Qu
# Y3J0MBEGCWCGSAGG+EIBAQQEAwIAATATBgNVHSUEDDAKBggrBgEFBQcDAzAfBgNV
# HSMEGDAWgBQVUXkafAxZ+drN2MQ6E5rJeC1/TTANBgkqhkiG9w0BAQUFAAOCAQEA
# HmrzbfSOqSL+cAhlLqFdqzMw3Wx4+kvqrcWN7BB6asVYlzlrkvOR4gynKBzRXXaO
# iwd8E2+txDZDs8G8MVnPGDjYozvO/8pnWL/g8axhPqI7HrwCW0GsRGv1JvPtXqhl
# 9splpj/K9XfrpYYqWClW+L4WEEDp0vxXLGNhN2YlOSAuBwOgNgMllL18637To8LF
# dhZ1MJK5/3ZBNSFo0Q5eXI7DA2DmgED8wF2iVG5ukmengRKHoqMr27dN/+TVx+UF
# 5tXxrvzNZhgh8z5HyeWVQmEsnSaAsg+oPQ7Jp3jfbnSMLEb2cuk8ZGsoVcRLZDPL
# eFQTOPDVcQbUPg0KNQ7gszGCAZIwggGOAgEBMHIwYzELMAkGA1UEBhMCQkUxGTAX
# BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExFjAUBgNVBAsTDU9iamVjdFNpZ24gQ0Ex
# ITAfBgNVBAMTGEdsb2JhbFNpZ24gT2JqZWN0U2lnbiBDQQILAQAAAAABHfPLkTMw
# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN
# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
# IwYJKoZIhvcNAQkEMRYEFAAngIKxiKiRcDBlvxXVCRrl83n3MA0GCSqGSIb3DQEB
# AQUABIGAFQZHwXudbwjk3ywBexoUftg4adLhoKXgXQDptwJBOFKy30NlNtQJNVil
# OpDmaIeWmRxKZ6UuY8iUREUuZu/Eg0TFstWhR3XOjWt65kcT2qGNVW9JEyePIVie
# ynVftC9o3jIwM8axRx5iSEZT8SdfZkXpTz1o943hF1KVWRdH8zU=
# SIG # End signature block