PowerShell Script not store the output via azure devops

I am trying to execute this script via Azure DevOps where I want to generate an assessment report for a particular Azure subscription and the resources inside it will give every detail about the resources.

so my script is working fine but the csv file is empty. Dont know why can anyone help me with what I am missing here?

here is the script that I am using:-

Parameters

$tenantId = “xxx”
$subscriptionId = “xxx”

Log in to Azure with tenant and subscription IDs

Connect-AzAccount -Tenant $tenantId -Subscription $subscriptionId -UseDeviceAuthentication

Create a report

$combinedReport = @()

Assess all the resources (Function #1: Button1)

Function Function-Assessment() {
Write-Host “n> Checking Resource Types... n” -ForegroundColor Green

$vms = Get-AzVM
$Global:VMx = [System.Collections.ArrayList]::new()
foreach($vm in $vms)
{
$csvObject = New-Object PSObject
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Machine” -value $vm.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Resource Group” -value $vm.ResourceGroupName
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Location” -value $vm.Location
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Size” -value $vm.HardwareProfile.VmSize
if($vm.StorageProfile.OsDisk.ManagedDisk){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Managed Disk’
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value “”
}
else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Unmanaged Disk’ #$vm.StorageProfile.OsDisk
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value $vm.StorageProfile.OsDisk.Vhd.Uri
}
Add-Member -inputObject $csvObject -memberType NoteProperty -name “DataDisk Count” -value $vm.StorageProfile.DataDisks.Count

$OperatingSys = '('+$vm.StorageProfile.ImageReference.Offer+' '+$vm.StorageProfile.ImageReference.Sku+')'
if($vm.StorageProfile.ImageReference -eq $null){ $OperatingSys = ''}
if($vm.StorageProfile.OsDisk.OsType -eq 0){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Windows "+$OperatingSys)
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Linux "+$OperatingSys)}


if($vm.DiagnosticsProfile.BootDiagnostics.Enabled -eq $true){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Enabled"
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Disabled"}

if($vm.DiagnosticsProfile.BootDiagnostics.StorageUri){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value $vm.DiagnosticsProfile.BootDiagnostics.StorageUri.Split('/')[2].Split('.')[0]  
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value " "}


if($vm.Plan){Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'Yes'}
else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'No'}

Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan Name" -value $vm.Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Publisher" -value $vm.Plan.Publisher
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Product" -value $vm.Plan.Product 

$diskEncryption = Get-AzVMDiskEncryptionStatus -VMName $vm.Name -ResourceGroupName $vm.ResourceGroupName
if($diskEncryption.OsVolumeEncrypted -eq 'Encrypted'){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl
}else{
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value " "
}
if($diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey.KeyUrl
}else{
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value " "
}

$i = $Global:VMx.Add($csvObject) 

}

}

Check Marketplace VM (Function #2: Button2 )

Function Function-CheckMarketPlaceVM(){

Write-Host “n> Checking Virtual Machines...n” -ForegroundColor Green

$vms = Get-AzVM
$Global:VMx = [System.Collections.ArrayList]::new()
foreach($vm in $vms)
{
$csvObject = New-Object PSObject
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Machine” -value $vm.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Resource Group” -value $vm.ResourceGroupName
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Location” -value $vm.Location
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Size” -value $vm.HardwareProfile.VmSize
if($vm.StorageProfile.OsDisk.ManagedDisk){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Managed Disk’
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value “”
}
else{
Add-Member -inputObject $csvObject -memberType NoteProperty -name “OS Disk Type” -value ‘Unmanaged Disk’ #$vm.StorageProfile.OsDisk
Add-Member -inputObject $csvObject -memberType NoteProperty -name “VHD Uri” -value $vm.StorageProfile.OsDisk.Vhd.Uri
}
Add-Member -inputObject $csvObject -memberType NoteProperty -name “DataDisk Count” -value $vm.StorageProfile.DataDisks.Count

$OperatingSys = '('+$vm.StorageProfile.ImageReference.Offer+' '+$vm.StorageProfile.ImageReference.Sku+')'
if($vm.StorageProfile.ImageReference -eq $null){ $OperatingSys = ''}
if($vm.StorageProfile.OsDisk.OsType -eq 0){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Windows "+$OperatingSys)
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Operating System" -value ("Linux "+$OperatingSys)}


if($vm.DiagnosticsProfile.BootDiagnostics.Enabled -eq $true){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Enabled"
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics" -value "Disabled"}

if($vm.DiagnosticsProfile.BootDiagnostics.StorageUri){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value $vm.DiagnosticsProfile.BootDiagnostics.StorageUri.Split('/')[2].Split('.')[0]  
}else{ Add-Member -inputObject $csvObject -memberType NoteProperty -name "Boot Diagnostics Storage" -value " "}


if($vm.Plan){Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'Yes'}
else{Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan associated?" -value 'No'}

Add-Member -inputObject $csvObject -memberType NoteProperty -name "Plan Name" -value $vm.Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Publisher" -value $vm.Plan.Publisher
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Product" -value $vm.Plan.Product 

$diskEncryption = Get-AzVMDiskEncryptionStatus -VMName $vm.Name -ResourceGroupName $vm.ResourceGroupName
if($diskEncryption.OsVolumeEncrypted -eq 'Encrypted'){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl
}else{
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "OsVolumeEncrypted" -value $diskEncryption.OsVolumeEncrypted
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "DiskEncryptionKey" -value " "
}
if($diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value $diskEncryption.OsVolumeEncryptionSettings.KeyEncryptionKey.KeyUrl
}else{
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "KeyEncryptionKey" -value " "
}

$i = $Global:VMx.Add($csvObject) 

}

}

Classic Virtual Machines (Function #3: Button3)

Function Function-CheckClassicVirtualMachine(){

Write-Host “n> Checking Classic Virtual Machines...n” -ForegroundColor Green

$ClassicVms = Get-AzResource -ResourceType Microsoft.ClassicCompute/virtualMachines -ExpandProperties
$Global:ClassicVMx = [System.Collections.ArrayList]::new()

foreach($ClassicVm in $ClassicVms){
$csvObject = New-Object PSObject
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Machine(Classic)” -value $ClassicVm.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Resource Group” -value $ClassicVm.ResourceGroupName
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Location” -value $ClassicVm.Location
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Status” -value $ClassicVm.Properties.instanceView.status
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Operating System” -value $ClassicVm.Properties.storageProfile.operatingSystemDisk.operatingSystem
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Cloud Service(Classic)” -value $ClassicVm.Properties.domainName.name
Add-Member -inputObject $csvObject -memberType NoteProperty -name “RG (Cloud Service)” -value $ClassicVm.Properties.domainName.id.Split(‘/’)[4]
if($ClassicVm.Properties.networkProfile.virtualNetwork){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Network” -value $ClassicVm.Properties.networkProfile.virtualNetwork.name
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Virtual Network” -value ‘’}
if($ClassicVm.Properties.networkProfile.virtualNetwork.staticIpAddress){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Static IP” -value $ClassicVm.Properties.networkProfile.virtualNetwork.staticIpAddress
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Static IP” -value ‘’}
if($ClassicVm.Properties.instanceView.publicIpAddresses){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Public IP” -value $ClassicVm.Properties.instanceView.publicIpAddresses[0]
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Public IP” -value ‘’}
if($ClassicVm.Properties.networkProfile.reservedIps){
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Reserved IP” -value $ClassicVm.Properties.networkProfile.reservedIps[0].name
}else{Add-Member -inputObject $csvObject -memberType NoteProperty -name “Reserved IP” -value ‘’}
Add-Member -inputObject $csvObject -memberType NoteProperty -name “Storage Account” -value $ClassicVm.Properties.storageProfile.operatingSystemDisk.storageAccount.name

$i = $Global:ClassicVMx.Add($csvObject)

}
}

Check App Services (Function #4: Button4)

Function Function-CheckAppServiceAndPlan(){

Write-Host “n> Checking App Service Plans and App Services... n” -ForegroundColor Green

$Global:AppPlanx = [System.Collections.ArrayList]::new()
#$Appx = [System.Collections.ArrayList]::new()

$AppServices = Get-AzResource -ResourceType Microsoft.Web/sites -ExpandProperties
$WebApps = Get-AzResource -ResourceType Microsoft.Web/sites/slots -ExpandProperties
$WebAppPlans = Get-AzResource -ResourceType Microsoft.Web/serverfarms -ExpandProperties

foreach($Plan in $WebAppPlans){
$csvObject = New-Object PSObject

$AppS = $AppServices | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}
$SlotS = $WebApps | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}

$WebSpace = $Plan.Properties.webSpace
if($WebSpace.Contains('-')){
    $OriginRG = $WebSpace.Substring(0,$WebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
$sites = "[ App-"+$AppS.Count + " | Slot-"+ $SlotS.count+" ]"

Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service Plan" -value $Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service" -value $sites
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Status" -value $Plan.Properties.status
Add-Member -inputObject $csvObject -memberType NoteProperty -name "WebSpace" -value $WebSpace
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Current RG" -value $Plan.ResourceGroupName


if($Plan.ResourceGroupName -eq $OriginRG){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Not require"
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Unknown"
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "Unknown"    
}
else{
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Require"
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value ("From: "+ $Plan.ResourceGroupName + " -> To: " + $OriginRG)
}

$i = $Global:AppPlanx.Add($csvObject)


foreach($app in $AppS){
    $csvObject2 = New-Object PSObject
    $b = $app.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
    $planname = $matches['content'] 
    $appWebSpace = $app.Properties.webSpace

    if($appWebSpace.Contains('-')){
    $OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
    }else{ $OriginRG = 'Not Found'}

    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service Plan" -value ('  ...')
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service" -value $app.name
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Status" -value $app.Properties.state
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Origin RG" -value $OriginRG
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Current RG" -value $app.ResourceGroupName 
    

    if($app.ResourceGroupName -eq $OriginRG){
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Not require"
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "---"
    }
    elseif($OriginRG -eq 'Not Found'){
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Unknown"
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "Unknown"    
    }
    else{
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Require"
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $app.ResourceGroupName + " -> To: " + $OriginRG)
    }
 
$j = $Global:AppPlanx.Add($csvObject2)     

}

foreach($slot in $SlotS){
    $csvObject3 = New-Object PSObject
    $b = $slot.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
    $planname = $matches['content'] 
    $appWebSpace = $slot.Properties.webSpace

    if($appWebSpace.Contains('-')){
    $OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
    }else{ $OriginRG = 'Not Found'}

    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service Plan" -value ('  ...')
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service" -value $slot.name
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Status" -value $slot.Properties.state
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Origin RG" -value $OriginRG
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Current RG" -value $slot.ResourceGroupName 
    

    if($slot.ResourceGroupName -eq $OriginRG){
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Not require"
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "---"
    }
    elseif($OriginRG -eq 'Not Found'){
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Unknown"
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "Unknown"    
    }
    else{
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Require"
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $slot.ResourceGroupName + " -> To: " + $OriginRG)
    }
 
$j = $Global:AppPlanx.Add($csvObject3)     

}

}

}

Check App Services (Function #4: Button4)

Function Function-CheckAppServiceAndPlan(){

Write-Host “n> Checking App Service Plans and App Services... n” -ForegroundColor Green

$Global:AppPlanx = [System.Collections.ArrayList]::new()
#$Appx = [System.Collections.ArrayList]::new()

$AppServices = Get-AzResource -ResourceType Microsoft.Web/sites -ExpandProperties
$WebApps = Get-AzResource -ResourceType Microsoft.Web/sites/slots -ExpandProperties
$WebAppPlans = Get-AzResource -ResourceType Microsoft.Web/serverfarms -ExpandProperties

foreach($Plan in $WebAppPlans){
$csvObject = New-Object PSObject

$AppS = $AppServices | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}
$SlotS = $WebApps | Where-Object { $_.Properties.serverFarmId -eq $Plan.Id}

$WebSpace = $Plan.Properties.webSpace
if($WebSpace.Contains('-')){
    $OriginRG = $WebSpace.Substring(0,$WebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}
$sites = "[ App-"+$AppS.Count + " | Slot-"+ $SlotS.count+" ]"

Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service Plan" -value $Plan.Name
Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service" -value $sites
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Status" -value $Plan.Properties.status
Add-Member -inputObject $csvObject -memberType NoteProperty -name "WebSpace" -value $WebSpace
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Origin RG" -value $OriginRG
Add-Member -inputObject $csvObject -memberType NoteProperty -name "Current RG" -value $Plan.ResourceGroupName


if($Plan.ResourceGroupName -eq $OriginRG){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Not require"
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "---"
}
elseif($OriginRG -eq 'Not Found'){
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Unknown"
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value "Unknown"    
}
else{
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Internal Move" -value "Require"
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Move Resource" -value ("From: "+ $Plan.ResourceGroupName + " -> To: " + $OriginRG)
}

$i = $Global:AppPlanx.Add($csvObject)


foreach($app in $AppS){
    $csvObject2 = New-Object PSObject
    $b = $app.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
    $planname = $matches['content'] 
    $appWebSpace = $app.Properties.webSpace

    if($appWebSpace.Contains('-')){
    $OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
    }else{ $OriginRG = 'Not Found'}

    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service Plan" -value ('  ...')
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service" -value $app.name
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Status" -value $app.Properties.state
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Origin RG" -value $OriginRG
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Current RG" -value $app.ResourceGroupName 
    

    if($app.ResourceGroupName -eq $OriginRG){
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Not require"
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "---"
    }
    elseif($OriginRG -eq 'Not Found'){
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Unknown"
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value "Unknown"    
    }
    else{
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Internal Move" -value "Require"
        Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $app.ResourceGroupName + " -> To: " + $OriginRG)
    }
 
$j = $Global:AppPlanx.Add($csvObject2)     

}

foreach($slot in $SlotS){
    $csvObject3 = New-Object PSObject
    $b = $slot.Properties.serverFarmId -match "/providers/Microsoft.Web/serverfarms/(?<content>.*)"
    $planname = $matches['content'] 
    $appWebSpace = $slot.Properties.webSpace

    if($appWebSpace.Contains('-')){
    $OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
    }else{ $OriginRG = 'Not Found'}

    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service Plan" -value ('  ...')
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "App Service" -value $slot.name
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Status" -value $slot.Properties.state
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "WebSpace" -value $appWebSpace
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Origin RG" -value $OriginRG
    Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Current RG" -value $slot.ResourceGroupName 
    

    if($slot.ResourceGroupName -eq $OriginRG){
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Not require"
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "---"
    }
    elseif($OriginRG -eq 'Not Found'){
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Unknown"
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value "Unknown"    
    }
    else{
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Internal Move" -value "Require"
        Add-Member -inputObject $csvObject3 -memberType NoteProperty -name "Move Resource" -value ("From: "+ $slot.ResourceGroupName + " -> To: " + $OriginRG)
    }
 
$j = $Global:AppPlanx.Add($csvObject3)     

}

}

}

App Service SSL Bindings (Function #5: Button5)

Function Function-CheckAppServiceCertBinding(){

Write-Host “n> Checking App Service Certificate bindings...n” -ForegroundColor Green

$appSerCerts = Get-AzWebAppCertificate
$hash = @{}
foreach($cer in $appSerCerts){
$RG = ($cer.Id.split(‘/’))[4]
$Thumb = $cer.Thumbprint
$hash[$Thumb+$RG]= @($RG,$cer.Name)
}

$AppServices = Get-AzResource -ResourceType Microsoft.Web/sites -ExpandProperties
$WebApps = Get-AzResource -ResourceType Microsoft.Web/sites/slots -ExpandProperties

$Global:BinDx = [System.Collections.ArrayList]::new()

foreach($App in $AppServices){

    $appWebSpace = $App.Properties.webSpace
    if($appWebSpace.Contains('-')){
        $OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
    }else{ $OriginRG = 'Not Found'}

$sslBind = $App.Properties.hostNameSslstates
foreach($sb in $sslBind){
    $csvObject = New-Object PSObject
    if($sb.sslState -eq 'Disabled'){continue}
    $tmp = $sb.thumbprint+$App.ResourceGroupName
    $tmp1 = $sb.thumbprint

    if($hash.$tmp){$certName = $hash.$tmp[1];$certRG = $hash.$tmp[0]}
    else{$certName = ''; $certRG = '' }
    
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service" -value $App.Name
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Host Name" -value $sb.name
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "SSL State" -value $sb.sslState
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Thumbprint" -value $sb.thumbprint
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Thumbprint RG" -value $certRG
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "App Service Origin RG" -value $OriginRG 
    Add-Member -inputObject $csvObject -memberType NoteProperty -name "Microsoft.web/certificate" -value $certName       

    $i = $Global:BinDx.Add($csvObject)
}

}

foreach($App in $WebApps){

$appWebSpace = $App.Properties.webSpace
if($appWebSpace.Contains('-')){
    $OriginRG = $appWebSpace.Substring(0,$appWebSpace.LastIndexOf('-'))
}else{ $OriginRG = 'Not Found'}

$sslBind = $App.Properties.hostNameSslstates
foreach($sb in $sslBind){
    $csvObject2 = New-Object PSObject
    if($sb.sslState -eq 'Disabled'){continue}
    $tmp = $sb.thumbprint+$App.ResourceGroupName

    if($hash.$tmp){$certName = $hash.$tmp[1];$certRG = $hash.$tmp[0]}
    else{$certName = "";$certRG = ""}
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service" -value $App.Name 
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Host Name" -value $sb.name
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "SSL State" -value $sb.sslState
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Thumbprint" -value $sb.thumbprint
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Thumbprint RG" -value $certRG
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "App Service Origin RG" -value $OriginRG
    Add-Member -inputObject $csvObject2 -memberType NoteProperty -name "Microsoft.web/certificate" -value $certName

    $i = $Global:BinDx.Add($csvObject2)
}

}

}

Call the functions to perform the assessments

Function-Assessment
Function-CheckMarketPlaceVM
Function-CheckClassicVirtualMachine
Function-CheckAppServiceCertBinding
Function-CheckAppServiceAndPlan

Export the combined report to a single CSV file

$combinedReport | Export-Csv -Path “test.csv” -NoTypeInformation
Write-Host “Resource report generated and saved to test.csv”

Please help me

Dheeman,
Welcome to the forum. :wave:t3:

Wow … that’s a B I G chunk of code. You posted more than 500 lines of code. Do you really expect someone to review this in a forum?

Despite all other possible issues with your code what have you tried to debug your issue?

Have you tried to simply output a string to text file. I don’t have experiences with Azure DevOps but I’d assume you need to provide a location where to save an output file. :man_shrugging:t3:

Regardless of all that … When you post code, sample data, console output or error messages please format it as code using the preformatted text button ( </> ). Simply place your cursor on an empty line, click the button and paste your code.

Thanks in advance

How to format code in PowerShell.org 1 <---- Click :point_up_2:t4: :wink:

( !! Sometimes the preformatted text button hides behind the settings gear symbol. :wink: )

So please go back, edit your question once again and at least fix the formatting of your code. You should use this occasion and reduce your code to a minimal reproducable example someone could use to actually reproduce your issue. :point_up_2:t3: