Public/Use-Object.ps1

# Copyright (c) 2023 Anthony J. Raymond, MIT License (see manifest for details)

using namespace System.Runtime.InteropServices

function Use-Object {
    [CmdletBinding()]
    [OutputType([void])]

    ## PARAMETERS #############################################################
    param (
        [Parameter(
            Position = 0,
            Mandatory
        )]
        [AllowEmptyString()]
        [AllowEmptyCollection()]
        [AllowNull()]
        [object]
        $InputObject,

        [Parameter(
            Position = 1,
            Mandatory
        )]
        [scriptblock]
        $Scriptblock
    )

    ## PROCESS ################################################################
    process {
        try {
            . $Scriptblock
        } catch {
            throw $_
        } finally {
            foreach ($Object in $InputObject) {
                if ($Object -is [IDisposable]) {
                    $Object.Dispose()
                } elseif ($Object -is [__ComObject]) {
                    $null = [Marshal]::ReleaseComObject($Object)
                }
            }
        }
    }
}