en-us/About_Splatter.help.txt

## Splatter is a simple Splatting toolkit
 
Splatting is a technique of passing parameters in PowerShell.
 
Splatter makes splatting more powerful, flexible, and easy to use.
 
With Splatter you can:
* Splat any object to any command
* Pipe splats to commands
* Validate splats
* Find commands for a splat
 
Splatter is tiny, and can be easily embedded into any module.
 
 
### Using Splatter
 
Splatter has four core commands:
* Get-Splat (?@)
* Find-Splat (??@)
* Merge-Splat (*@)
* Use-Splat (.@)
 
#### Get-Splat
 
| Alias | Variables |
|-----------|----------------------------|
| ?@,gSplat | ${?@}, $gSplat, $GetSplat |
 
 
Get-Splat returns a Dictionary of parameters, given a command or ScriptBlock.
This only contains parameters for the command, and converts the parameters into the desired types.
Get-Splat can take any object or Dictionary as input.
 
    @{Id=$pid;Junk='Data'} | Get-Splat Get-Process
    # -or
    @{Id=$pid;Junk='Data'} | ?@ gps
    # -or
    @{Id=$pid;Junk='Data'} | & ${?@} gps
 
 
Get-Splat can take more than one command as input.
If it does, it will return the matching inputs for each command.
     
    @{FilePath = 'pwsh';ArgumentList = '-noprofile';PassThru=$true} |
        Use-Splat Start-Process |
        Add-Member NoteProperty TimeOut 15 -PassThru |
        Get-Splat Wait-Process, Stop-Process
 
Get-Splat will also attach a properties to the Dictionary.
 
These property won't be used when calling the splat, but can be peeked at:
 
| Property | Description |
|---------------|-----------------------------------------------|
| Command | The Command |
| CouldRun | If the command could run, given the splat |
| Invalid | Parameters that are invalid |
| Missing | Mandatory parameters that are missing |
| PercentFit | % of properties that map to parameters |
| Unmapped | Properties that don't map to parameters |
 
 
    $splat = @{id=$pid;foo='bar'} | ?@ gps
    $splat.Command, $splat.PercentFit, $splat.Unmapped
 
 
#### Find-Splat
| Alias | Variables |
|------------|----------------------------|
| ??@,fSplat | ${??@}, $fSplat, $FindSplat|
 
 
 
Find-Splat will find commands that match a given splat, and return information about a match.
 
    @{id=$pid} | Find-Splat *-Process
 
Find-Splat may also be scoped to a given module
 
    @{splat=@{}} | Find-Splat -Module Splatter
 
#### Merge-Splat
| Alias | Variables |
|------------|----------------------------|
| *@,mSplat | ${*@}, $mSplat, $MergeSplat|
 
 
Merge splat will merge multiple splats together.
 
    @{a='b'}, @{c='d'} | Merge-Splat
 
 
#### Use-Splat
 
| Alias | Variables |
|--------------|----------------------------------|
| .@,uSplat | ${.@}, $uSplat, $UseSplat |
 
 
Use-Splat will run a splat against one or more commands.
    @{id=$pid} | Use-Splat Get-Process # Gets the current process
 
    # Gets the process, and then doesn't stop the process because Stop-Process is passed WhatIf
    @{id=$pid;WhatIf=$true} | .@ Get-Process,Stop-Process
 
 
### Using Splatter with ScriptBlocks
 
 
In PowerShell, you can treat any ScriptBlock as a command. Splatter makes this simpler.
 
Take this example, which takes a little bit of input data and uses it in a few different scripts.
 
    @{
        Name='James'
        Birthday = '12/17/1981'
        City = 'Seattle'
        State = 'Washington'
    } | .@ {
        param($Name)
        "$name"
    }, {
        param([DateTime]$Birthday)
        $ageTimespan = [DateTime]::Now - $birthday
        "Age:" + [Math]::Floor($ageTimespan.TotalDays / 365)
         
    }, {
        param($city, $state)
        "$city, $state"
    }
 
Since Splatter will also convert objects to hashtables, you could also write something like:
 
    Import-Csv .\People.csv | .@
        {
            param($Name)
            "$name"
        }, {
            param([DateTime]$Birthday)
            $ageTimespan = [DateTime]::Now - $birthday
            "Age:" + [Math]::Floor($ageTimespan.TotalDays / 365)
         
        }
 
 
### Embedding Splatter
 
Initialize-Splat will output a script containing the core commands for Splatter.
Using this output, you can directly embed Splatter into any script or module.
 
    Initialize-Splatter
 
To install this into a module:
 
    Get-Module TheNameOfYourModule | Split-Path | Push-Location
    Initialize-Splatter > '@.ps1'
    Pop-Location
 
Then add the following line to your module:
 
    . $psScriptRoot\@.ps1
 
By default, when Splatter is embedded, it will not export functions or aliases, and you will need to use the variable syntax:
 
    & ${?@} # Get-Splat
    & ${??@} # Find-Splat
    & ${*@} # Merge-Splat
    & ${.@} # Use-Splat
 
You can override this by using -AsFunction
 
    Initialize-Splatter -AsFunction
 
If you don't need all of the commands, you can use -Verb
 
    Initialize-Splatter -Verb Get, Use