en-us/about_PoshMacros.help.txt

PoshMacros is a module to help build useful command line macros in PowerShell
 
Macro functions are quick commands that tend to start with an _. They can be a:
 
* -Path (to a file or folder)
* -Alias
* -Command proxies (these can -RemoveParameter(s), have -OptionalParameter(s) and have -DefaultParameter(s))
* -ScriptBlock
* -URI (with variables in enclosed in curly brackets or braces, or preceeded by a dollar sign or colon)
 
### Defining Macros
 
Macros are defined with Add-Macro. Add-Macro is aliased to _+.
 
#### Path Macros
 
You can define path macros. These work like named directories in certain advanced shells:
* Running the command pushes into the directory (if already there, it echoes).
* Assigning the command returns the [IO.DirectoryInfo]
~~~
# Define a path macro. Running this will pop you into the PoshMacros directory. Assigning it will return the [IO.DirectoryInfo].
Add-Macro -Name PoshMacrosRoot -Path (Get-Module PoshMacros | Split-Path)
~~~
 
ShowUI\New-Path Macros can also point to files.
 
If the file one of a few data file types, the data will be returned:
* .CSV | .TSV (using Import-CSV)
* .CLIXML | .CLIX (using Import-Clixml)
* .JSON (using ConvertFrom-JSON)
* .svg | *.xml (by casting to [xml])
* .psd1 (using Import-LocalizedData)
* .ps1 (as an ExternalScript)
* .md | .htm[l] | .txt
~~~
Add-Macro -Name PesterManifest -Path (Get-Module Pester | Split-Path | Join-Path -ChildName 'Pester.psd1')
~~~
 
#### Aliases, Proxy Commands, and Script Blocks
 
You can also define aliases. These act just like any other alias in PowerShell:
 
~~~
Add-Macro -Name Now -Alias Get-Date
_Now
~~~
 
You can also define a proxy -Command. If you provide a variable name as a default value, it will be expanded when the proxy runs.
 
~~~
Add-Macro -Name MyProcess -Command Get-Process -DefaultParameter @{Id='$pid'} -RemoveParameter *
_MyProcess
~~~
 
You can also define a macro as an arbitrary -ScriptBlock
 
~~~
Add-Macro -Name Today -ScriptBlock { [DateTime]::Now.Date }
_Today
~~~
 
#### URI Macros
 
You can define a macro for a -URI with embedded variables. As the example below makes clear, you can include
 
~~~
Add-Macro -Name GitRepos -Uri 'https://api.github.com/users/:username/repos?page={page}&per_page=$perPage' -DefaultParameter @{
    page = 1
    perpage = 50
}
 
$StartAutomatingRepos = _GitRepos -UserName StartAutomating
~~~
 
Like path macros, URI macros work differently when assigned or piped (at least on Windows).
 
On Windows, running a URI macro without assigning or piping will open the URL in a browser.
 
URI macros wrap Invoke-RestMethod, and will carry over all parameters from Invoke-RestMethod except for the URI.
 
Providing any of these parameters will override
 
### Getting Macros
 
Each Macro is defined in a dynamic module, so you can get macros either by running Get-Macro or Get-Module -Name NameOfMacro
 
~~~
Get-Macro
~~~
 
~~~
Get-Macro -Prefix '_' # Gets all macros with the prefix _
~~~
 
### Exporting Macros
 
You can use Export-Macro to export a macro definition. These can be re-imported at any time, independently of the PoshMacros module.
 
~~~
Add-Macro -Name MyProcess -Command Get-Process -DefaultParameter @{Id='$pid'} -RemoveParameter *
 
Export-Macro -Name MyProcess
~~~
 
By default, Export-Macro will declare the dynamic module and metadata associated with a macro.
You can also simply export function definitions and aliases with -Inline.
 
~~~
Add-Macro -Name Now -Alias Get-Date
 
Export-Macro -Name Now -Inline
~~~
 
### Importing Macros
 
Macros can be defined within a module by adding a .PoshMacros section of a module's PrivateData, or attaching a .PoshMacros property to a module.
 
To see an example of this in action, use:
 
~~~
Import-Macro -Name PoshMacros -PassThru
~~~
 
You can examine the PrivateData of PoshMacros with:
 
~~~
(_PoshMacrosManifest).PrivateData.PoshMacros
~~~
 
Any modules that have PoshMacros will be automatically imported when PoshMacros loads.
 
 
### Removing Macros
 
Remove-Macro will undeclare macros:
 
~~~
Add-Macro -Name Now -ScriptBlock { [DateTime]::Now }
_Now # it works
Remove-Macro -Name _Now
_Now # it doesn't
~~~