The following script does several jobs :

  • Backup IIS Website Files To be upgraded
  • Stop IIS Website  Application Pool
  • Copy Newest Website Files
  • Start IIS Website Application Pool
Also can download this script from Microsoft Technet Gallery.
<# 
 .SYNOPSIS 
    Update IIS Website content files. 
 .DESCRIPTION 
This is a usefull script which allow to do several thinks like :

1. Backup IIS Website Files To Be Upgrated
2. Stop IIS Application Pool
3. Copy Newest Files
4. Start IIS Application Pool

 .PARAMETER service
 Application Pool Service Name

 .PARAMETER  srcfolder
 Folder with latest website content files

 .PARAMETER tgtfolder
 Folder with running Website files

 .PARAMETER BackupFolder
 Folder were modified files are backed up

 .NOTES 
    Author: Giorgos Grammatikos
    Version: 1.0.0
    DateCreated: 01/12/2005
 .LINK 
 	http://grammatikosgx.wordpress.com
#> 





# Clean Up Folder Backup
Remove-Item C:\New_Versions\Backup\* -Recurse

### Declarations Folders For Content Update ###

# IIS Application Pool

$service = "mywebsite"
$timeout = New-TimeSpan -Seconds 120
$sw = [diagnostics.stopwatch]::StartNew()


# Update, Target, Backup Folders

$srcFolder = "C:\New_Versions\New\"
$tgtFolder = "C:\inetpub\wwwroot\Website"
$BackupFolder = "C:\New_Versions\Backup\"


$updatePackage = get-ChildItem -File -Recurse -Path $srcFolder
$target = get-ChildItem -File -Recurse -Path $tgtFolder

[string]$srcPattern = $srcFolder.Replace("\","\\")

$srcList = Get-ChildItem -Path $srcFolder -Recurse -File
$srcList | Add-Member -NotePropertyName Status -NotePropertyValue Unknown


# Backup Files To Be Upgrated

# Initialize counters
$count = $newCount = $modCount = 0

try{
# Copy 
foreach ($file in $srcList)
{
    $count++
    $tgtFileName = Join-Path -Path $BackupFolder ($file.FullName -Replace $srcPattern, "")
    $difFileName = Join-Path -Path $BackupFolder ($file.FullName -Replace $srcPattern, "")
    $exists = Test-Path -Path $tgtFileName
    if ($exists)
    {
        $tgtFile = Get-ChildItem -Path $tgtFileName
        if ( $file.Length -ne $tgtFile.Length -or
            $file.LastWriteTimeUtc -gt $tgtFile.LastWriteTimeUtc )
        {
            $modCount++
            $file.Status = "modified"
        }
        else
        {
        $file.Status = "same" 
        }
    }
    else
    {
        $newCount++
        $file.Status = "new"
    }

    Write-Verbose "$tgtFileName is $($file.Status)"

    # Copy files as needed to target and difference directories
    # New-Item (touch) is required to build out dir structure where missing

    if ($file.Status -eq "new")
    {
        # Copy with file structure
        New-Item -ItemType File -Path $tgtFileName -Force | Out-Null
        Copy-Item -Path $file.FullName -Destination $tgtFileName

    }
    elseif ($file.Status -eq "modified")
    {
        # Copy with file structure
        New-Item -ItemType File -Path $difFileName -Force | Out-Null
        Copy-Item -Path $file.FullName -Destination $difFileName

    }
}

Write-Host "Processed $count files, copied $newCount new files, and $modCount changed files" 
}

catch
{

Write-Host "ERROR: $($Error[0].Exception)"
}

try
{

# Wait until Application Pool Stop

While ((Get-WebAppPoolState -name $service).value -eq "Started") {
Stop-WebAppPool $service 
Write-Progress "Waiting For Application Pool To Stop"

if ($sw.Elapsed -gt $timeout)
    {
Throw "Time Out"
    }
   }
  write-Host "Application Pool: '$service' Stopped !!! "

    }
catch
{

Write-Host "ERROR: $($Error[0].Exception)"
}


try
{


# Initialize counters
$count = $newCount = $modCount = 0


# Copy 
foreach ($file in $srcList)
{
    $count++
    $tgtFileName = Join-Path -Path $tgtFolder ($file.FullName -Replace $srcPattern, "")
    $difFileName = Join-Path -Path $tgtFolder ($file.FullName -Replace $srcPattern, "")
    $exists = Test-Path -Path $tgtFileName
    if ($exists)
    {
        $tgtFile = Get-ChildItem -Path $tgtFileName
        if ( $file.Length -ne $tgtFile.Length -or
            $file.LastWriteTimeUtc -gt $tgtFile.LastWriteTimeUtc )
        {
            $modCount++
            $file.Status = "modified"
        }
        else
        {
        $file.Status = "same" 
        }
    }
    else
    {
        $newCount++
        $file.Status = "new"
    }

    Write-Verbose "$tgtFileName is $($file.Status)"

    # Copy files as needed to target and difference directories
    # New-Item (touch) is required to build out dir structure where missing

    if ($file.Status -eq "new")
    {
        # Copy with file structure
        New-Item -ItemType File -Path $tgtFileName -Force | Out-Null
        Copy-Item -Path $file.FullName -Destination $tgtFileName

    }
    elseif ($file.Status -eq "modified")
    {
        # Copy with file structure
        New-Item -ItemType File -Path $difFileName -Force | Out-Null
        Copy-Item -Path $file.FullName -Destination $difFileName

    }
}

Write-Host "Processed $count files, copied $newCount new files, and $modCount changed files" 
}
catch
{

Write-Host "ERROR: $($Error[0].Exception)"
}

try
{

while ((Get-WebAppPoolState -name $service).value -eq "Stopped"){

Start-WebAppPool $service

Write-Host "Application Pool: '$service' Started !!! "
if ($sw.Elapsed -gt $timeout)
    {
Throw "Time Out"
    }

  }
}
catch
{

Write-Host "ERROR: $($Error[0].Exception)"
}
Share This