sitecore-csv.ps1

<#
.Synopsis
    Processing Config Enable-Disable Sitecore_8.2-160906_RTM.csv file
 
.DESCRIPTION
    This function is processing csv file, that contains guideline about enable/disable configuration
    files on each enviroment.
 
#>

function Set-SitecoreEnvironment {
[CmdletBinding(SupportsShouldProcess=$true)]
    param (
        [parameter(Mandatory=$true)]
        [string]$CsvPath,

        [parameter(Mandatory=$true)]
        [string]$WebPath,
        
        [parameter()]
        [ValidateSet('ContentDelivery','ContentManagement','Processing','CMProcessing','Reporting')]
        [string]$Environment = $null,

        [parameter()]
        [ValidateSet('Solr','Lucene')]
        [string]$Search = $null,

        [switch]$Backup
        
    )
    
    $projectFolder = Split-Path -Parent $MyInvocation.MyCommand.Path

    Write-Verbose $projectFolder

    if($Backup -eq $true)
    {
        $sourceFolder = Join-Path -Path $WebPath -ChildPath "website\App_Config"
        # More about date formating - https://technet.microsoft.com/en-us/library/ee692801.aspx
        $date = Get-Date -Format d-M-yyyy-HH-MM-s
        $backupFile = "website\App_Config-$date.zip"
        $backupPath = Join-Path -Path $WebPath -ChildPath $backupFile
        Zip-Directory -DestinationFileName $backupPath -SourceDirectory $sourceFolder
    }
        
    if( ($Search -ne '') -and ($Environment -ne ''))
    {
        Write-Verbose "Configure $Search for environment: $Environment"
        # Prefilter all configuration files to select only files with values 'Solr is used' or 'Lucene is used'
        $searchProviderPreFilter = {$_.SearchProviderUsed -ne '' -and $_.SearchProviderUsed -ne 'Base' }

        # Set field 'Enable' to true if
        # configuration file is used by selected search engine
        # and configuration file should be enabled on selected environment
        $action = @{Name="Enable"; Expression = { ($_.SearchProviderUsed -eq "$Search is used" -and $_.$Environment -eq 'Enable')}}

        # Build full path to configuration file
        $file = @{Name="ConfigPath";Expression = {  Combine-Path $WebPath $_.FilePath $_.ConfigFileName}}

        Import-Csv $CsvPath | Where-Object $searchProviderPreFilter  | Select-Object  $file, $action, @{Name="ProcessExample"; Expression={$true}} | Switch-SitecoreConfigFile 
    }
    elseif( $Environment -ne '' -and $Search -eq '')
    {
        Write-Verbose "Configure environment: $Environment"
        # Prefilter all configuration files to select all files not connected with any search provider
        $searchProviderPreFilter = {$_.SearchProviderUsed -eq '' -or $_.SearchProviderUsed -eq 'Base' }

        # Set field 'Enable' to true if
        # and configuration file should be enabled on selected environment
        $action = @{Name="Enable"; Expression = { ( $_.$Environment -eq 'Enable')}}

        # Build full path to configuration file
        $file = @{Name="ConfigPath";Expression = {  Combine-Path $WebPath $_.FilePath $_.ConfigFileName}}

        Import-Csv $CsvPath  | Where-Object $searchProviderPreFilter | Select-Object  $file, $action, @{Name="ProcessExample"; Expression={$false}} | Switch-SitecoreConfigFile
    }

}

<#
.Synopsis
 
    Enable or disable Sitecore configuration file
 
.DESCRIPTION
 
    This function is used to enable/disable configuration file. This functionality is realized by change file name extension.
    Enable configuration file means - remove extension '.disabled'
    Disable configuration file means - add extension '.disabled'
 
    This function process objects passed by pipeline. Object should have two properties ConfigPath and Enable.
    ConfigPath - this is path to configration file
    Enable - if set to true file is enabled, otherwise disabled
 
.EXAMPLE
     
#>

function Switch-SitecoreConfigFile
{
    process
    {
        $VerbosePreference = "Continue"
        $configFile = $_.ConfigPath;
       
    
        Write-Verbose "Processing $configFile..."

        if( -not (Test-Path -Path $configFile) )
        {
            Write-Warning "File not exist"
            return;
        }

        
        $extension = [System.IO.Path]::GetExtension($configFile)
        $processExample = $_.ProcessExample

        # extension .example should be processed only when search configuration is processed
        if($processExample -eq $true -and $_.Enable -eq $true -and  $extension -eq '.example')
        {
            $newConfigFile = $configFile -replace "\.example","" 
              
            Write-Verbose "Enable example file $newConfigFile"

            Rename-Item $configFile -NewName $newConfigFile
        }
        elseif($_.Enable -eq $true -and  $extension -eq '.disabled')
        {
            $newConfigFile = $configFile -replace ".disabled","" 
              
            Write-Verbose "Enable file $newConfigFile"

            Rename-Item $configFile -NewName $newConfigFile
        }
        elseif($_.Enable -eq $false -and $extension -eq '.config' )
        {
            $newConfigFile = $configFile -replace "\.config",".config.disabled"

            Write-Verbose "Disable file $newConfigFile"

            Rename-Item $configFile -NewName $newConfigFile
        }
        else
        {
            Write-Warning "Change is not necessary"
        }
    }
}

<#
 
    .EXAMPLE
    Combine-Path 'a'
     
    .EXAMPLE
    Combine-Path 'a' 'b'
 
    .EXAMPLE
    Combine-Path 'a' 'b' 'c'
#>

function Combine-Path
{
    [CmdletBinding(SupportsShouldProcess=$true)]
    param (
        [parameter(Mandatory=$true)]
        [string]$Path1,
        
        [parameter(Mandatory=$true)]
        [string]$Path2,

        [parameter()]
        [string]$Path3 
    )
    
    return Join-Path $Path1 -ChildPath (Join-Path $Path2 -ChildPath $Path3)  
}


Export-ModuleMember -Function Set-SitecoreEnvironment