PowerShell module to help build PowerShell type extension files
- Build the project
- From the build output folder (depends on your build configuration; typically
bin/Debugorbin/Release), copy the following items to a folder calledUncommonSense.PowerShell.TypeDataanywhere in your PowerShell module path. To find your module path, type$env:PSModulePath -split ';'in a PowerShell console.
- UncommonSense.PowerShell.TypeData.dll
- UncommonSense.PowerShell.TypeData.psd1
- UncommonSense.PowerShell.TypeData.psm1
Alternatively, you could leave the files where they are, and call Import-Module {Full/Path/To/UncommonSense.PowerShell.TypeData.psd1}
If you're not familiar with the PowerShell type extension file format, please run Get-Help about_Types.ps1xml in your PowerShell console to find additional information.
In an attempt to simplify and shorten the syntax:
- all the cmdlets in the module have aliases (see below);
- most (if not all) cmdlet parameters are positional;
- each parent node has a script block parameter for easily adding child nodes.
The following aliases are defined automatically.
Set-Alias -Name Types -Value New-TypeData
Set-Alias -Name _Type -Value New-Type
Set-Alias -Name AliasProperty -Value New-AliasProperty
Set-Alias -Name CodeMethod -Value New-CodeMethod
Set-Alias -Name CodeProperty -Value New-CodeProperty
Set-Alias -name CodeReference -Value New-CodeReference
Set-Alias -Name MemberSet -Value New-MemberSet
Set-Alias -Name NoteProperty -Value New-NoteProperty
Set-Alias -Name PropertySet -Value New-PropertySet
Set-Alias -Name ScriptMethod -Value New-ScriptMethod
Set-Alias -Name ScriptProperty -Value New-ScriptProperty
Set-Alias -Name TypeConverter -Value New-TypeConverterNote: The alias for
New-Typeis_Typeinstead ofType, because PowerShell installsTypeat a higher scope level as an alias forGet-Content.
A possible usage scenario might look like this (using the cmdlet aliases and leaving out parameter names as much as possible):
Types {
_Type Foo {
NoteProperty Baz Bar
ScriptProperty Qux 'Get-Quux'
MemberSet Quux {
NoteProperty Quuux Boink
}
}
}The resulting XML looks like this:
<Types>
<Type>
<Name>Foo</Name>
<Members>
<NoteProperty>
<Name>Baz</Name>
<Value>Bar</Value>
</NoteProperty>
<ScriptProperty>
<Name>Qux</Name>
<GetScriptBlock>Get-Quux</GetScriptBlock>
</ScriptProperty>
<MemberSet>
<Name>Quux</Name>
<Members>
<NoteProperty>
<Name>Quuux</Name>
<Value>Boink</Value>
</NoteProperty>
<Members />
</MemberSet>
</Members>
</Type>
</Types>You could then use redirection, Out-File or Set-Content to send the XML to type extension file, which can be loaded into your PowerShell session using Update-TypeData, or can be made part of your own PowerShell module.
Additional text, such as an XML declaration specifying the encoding, can be specified in New-TypeData's -PreContent parameter. This text will be emitted before the actual type data.
New-TypeData -PreContent '<?xml version="1.0" encoding="UTF-8"?>' { ... }When specifying an encoding in -PreContent, make sure you use the same encoding when sending the cmdlet's output to a file or stream.
New-TypeData -PreContent '<?xml version="1.0" encoding="UTF-8"?>' { ... } | Out-File -Encoding Utf8 -FilePath '...'