GinShell.Azure/Public/Get-GsAzureVmAndDisk.ps1

function Get-GsAzureVmAndDisk {
    param (
        [Parameter(Mandatory = $true)]
        [string[]]$VmNames
    )

    if (-not $VmNames -or $VmNames.Count -eq 0) {
        Write-GsLog -Message "No VM names provided." -Type Error
        return
    }

    Write-GsLog -Message "Getting VM and disk list from Azure..." -Type Info

    try {
        $vmList = Get-AzVM
        $diskList = Get-AzDisk

        Write-GsLog -Message "Filtering VMs and their associated disks..." -Type Debug

        $selectedVms = $vmList | Where-Object { $_.Name -in $VmNames }

        if (-not $selectedVms -or $selectedVms.Count -eq 0) {
            Write-GsLog -Message "Unable to find any VMs matching the provided names: $($VmNames -join ', ')." -Type Error
            return
        }

        $selectedVmIds = $selectedVms.Id
        $associatedDisks = $diskList | Where-Object { $_.ManagedBy -in $selectedVmIds }

        Write-GsLog -Message "Found $($selectedVms.Count) VM(s) and $($associatedDisks.Count) associated disk(s)." -Type Info

        return [PSCustomObject]@{
            VMs   = $selectedVms
            Disks = $associatedDisks
        }
    }
    catch {
        Write-GsLog -Message "Failed to get VM or disk information: $($_.Exception.Message)" -Type Error
        return
    }
}