# encoding: ascii
# api: powershell
# title: Set-IISLogLocation
# description: This advanced function will allow you to set the IIS log location on a server or servers.  You can specify a single site or perform the task on all sites. Also supports -whatif in the function.
# version: 0.1
# type: function
# author: Boe Prox
# license: CC0
# function: Set-IISLogLocation
# x-poshcode-id: 2374
# x-archived: 2010-11-23T15:13:33
#
#
Function Set-IISLogLocation {
<#  
.SYNOPSIS  
    This command will allow you to set the IIS log location on a server or multiple servers.
.DESCRIPTION
    This command will allow you to set the IIS log location on a server or multiple servers.    
.PARAMETER computer
    Name of computer to set log location on
.PARAMETER logdir
    Location to set IIS logs to write to 
.PARAMETER website
    Name of website to change the log location.       
.NOTES  
    Name: Set-IISLogLocation
    Author: Boe Prox
    DateCreated: 20Aug2010 
         
.LINK  
    http://boeprox.wordpress.com
.EXAMPLE  
    Set-IISLogLocation -computer <server> -logdir "D:\logs"
    
Description
-----------
This command will change the IIS log locations for each website on the server.
.EXAMPLE  
    Set-IISLogLocation -computer <server> -logdir "D:\logs" -website "Default Web Site"
    
Description
-----------
This command will change the IIS log locations for only the Default Web Site on a server.
          
#> 
[cmdletbinding(
    SupportsShouldProcess = $True,
	DefaultParameterSetName = 'default',
	ConfirmImpact = 'low'
)]
param(
    [Parameter(
        Mandatory = $False,
        ParameterSetName = '',
        ValueFromPipeline = $True)]
        [string]$computer,
    [Parameter(
        Mandatory = $False,
        ParameterSetName = '',
        ValueFromPipeline = $False)]
        [string]$logdir,
    [Parameter(
        Mandatory = $False,
        ParameterSetName = 'site',
        ValueFromPipeline = $False)]
        [string]$website                           
)
Process {
    ForEach ($c in $Computer) {

            If (Test-Connection -comp $c -count 1) {
                
                $sites = [adsi]"IIS://$c/W3SVC"
                $children = $sites.children
                ForEach ($child in $children) {
                    Switch ($pscmdlet.ParameterSetName) { 
                       "default" {
                                If ($child.KeyType -eq "IIsWebServer") {
                                If ($pscmdlet.ShouldProcess($($child.servercomment))) {
                                    $child.Put("LogFileDirectory",$logdir)
                                    $child.SetInfo()
                                    Write-Host -fore Green "$($child.servercomment): Log location set to $logdir"
                                    }                                   
                                } 
                            }
                        "site" {
                                If ($child.KeyType -eq "IIsWebServer" -AND $child.servercomment -eq $website) {
                                If ($pscmdlet.ShouldProcess($($child.servercomment))) {
                                    $child.Put("LogFileDirectory",$logdir)
                                    $child.SetInfo()
                                    Write-Host -fore Green "$($child.servercomment): Log location set to $logdir"
                                    }                                   
                                }                             
                            }                                                                                                   
                        }
                    }                        
            }                
        }  
    }
}
