Unregister-ScriptCopRule.ps1

function Unregister-ScriptCopRule
{
    <#
    .Synopsis
        Unregisters a ScriptCop rule.
    .Description
        Unregisters a ScriptCop rule, prevent it from running
    .Example
        Unregister-ScriptCopRule -Name Test-DocumentationQuality
    .Link
        Register-ScriptCopRule
    #>

    [CmdletBinding(DefaultParameterSetName='Name')]
    [OutputType([Nullable])]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Justification="PSScriptAnalyzer misses the assignment")]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSReviewUnusedParameter", "", Justification="PSScriptAnalyzer False Positives")]
    param(
    # The name of the rule
    [Parameter(ParameterSetName='Name',Mandatory=$true)]
    [string]$Name,

    # The rule command
    [Parameter(ParameterSetName='Command',ValueFromPipeline=$true,Mandatory=$true)]
    [Management.Automation.CommandInfo]$Command
    )

    begin {
        # Declare rules structure if it does not exist
        if (-not $script:ScriptCopRules) {
            $script:ScriptCopRules = @{
                TestCommandInfo = @()
                TestCmdletInfo = @()
                TestScriptInfo = @()
                TestFunctionInfo = @()
                TestApplicationInfo=  @()
                TestModuleInfo = @()
                TestScriptToken = @()
                TestHelpContent = @()
            }
        }
    }

    process {
        if ($psCmdlet.ParameterSetName -eq 'Name') {
            #region Locate and Remove Rule by Name
            if ($script:ScriptCopRules) {
                @($script:ScriptCopRules |
                    ForEach-Object {
                        foreach ($v in $_.Values) { $V }
                    }) |
                    Where-Object {
                        $_.Name -eq $Name
                    } |
                    Unregister-ScriptCopRule

            }
            #endregion
        } elseif ($psCmdlet.ParameterSetName -eq 'Command') {
             #region Locate and Remove Command
             $toRemove = $script:ScriptCopRules.GetEnumerator() |
                    Where-Object {
                        $_.Value -contains $Command
                    }

            if ($toRemove) {
                foreach ($tr in $toRemove) {
                    $script:ScriptCopRules[$tr.Key] = @($script:ScriptCopRules[$tr.Key] | Where-Object { $_ -ne $Command })
                }
            }
            #endregion
        }

        # Output the new rules to debug when completed.
        Write-Debug ($scriptCopRules | Out-String)
    }
}