Commands/Types.PS1XML/Push-TypeData.ps1
function Push-TypeData { <# .Synopsis Pushes type data into the current session. .Description Push-TypeData pushes type data into the current session. This creates a temporary module to store information declared in a types file and imports it. .Link Clear-TypeData .Link Pop-TypeData .Link Out-TypeData #> [OutputType([Nullable],[PSModuleInfo])] [Alias('Add-TypeData')] param( # The Format XML Document. The XML document can be supplied directly, # but it's easier to use Write-FormatView to create it [Parameter(Mandatory=$true, ValueFromPipeline=$true)] [ValidateScript({ if ((-not $_.Types)) { throw "The root of a types XML most be a types element" } return $true })] [Xml] $TypeXml, <# The name of the format module. If the name is not provided, the name of the module will be the first type name encountered. If no typename is encountered, the name of the module will be FormatModuleN (where N is the number of modules loaded so far). #> [string] $Name, # If set, the module that contains the format files will be outputted to the pipeline [Switch] $PassThru ) begin { # Create a list of all of the format files that will be loaded in this batch. $typeFiles = @() } process { #region Create a temporary file to hold each of the type files $tempDir = $env:Temp, '/tmp' -ne '' | Select-Object -First 1 $tempFile = Join-Path $tempDir ([IO.Path]::GetRandomFileName()) $typeFileName = "${tempFile}.Type.ps1xml" $TypeXml.Save($typeFileName) $typeFiles += (Get-Item $typeFileName).Name #endregion Create a temporary file to hold each of the type files } end { #region Generate a Module to hold the item if (-not $name) { $typeName = $TypeXml.SelectSingleNode("//Name") if ($typeName) { $name = $typeName.'#text' } else { $name = "TypeModule$($TypeModules.Count + 1)" } } $Name = $Name.Replace("#","").Replace("\","").Replace("/","") $tempFile = Join-Path $tempDir $name $tempFile = "${tempFile}.psd1" Get-Module $name -ErrorAction SilentlyContinue | Remove-Module $ModuleManifestParameters = @{ FormatsToProcess = @() NestedModules = @() Author = $env:UserName CompanyName = "" Copyright = Get-Date ModuleToProcess = "" RequiredModules = @() Description = "" RequiredAssemblies = @() TypesToProcess = $TypeFiles FileList = $TypeFiles Path = $tempFile } New-ModuleManifest @ModuleManifestParameters if ($script:TypeModules.Count) { $script:TypeModules.Values | Import-Module -Force } $module = Import-Module $tempFile -Force -PassThru $script:TypeModules[$name] = $module if ($passThru) { $module } #endregion Generate a Module to hold the item } } |