Public/New-NSPGraphDriveFolder.ps1

function New-NSPGraphDriveFolder {
    <#
    .SYNOPSIS
        Creates one folder in a SharePoint library, failing rather than renaming when the name is taken.
    .DESCRIPTION
        Creates -Name under -ParentId (the library root by default) and returns its DriveId and
        ItemId. The conflict behavior is fail, so an existing folder is never replaced or given a
        "Name 1" twin. Uses the active connection; delegated callers need Sites.ReadWrite.All or
        Files.ReadWrite.All.
    .EXAMPLE
        New-NSPGraphDriveFolder -DriveId $library.DriveId -Name 'ScanBridge Test'
    #>

    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$DriveId,
        [ValidateNotNullOrEmpty()][string]$ParentId = 'root',
        [Parameter(Mandatory)][ValidatePattern('^[^"*:<>?/\\|#%]{1,250}$')][string]$Name
    )

    if (-not $PSCmdlet.ShouldProcess("drive $DriveId", "Create folder '$Name'")) { return }
    $folder = Invoke-NSPGraphRequest -Method POST -Uri "drives/$([uri]::EscapeDataString($DriveId))/items/$([uri]::EscapeDataString($ParentId))/children" -Body @{
        name = $Name.Trim(); folder = @{}; '@microsoft.graph.conflictBehavior' = 'fail'
    }
    [pscustomobject]@{ Kind = 'Folder'; Name = [string]$folder['name']; DriveId = $DriveId; ItemId = [string]$folder['id']; WebUrl = [string]$folder['webUrl']; ChildCount = 0 }
}