DSCResources/ROWCommon/Src/Export-ROWBuildingBlockFile.ps1

function Export-ROWBuildingBlockFile {
<#
    .SYNOPSIS
        Exports a RES ONE Workspace building block.
    .EXAMPLE
        Export-ROWBuildingBlock -Path .\RESWM.xml
 
        Exports the entire RES ONE Workspace environment into the 'RESWM.xml' building block file.
    .EXAMPLE
        Export-ROWBuildingBlock -Path .\RESWM.xml -Type Application,UserSetting
 
        Exports the the applications and user settings from the RES ONE Workspace environment into the 'RESWM.xml' building block file.
    .NOTES
        This cmdlet requires the RES ONE Workspace console (PWRTECH.EXE) to be installed.
#>

    [CmdletBinding(DefaultParameterSetName = 'Type')]
    [OutputType([System.IO.FileInfo])]
    param (
        # Specifies a path to a location.
        [Parameter(Mandatory, Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'Type')]
        [Parameter(Mandatory, Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'Guid')]
        [System.String] $Path,

        # Specifies the specific feature(s) that need to be included in the Building Block. If no types are specified,
        # a Building Block of the entire RES ONE Workspace environment will be created.
        [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Type')]
        [ValidateSet(
            'Application',
            'AutomationTask',
            'ConfigMgr',
            'DataSource',
            'DirectoryService',
            'Email',
            'ExecuteCommand',
            'FolderRedirection',
            'FolderSync',
            'HomeDirectory',
            'Location',
            'Mapping',
            'Printer',
            'ProfileDirectory',
            'Registry',
            'Substitutes',
            'UserSetting',
            'Variable'
        )]
        [System.String[]] $Type,

        # Specifies creating a Building Block for one specific RES ONE Workspace object.
        [Parameter(Mandatory, ValueFromPipelineByPropertyName, ParameterSetName = 'Guid')]
        [System.Guid] $Guid,

        # Authentication username and password. Only Windows authentication is supported.
        [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Type')]
        [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Guid')]
        [ValidateNotNull()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()] $Credential,

        # Returns an object representing the building block files. By default, this cmdlet does not generate any output.
        [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Type')]
        [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Guid')]
        [System.Management.Automation.SwitchParameter]
        $PassThru
    )
    begin {

        $pwrtechPath = Get-ROWConsolePath;

    }
    process {

        if ($Path.Contains(' ')) {

            $exceptionMessage = $localizedData.PathCannotContainSpaceError -f $Path;
            $exception = New-Object System.ArgumentException $exceptionMessage;
            $category = [System.Management.Automation.ErrorCategory]::InvalidArgument;
            $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, 'PWRTECH', $category, $Path;
            $psCmdlet.WriteError($errorRecord);
            return;
        }

        $arguments = @(
            '/export',
            $Path
        );

        if ($PSBoundParameters.ContainsKey('Type')) {

            $exportTypes = [System.String]::Join(',', $Type);
            $arguments += '/type={0}' -f $exportTypes;
        }
        elseif ($PSBoundParameters.ContainsKey('Guid')) {

            $arguments += '/guid={{{0}}}' -f $Guid.ToString().ToUpper();
        }

        if ($PSBoundParameters.ContainsKey('Credential')) {

            $exitCode = Start-WaitProcess -FilePath $pwrtechPath -ArgumentList $arguments -Credential $Credential;
        }
        else {

            $exitCode = Start-WaitProcess -FilePath $pwrtechPath -ArgumentList $arguments;
        }

        if ($exitCode -ne 0) {

            $exceptionMessage = Get-ROWErrorCode -ExitCode $exitCode;
            $exception = New-Object System.Management.Automation.ItemNotFoundException $exceptionMessage;
            $category = [System.Management.Automation.ErrorCategory]::InvalidOperation;
            $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, 'PWRTECH', $category, $Path;
            $psCmdlet.WriteError($errorRecord);
        }
        else {

            if ($PassThru -and (Test-Path -Path $Path)) {

                $buildingBlockXml = Get-Item -Path $Path;
                Write-Output -InputObject $buildingBlockXml;
                $buildingBlockXbbFilename = '{0}.xbb' -f $buildingBlockXml.BaseName;
                $buildingBlockXbbPath = Join-Path -Path $buildingBlockXml.DirectoryName -ChildPath $buildingBlockXbbFilename;

                if (Test-Path -Path $buildingBlockXbbPath) {

                    Write-Output -InputObject (Get-Item -Path $buildingBlockXbbPath);
                }
            }
        }

    } #end process
} #end function Export-ROWBuildingBlockFile