Keywords/On.ps1

function On:
{
    <#
        .SYNOPSIS
        ON: command for Cidney Pipelines. Used between Stage: and Do:
        The ON: command lets you specify a computer(s) that you will run its script block against
         
        .DESCRIPTION
        ON: command for Cidney Pipelines. Used between Stage: and Do:
        The ON: command lets you specify a computer(s) that you will run its script block against
         
        .EXAMPLE
        .\HelloWorld.ps1
 
        Pipeline: HelloWorld {
            Stage: One {
                On: Server1 {
                    Do: { Ipconfig}
                }
            }
        }
        Invoke-Cidney HelloWorld -Verbose
 
        Run ipconfig against Server1
 
        .EXAMPLE
        .\HelloWorld.ps1
 
        Pipeline: HelloWorld {
            Stage: One {
                On: Server1,Server2 {
                    Do: { Write-Output $Env:ComputerName }
                }
            }
        }
        Invoke-Cidney HelloWorld -Verbose
 
        Outputs the computer names of Server1 and Server2
 
        .LINK
        Pipeline:
        Stage:
        Do:
        When:
        Invoke-Cidney
    #>


    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory, Position = 0)]
        [string[]]
        $ComputerName = '',       
        [Parameter(Position = 1)]
        [scriptblock]
        $OnBlock = $(Throw 'No On: block provided. (Did you put the open curly brace on the next line?)'),
        [PSCredential]
        $Credential = $null,
        [switch]
        $UseSSL,
        [int]
        $TimeOut = 1800,
        [int]
        $MaxThreads = 8,
        [int]
        $SleepTimer = 100,
        [Parameter(DontShow)]
        [hashtable]
        $Context = $null
    )

    $doBlocks = Get-DoBlocks -ScriptBlock $OnBlock 

    foreach($doBlock in $doBlocks)
    {
        $params = "-MaxThreads $MaxThreads"
        if ($PSBoundParameters['ComputerName'])
        {
            $computerNames = $ComputerName -Join ','
            $params += " -ComputerName $ComputerNames"
        }
        if ($PSBoundParameters['Credential'])
        {
            $userName = $Credential.UserName -replace '\\', '_' 
            $credPath = Join-Path $Env:CidneyStore "$($userName)Credentials.xml"
            $Credential | Export-Clixml $credPath

            $params += " -UserName $userName"
            $Context.CredentialStore.Add($userName, $credPath)
        }
        if ($PSBoundParameters['UseSSL'])
        {
            $params += " -UseSSL $UseSSL"
        }
        if ($PSBoundParameters['MaxThreads'])
        {
            $params += " -MaxThreads $MaxThreads"
        }
        if ($PSBoundParameters['TimeOut'])
        {
            $params += " -Timeout $TimeOut"
        }
        if ($PSBoundParameters['SleepTimer'])
        {
            $params += " -SleepTimer $SleepTimer"
        }

        $scriptBlock = '{0} {1}' -f $doBlock.ToString().Trim(), $params
        $block = [scriptBlock]::Create($scriptBlock)
        
        Invoke-Command -ScriptBlock $block
    }
}