Speed up SharePoint 2013 Cumulative update installation

Hi,
Installing SharePoint Cumulative update can be very slow, I mean painfully slow (after 1h waiting the damed thing only shows 40%).
While googling I found this post from Russ Maxwell, the script he provided reduced my full CU install to 15min.

Copy this script in the same folder as the "exe" file of the cumulative update and run it in PowerShell, see Russ's post for more details :)
Remember to run "psconfig -cmd upgrade -inplace b2b -wait" after installing the CU.
At the end you may have to manually restart IIS Application pools.
Add-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue

<# ============================================================== 
  // 
  // Microsoft provides programming examples for illustration only, 
  // without warranty either expressed or implied, including, but not 
// limited to, the implied warranties of merchantability and/or 
  // fitness for a particular purpose. 
  // 
  // This sample assumes that you are familiar with the programming 
  // language being demonstrated and the tools used to create and debug 
  // procedures. Microsoft support professionals can help explain the 
  // functionality of a particular procedure, but they will not modify 
  // these examples to provide added functionality or construct 
  // procedures to meet your specific needs. If you have limited 
  // programming experience, you may want to contact a Microsoft 
  // Certified Partner or the Microsoft fee-based consulting line at 
  //  (800) 936-5200 . 
  // 
  // For more information about Microsoft Certified Partners, please 
  // visit the following Microsoft Web site: 
  // https://partner.microsoft.com/global/30000104 
  // 
  // Author: Russ Maxwell (russmax@microsoft.com) 
  // 
  // ---------------------------------------------------------- #>

 

########################### 
##Ensure Patch is Present## 
########################### 
$patchfile = Get-ChildItem | where{$_.Extension -eq ".exe"} 
if($patchfile -eq $null) 
{ 
  Write-Host "Unable to retrieve the file.  Exiting Script" -ForegroundColor Red 
  Return 
}

######################## 
##Stop Search Services## 
######################## 
##Checking Search services## 
$srchctr = 1 
$srch4srvctr = 1 
$srch5srvctr = 1

$srv4 = get-service "OSearch15" 
$srv5 = get-service "SPSearchHostController"

If(($srv4.status -eq "Running") -or ($srv5.status-eq "Running")) 
  { 
    Write-Host "Choose 1 to Pause Search Service Application" -ForegroundColor Cyan 
    Write-Host "Choose 2 to leave Search Service Application running" -ForegroundColor Cyan 
    $searchappresult = Read-Host "Press 1 or 2 and hit enter"  
    Write-Host 
   

   if($searchappresult -eq 1) 
    { 
        $srchctr = 2 
        Write-Host "Pausing the Search Service Application" -foregroundcolor yellow 
        Write-Host "This could take a few minutes" -ForegroundColor Yellow 
        $ssa = get-spenterprisesearchserviceapplication 
        $ssa.pause() 
    } 
   

    elseif($searchappresult -eq 2) 
    { 
        Write-Host "Continuing without pausing the Search Service Application" 
    } 
    else 
    { 
        Write-Host "Run the script again and choose option 1 or 2" -ForegroundColor Red 
        Write-Host "Exiting Script" -ForegroundColor Red 
        Return 
    } 
  }

Write-Host "Stopping Search Services if they are running" -foregroundcolor yellow 
if($srv4.status -eq "Running") 
  { 
    $srch4srvctr = 2 
    set-service -Name "OSearch15" -startuptype Disabled 
    $srv4.stop() 
  }

if($srv5.status -eq "Running") 
  { 
    $srch5srvctr = 2 
    Set-service "SPSearchHostController" -startuptype Disabled 
    $srv5.stop() 
  }

do 
  { 
    $srv6 = get-service "SPSearchHostController" 
    if($srv6.status -eq "Stopped") 
    { 
        $yes = 1 
    } 
    Start-Sleep -seconds 10 
  } 
  until ($yes -eq 1)

Write-Host "Search Services are stopped" -foregroundcolor Green 
Write-Host

 

####################### 
##Stop Other Services## 
####################### 
Set-Service -Name "IISADMIN" -startuptype Disabled 
Set-Service -Name "SPTimerV4" -startuptype Disabled 
Write-Host "Gracefully stopping IIS W3WP Processes" -foregroundcolor yellow 
Write-Host 
iisreset -stop -noforce 
Write-Host "Stopping Services" -foregroundcolor yellow 
Write-Host

$srv2 = get-service "SPTimerV4" 
  if($srv2.status -eq "Running") 
  {$srv2.stop()}

Write-Host "Services are Stopped" -ForegroundColor Green 
Write-Host 
Write-Host

 

################## 
##Start patching## 
################## 
Write-Host "Patching now keep this PowerShell window open" -ForegroundColor Magenta 
Write-Host 
$starttime = Get-Date

$filename = $patchfile.basename 
$arg = "/passive"

Start-Process $filename $arg

Start-Sleep -seconds 20 
$proc = get-process $filename 
$proc.WaitForExit()

$finishtime = get-date 
Write-Host 
Write-Host "Patch installation complete" -foregroundcolor green 
Write-Host

 

################## 
##Start Services## 
################## 
Write-Host "Starting Services Backup" -foregroundcolor yellow 
Set-Service -Name "SPTimerV4" -startuptype Automatic 
Set-Service -Name "IISADMIN" -startuptype Automatic

##Grabbing local server and starting services## 
$servername = hostname 
$server = get-spserver $servername

$srv2 = get-service "SPTimerV4" 
$srv2.start() 
$srv3 = get-service "IISADMIN" 
$srv3.start() 
$srv4 = get-service "OSearch15" 
$srv5 = get-service "SPSearchHostController"

###Ensuring Search Services were stopped by script before Starting" 
if($srch4srvctr -eq 2) 
{ 
    set-service -Name "OSearch15" -startuptype Automatic 
    $srv4.start() 
} 
if($srch5srvctr -eq 2) 
{ 
    Set-service "SPSearchHostController" -startuptype Automatic 
    $srv5.start() 
}

###Resuming Search Service Application if paused### 
if($srchctr -eq 2) 
{ 
    Write-Host "Resuming the Search Service Application" -foregroundcolor yellow 
    $ssa = get-spenterprisesearchserviceapplication 
    $ssa.resume() 
}

Write-Host "Services are Started" -foregroundcolor green 
Write-Host 
Write-Host 
Write-Host "Script Duration" -foregroundcolor yellow 
Write-Host "Started: " $starttime -foregroundcolor yellow 
Write-Host "Finished: " $finishtime -foregroundcolor yellow 
Write-Host "Script Complete" 

Comments

John Wills said…
Thank you thank you thank you!