Source/Cmdlets/GetSMOTable.cs

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using SQL.SMO.Databases;
using SQL.SMO.Framework;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
 
namespace SQL.SMO.Cmdlets
{
    [Cmdlet(VerbsCommon.Get, "SMOTable", DefaultParameterSetName = "Specific")]
    [OutputType(typeof(SMOTable))]
    [OutputType(typeof(string[]))]
    [CmdletBinding(PositionalBinding = false)]
    public class GetSMOTable : PSCmdlet
    {
        [Parameter(Mandatory = true, ValueFromPipeline = true)]
        public SMODatabase Database { get; set; }
 
        [Parameter(Mandatory = false, Position = 0, ParameterSetName = "Specific")]
        public string[] Name { get; set; }
 
        private bool _no;
        [Parameter(Mandatory = false, ParameterSetName = "All")]
        public SwitchParameter NamesOnly
        {
            get => _no;
            set => _no = value;
        }
 
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            SharedCmdlet.CheckSession();
        }
 
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            if (!_no)
            {
                SMOTable[] smot;
                if (Name == null)
                {
                    smot = Database.GetTables();
                }
                else
                {
                    smot = Database.GetTables(Name);
                }
                WriteObject(smot, true);
            }
            else
            {
                string[] tbls = Database.Tables.OrderBy(x => x).ToArray();
                WriteObject(tbls, false);
            }
        }
    }
}