Intune/Intune-DeviceCateogry.ps1

Function New-GraphIntuneDeviceCateogry {
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$DisplayName,
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$Description
    )
    try{
        $CategoryHash = @{
            '@odata.type' = '#microsoft.graph.deviceCategory'
            'displayName' = $DisplayName
            'description' = $Description
        }
        $CategoryJSON = $CategoryHash | ConvertTo-Json -Depth 10
        $GraphHash = @{
            'Method' = 'Post'
            'Version' = Get-GraphIntuneVersion
            'Query' = 'deviceManagement/deviceCategories'
            'body' = $CategoryJSON
            'ContentType' = 'application/json'
        }
        Invoke-GraphMethod @GraphHash
    }
    catch{
        Write-GraphLog -Exception $_
    }
}

Function Get-GraphIntuneDeviceCateogry {
    Param(
        [Parameter(ParameterSetName='DisplayName')]
        [ValidateNotNullOrEmpty()]
        [string]$DisplayName,
        [Parameter(ParameterSetName='Id')]
        [ValidateNotNullOrEmpty()]
        [string]$Id
    )
    $InvokeHash = @{
        query = "deviceManagement/deviceCategories"
        Version = Get-GraphIntuneVersion
        Method = 'Get'
    }
    if($DisplayName) {
        $InvokeHash['Search'] = "displayName:$($DisplayName)"
    }
    elseif($Id){
        $InvokeHash['query'] = "deviceManagement/deviceCategories/$($Id)"
    }
    Invoke-GraphMethod @InvokeHash
}

Function Set-GraphIntuneDeviceCategory{
    Param(
        [Parameter(
            Mandatory=$true,
            Position=0,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true
        )]
        [ValidateNotNullOrEmpty()]
        [string]$Id,
        [Parameter(Mandatory=$false)]
        [ValidateNotNullOrEmpty()]
        [string]$DisplayName,
        [Parameter(Mandatory=$false)]
        [ValidateNotNullOrEmpty()]
        [string]$Description
    )
    Process {
        foreach($CategoryId in $Id){
            try{
                $UpdateHash = @{}
                $SendPatch = $false
                if($DisplayName) {
                    $UpdateHash['displayName'] = $DisplayName
                    $SendPatch = $true
                }
                if ($Description) {
                    $UpdateHash['description'] = $Description
                    $SendPatch = $true
                }
                if($SendPatch){
                    $UpdateJSON = $UpdateHash | ConvertTo-Json -Depth 10
                    $InvokeHash = @{
                        'query' = "deviceManagement/deviceCategories/$($CategoryId)"
                        'Version' = Get-GraphIntuneVersion
                        'Method' = 'Patch'
                        'body' = $UpdateJSON
                        'ContentType' = 'application/json'
                    }
                    Invoke-GraphMethod @InvokeHash
                }
            }
            catch {
                Write-GraphLog -Exception $_
            }
        }
    }
}

Function Remove-GraphIntuneDeviceCategory {
    Param(
        [Parameter(
            Mandatory=$true,
            Position=0,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true
        )]
        [ValidateNotNullOrEmpty()]
        [string]$Id,
        [switch]$force
    )
    Process {
        foreach($CategoryId in $Id) {
            $Response = 'y'
            if(-not $force){
                $Category = Get-GraphIntuneDeviceCateogry -Id $($CategoryId)
                $Response = Read-Host "Do you want to remove category $($Category.displayName)? (y/n)"
            }
            if($Response -eq 'y') {
                $InvokeHash = @{
                    'query' = "deviceManagement/deviceCategories/$($CategoryId)"
                    'Version' = Get-GraphIntuneVersion
                    'Method' = 'Delete'
                }
                Invoke-GraphMethod @InvokeHash
            }
        }
    }
}