Friday, 26 October 2012

Automated wsp installer using Powershell

######################################
######## Set Variables ###############
######################################
$InstallDIR = "C:\install"
 
######################################
#### CODE, No Changes Necessary ######
######################################
Write-Host "Working, Please wait...."
Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue
 
$Dir = get-childitem $InstallDIR -Recurse
$WSPList = $Dir | where {$_.Name -like "*.wsp*"}
Foreach ($wsp in $WSPList )
{
    $WSPFullFileName = $wsp.FullName
    $WSPFileName = $wsp.Name
    clear
    Write-Host -ForegroundColor White -BackgroundColor Blue "Working on $WSPFileName"
 
    try
    {
        Write-Host -ForegroundColor Green "Checking Status of Solution"
        $output = Get-SPSolution -Identity $WSPFileName -ErrorAction Stop
    }
    Catch
    {
        $DoesSolutionExists = $_
    }
    If (($DoesSolutionExists -like "*Cannot find an SPSolution*") -and ($output.Name -notlike  "*$WSPFileName*"))
    {
        Try
        {
            Write-Host -ForegroundColor Green "Adding solution to farm"
            Add-SPSolution "$WSPFullFileName" -Confirm:$false -ErrorAction Stop | Out-Null
 
            Write-Host -ForegroundColor Green "Checking Status of Solution"
            $output = Get-SPSolution -Identity $WSPFileName -ErrorAction Stop
            $gobal = $null
            if ($output.Deployed -eq $false)
            {
                try
                {
                    Write-Host -ForegroundColor Green "Deploy solution to all Web Apps, will skip if this solution is globally deployed"
                    Install-SPSolution -Identity "$WSPFileName" -GACDeployment -AllWebApplications -Force -Confirm:$false -ErrorAction Stop | Out-Null
                }
                Catch
                {
                    $gobal = $_
                }
                If ($gobal -like "*This solution contains*")
                {
                    Write-Host -ForegroundColor Green "Solution requires global deployment, Deploying now"
                    Install-SPSolution -Identity "$WSPFileName" -GACDeployment -Force -Confirm:$false -ErrorAction Stop | Out-Null
                }
            }
 
            Sleep 1
            $dpjobs = Get-SPTimerJob | Where { $_.Name -like "*$WSPFileName*" }
            If ($dpjobs -eq $null)
            {
                Write-Host -ForegroundColor Green "No solution deployment jobs found"
            }
            Else
            {
                If ($dpjobs -is [Array])
                {
                    Foreach ($job in $dpjobs)
                    {
                        $jobName = $job.Name
                        While ((Get-SPTimerJob $jobName -Debug:$false) -ne $null)
                        {
                            Write-Host -ForegroundColor Yellow -NoNewLine "."
                            Start-Sleep -Seconds 5
                        }
                        Write-Host
                    }
                }
                Else
                {
                    $jobName = $dpjobs.Name
                    While ((Get-SPTimerJob $jobName -Debug:$false) -ne $null)
                    {
                        Write-Host -ForegroundColor Yellow -NoNewLine "."
                        Start-Sleep -Seconds 5
                    }
                    Write-Host
                }
            }
        }
        Catch
        {
            Write-Error $_
            Write-Host -ForegroundColor Red "Skipping $WSPFileName, Due to an error"
            Read-Host
        }
    }
    Else
    {
        $skip = $null
        $tryagain = $null
        Try
        {
            if ($output.Deployed -eq $true)
            {
            Write-Host -ForegroundColor Green "Retracting Solution"
            Uninstall-SPSolution -AllWebApplications -Identity $WSPFileName -Confirm:$false -ErrorAction Stop
            }
        }
        Catch
        {
            $tryagain = $_
        }
        Try
        {
            if ($tryagain -ne $null)
            {
                Uninstall-SPSolution -Identity $WSPFileName -Confirm:$false -ErrorAction Stop
            }
        }
        Catch
        {
            Write-Host -ForegroundColor Red "Could not Retract Solution"
        }
 
        Sleep 1
        $dpjobs = Get-SPTimerJob | Where { $_.Name -like "*$WSPFileName*" }
        If ($dpjobs -eq $null)
        {
            Write-Host -ForegroundColor Green "No solution deployment jobs found"
        }
        Else
        {
            If ($dpjobs -is [Array])
            {
                Foreach ($job in $dpjobs)
                {
                    $jobName = $job.Name
                    While ((Get-SPTimerJob $jobName -Debug:$false) -ne $null)
                    {
                        Write-Host -ForegroundColor Yellow -NoNewLine "."
                        Start-Sleep -Seconds 5
                    }
                    Write-Host
                }
            }
            Else
            {
                $jobName = $dpjobs.Name
                While ((Get-SPTimerJob $jobName -Debug:$false) -ne $null)
                {
                    Write-Host -ForegroundColor Yellow -NoNewLine "."
                    Start-Sleep -Seconds 5
                }
                Write-Host
            }
        }       
 
        Try
        {
            Write-Host -ForegroundColor Green "Removing Solution from farm"
            Remove-SPSolution -Identity $WSPFileName -Confirm:$false -ErrorAction Stop
        }
        Catch
        {
            $skip = $_
            Write-Host -ForegroundColor Red "Could not Remove Solution"
            Read-Host
        }
        if ($skip -eq $null)
        {
            Try
            {
                Write-Host -ForegroundColor Green "Adding solution to farm"
                Add-SPSolution "$WSPFullFileName" -Confirm:$false -ErrorAction Stop | Out-Null
                $gobal = $null
                try
                {
                    Write-Host -ForegroundColor Green "Deploy solution to all Web Apps, will skip if this solution is globally deployed"
                    Install-SPSolution -Identity "$WSPFileName" -GACDeployment -AllWebApplications -Force -Confirm:$false -ErrorAction Stop | Out-Null
                }
                Catch
                {
                    $gobal = $_
                }
                If ($gobal -like "*This solution contains*")
                {
                    Write-Host -ForegroundColor Green "Solution requires global deployment, Deploying now"
                    Install-SPSolution -Identity "$WSPFileName" -GACDeployment -Force -Confirm:$false -ErrorAction Stop | Out-Null
                }
            }
            Catch
            {
                Write-Error $_
                Write-Host -ForegroundColor Red "Skipping $WSPFileName, Due to an error"
                Read-Host
            }
 
            Sleep 1
            $dpjobs = Get-SPTimerJob | Where { $_.Name -like "*$WSPFileName*" }
            If ($dpjobs -eq $null)
            {
                Write-Host -ForegroundColor Green "No solution deployment jobs found"
            }
            Else
            {
                If ($dpjobs -is [Array])
                {
                    Foreach ($job in $dpjobs)
                    {
                        $jobName = $job.Name
                        While ((Get-SPTimerJob $jobName -Debug:$false) -ne $null)
                        {
                            Write-Host -ForegroundColor Yellow -NoNewLine "."
                            Start-Sleep -Seconds 5
                        }
                        Write-Host
                    }
                }
                Else
                {
                    $jobName = $dpjobs.Name
                    While ((Get-SPTimerJob $jobName -Debug:$false) -ne $null)
                    {
                        Write-Host -ForegroundColor Yellow -NoNewLine "."
                        Start-Sleep -Seconds 5
                    }
                    Write-Host
                }
            }
    }
    Else
    {
        Write-Host -ForegroundColor Red "Cannot Install $WSPFileName, Please try manually"
        Read-Host
    }
}
}

No comments:

Post a Comment