[{"data":1,"prerenderedAt":2122},["ShallowReactive",2],{"post:\u002F2025\u002F08\u002F13\u002Fpowershell-netapp-discover-every-volume-over-80-percent-capacity\u002F":3},{"post":4,"newer":2073,"older":2082,"related":2091,"series":2120},{"id":5,"title":6,"body":7,"canonical":2052,"categories":2053,"date":2057,"description":2058,"extension":2059,"featured":2060,"hero":2061,"image":2061,"meta":2062,"navigation":722,"path":2063,"readingTime":482,"seo":2064,"series":2061,"seriesOrder":2061,"sites":2065,"source":2061,"stem":2066,"tags":2067,"updated":2061,"url":2071,"__hash__":2072},"blog\u002Fblog\u002F2025\u002F08\u002F13\u002Fpowershell-netapp-discover-every-volume-over-80-percent-capacity.md","PowerShell: NetApp – Discover Every Volume Over 80 Percent Capacity",{"type":8,"value":9,"toc":2044},"minimark",[10,14,34,39,78,88,92,204,208,211,246,249,334,337,343,354,453,457,1817,1821,1983,1987,2040],[11,12,13],"p",{},"Capacity alerts from Active IQ Unified Manager are useful, but they're per-cluster and per-threshold-policy, which means the thresholds drift over time as different admins tune different systems. ONTAP itself only raises EMS events at each volume's own nearly-full and full thresholds (95% and 98% by default). When I want one honest answer to \"which volumes across the whole fleet are getting tight,\" I skip the monitoring stack and ask every cluster directly, with the same bar applied everywhere.",[11,15,16,17,21,22,25,26,29,30,33],{},"The first version of this script used the Data ONTAP PowerShell Toolkit (",[18,19,20],"code",{},"Connect-NcController",", ",[18,23,24],{},"Get-NcVol","), which spoke ONTAPI (ZAPI) under the hood. NetApp has since replaced ZAPI with the ONTAP REST API as the primary automation interface: from ONTAP 9.14, ONTAPI is disabled automatically if no ONTAPI calls are seen for 30 days after an upgrade. So this version calls ",[18,27,28],{},"GET \u002Fapi\u002Fstorage\u002Fvolumes"," directly with ",[18,31,32],{},"Invoke-RestMethod",". No module to install, and the filtering happens on the cluster.",[35,36,38],"h2",{"id":37},"requirements","Requirements",[40,41,42,57,64,67],"ul",{},[43,44,45,46,49,50,53,54,56],"li",{},"PowerShell 7 (for ",[18,47,48],{},"-Authentication Basic"," and ",[18,51,52],{},"-SkipCertificateCheck"," on ",[18,55,32],{},").",[43,58,59,60,63],{},"ONTAP 9.9 or later on every cluster; that's the release where the volume ",[18,61,62],{},"space.percent_used"," field used here appears in the REST API.",[43,65,66],{},"HTTPS reachability from wherever the script runs to each cluster management LIF.",[43,68,69,70,73,74,77],{},"A cluster login with the ",[18,71,72],{},"http"," application and the built-in ",[18,75,76],{},"readonly"," role. Create it once per cluster:",[79,80,86],"pre",{"className":81,"code":83,"language":84,"meta":85},[82],"language-text","cluster1::> security login create -vserver \u003Ccluster-admin-svm> -user-or-group-name capacity-report -application http -authentication-method password -role readonly\n","text","",[18,87,83],{"__ignoreMap":85},[35,89,91],{"id":90},"parameters","Parameters",[93,94,95,114],"table",{},[96,97,98],"thead",{},[99,100,101,105,108,111],"tr",{},[102,103,104],"th",{},"Name",[102,106,107],{},"Type",[102,109,110],{},"Required",[102,112,113],{},"Description",[115,116,117,137,153,175,190],"tbody",{},[99,118,119,125,131,134],{},[120,121,122],"td",{},[18,123,124],{},"Clusters",[120,126,127,128],{},"String",[129,130],"span",{},[120,132,133],{},"Yes",[120,135,136],{},"Cluster management hostnames or IPs to sweep.",[99,138,139,144,147,150],{},[120,140,141],{},[18,142,143],{},"Credential",[120,145,146],{},"PSCredential",[120,148,149],{},"No",[120,151,152],{},"Credential used against every cluster. Prompts if omitted.",[99,154,155,160,163,165],{},[120,156,157],{},[18,158,159],{},"ThresholdPercent",[120,161,162],{},"Int",[120,164,149],{},[120,166,167,168,170,171,174],{},"Minimum ",[18,169,62],{}," to report a volume. Defaults to ",[18,172,173],{},"80",".",[99,176,177,182,185,187],{},[120,178,179],{},[18,180,181],{},"SkipCertificateCheck",[120,183,184],{},"Switch",[120,186,149],{},[120,188,189],{},"Accepts self-signed cluster certificates. Use only on a management network you trust.",[99,191,192,197,199,201],{},[120,193,194],{},[18,195,196],{},"OutputPath",[120,198,127],{},[120,200,149],{},[120,202,203],{},"If set, writes the results to this CSV path in addition to the console.",[35,205,207],{"id":206},"usage","Usage",[11,209,210],{},"Sweep two clusters with the default 80 percent threshold:",[79,212,216],{"className":213,"code":214,"language":215,"meta":85,"style":85},"language-powershell shiki shiki-themes github-dark",".\\Get-NetAppVolumesOverThreshold.ps1 -Clusters \"cluster1-mgmt.example.com\", \"cluster2-mgmt.example.com\"\n","powershell",[18,217,218],{"__ignoreMap":85},[129,219,222,225,229,233,236,240,243],{"class":220,"line":221},"line",1,[129,223,174],{"class":224},"s95oV",[129,226,228],{"class":227},"sDLfK","\\Get-NetAppVolumesOverThreshold.ps1",[129,230,232],{"class":231},"snl16"," -",[129,234,235],{"class":224},"Clusters ",[129,237,239],{"class":238},"sU2Wk","\"cluster1-mgmt.example.com\"",[129,241,242],{"class":231},",",[129,244,245],{"class":238}," \"cluster2-mgmt.example.com\"\n",[11,247,248],{},"Sweep every cluster in a list, lower the threshold to catch volumes trending toward full, and export a CSV for the storage review:",[79,250,252],{"className":213,"code":251,"language":215,"meta":85,"style":85},"$cred = Get-Credential -UserName \"capacity-report\" -Message \"ONTAP read-only login\"\n$clusterList = Get-Content -Path \"C:\\Scripts\\clusters.txt\"\n.\\Get-NetAppVolumesOverThreshold.ps1 -Clusters $clusterList -Credential $cred -ThresholdPercent 75 -OutputPath \"C:\\Reports\\volumes-over-threshold.csv\"\n",[18,253,254,281,300],{"__ignoreMap":85},[129,255,256,259,262,265,267,270,273,275,278],{"class":220,"line":221},[129,257,258],{"class":224},"$cred ",[129,260,261],{"class":231},"=",[129,263,264],{"class":227}," Get-Credential",[129,266,232],{"class":231},[129,268,269],{"class":224},"UserName ",[129,271,272],{"class":238},"\"capacity-report\"",[129,274,232],{"class":231},[129,276,277],{"class":224},"Message ",[129,279,280],{"class":238},"\"ONTAP read-only login\"\n",[129,282,284,287,289,292,294,297],{"class":220,"line":283},2,[129,285,286],{"class":224},"$clusterList ",[129,288,261],{"class":231},[129,290,291],{"class":227}," Get-Content",[129,293,232],{"class":231},[129,295,296],{"class":224},"Path ",[129,298,299],{"class":238},"\"C:\\Scripts\\clusters.txt\"\n",[129,301,303,305,307,309,312,315,318,320,323,326,328,331],{"class":220,"line":302},3,[129,304,174],{"class":224},[129,306,228],{"class":227},[129,308,232],{"class":231},[129,310,311],{"class":224},"Clusters $clusterList ",[129,313,314],{"class":231},"-",[129,316,317],{"class":224},"Credential $cred ",[129,319,314],{"class":231},[129,321,322],{"class":224},"ThresholdPercent ",[129,324,325],{"class":227},"75",[129,327,232],{"class":231},[129,329,330],{"class":224},"OutputPath ",[129,332,333],{"class":238},"\"C:\\Reports\\volumes-over-threshold.csv\"\n",[11,335,336],{},"Sample output:",[79,338,341],{"className":339,"code":340,"language":84,"meta":85},[82],"Querying cluster1-mgmt.example.com ...\nQuerying cluster2-mgmt.example.com ...\n\nCluster                   Svm          Volume           Style    SizeGB UsedGB AvailGB PercentUsed NearlyFull Aggregate\n-------                   ---          ------           -----    ------ ------ ------- ----------- ---------- ---------\ncluster1-mgmt.example.com svm_prod01   vol_sql_logs     flexvol     512    492      20          96       True aggr1_n1\ncluster1-mgmt.example.com svm_prod01   vol_app_data     flexvol    2048   1782     266          87      False aggr1_n2\ncluster2-mgmt.example.com svm_files02  vol_home_shares  flexgroup  4096   3379     717          82      False aggr1_n1,aggr1_n2\n\n3 volume(s) at or above 80% used across 2 cluster(s).\nResults written to C:\\Reports\\volumes-over-threshold.csv\n",[18,342,340],{"__ignoreMap":85},[11,344,345,346,349,350,353],{},"The same question as a single REST call, useful for checking one cluster by hand (the ",[18,347,348],{},">="," operator is URL-encoded as ",[18,351,352],{},"%3E%3D","):",[79,355,357],{"className":213,"code":356,"language":215,"meta":85,"style":85},"Invoke-RestMethod -Uri \"https:\u002F\u002Fcluster1-mgmt.example.com\u002Fapi\u002Fstorage\u002Fvolumes?state=online&space.percent_used=%3E%3D80&fields=name,svm.name,space.percent_used\" -Authentication Basic -Credential $cred |\n    Select-Object -ExpandProperty records |\n    Select-Object -Property name, @{ Name = 'svm'; Expression = { $_.svm.name } }, @{ Name = 'percent_used'; Expression = { $_.space.percent_used } }\n",[18,358,359,383,395],{"__ignoreMap":85},[129,360,361,363,365,368,371,373,376,378,380],{"class":220,"line":221},[129,362,32],{"class":227},[129,364,232],{"class":231},[129,366,367],{"class":224},"Uri ",[129,369,370],{"class":238},"\"https:\u002F\u002Fcluster1-mgmt.example.com\u002Fapi\u002Fstorage\u002Fvolumes?state=online&space.percent_used=%3E%3D80&fields=name,svm.name,space.percent_used\"",[129,372,232],{"class":231},[129,374,375],{"class":224},"Authentication Basic ",[129,377,314],{"class":231},[129,379,317],{"class":224},[129,381,382],{"class":231},"|\n",[129,384,385,388,390,393],{"class":220,"line":283},[129,386,387],{"class":227},"    Select-Object",[129,389,232],{"class":231},[129,391,392],{"class":224},"ExpandProperty records ",[129,394,382],{"class":231},[129,396,397,399,401,404,406,409,412,414,417,420,422,425,428,431,433,435,437,439,442,444,446,448,450],{"class":220,"line":302},[129,398,387],{"class":227},[129,400,232],{"class":231},[129,402,403],{"class":224},"Property name",[129,405,242],{"class":231},[129,407,408],{"class":231}," @",[129,410,411],{"class":224},"{ Name ",[129,413,261],{"class":231},[129,415,416],{"class":238}," 'svm'",[129,418,419],{"class":224},"; Expression ",[129,421,261],{"class":231},[129,423,424],{"class":224}," { ",[129,426,427],{"class":227},"$_",[129,429,430],{"class":224},".svm.name } }",[129,432,242],{"class":231},[129,434,408],{"class":231},[129,436,411],{"class":224},[129,438,261],{"class":231},[129,440,441],{"class":238}," 'percent_used'",[129,443,419],{"class":224},[129,445,261],{"class":231},[129,447,424],{"class":224},[129,449,427],{"class":227},[129,451,452],{"class":224},".space.percent_used } }\n",[35,454,456],{"id":455},"script","Script",[79,458,460],{"className":213,"code":459,"language":215,"meta":85,"style":85},"\u003C#\n.SYNOPSIS\n    Reports every volume across a set of NetApp ONTAP clusters above a capacity threshold.\n.DESCRIPTION\n    Calls GET \u002Fapi\u002Fstorage\u002Fvolumes on each cluster through the ONTAP REST API, asking the cluster to\n    return only online volumes whose space.percent_used is at or above the threshold, with just the\n    fields the report needs. Follows _links.next for large result sets. Reports FlexVol and FlexGroup\n    volumes (not FlexGroup constituents), flags volumes past their own nearly-full threshold, and\n    applies the same bar to every cluster regardless of how each cluster's alerting is configured.\n.PARAMETER Clusters\n    Cluster management hostnames or IPs to sweep.\n.PARAMETER Credential\n    Credential used against every cluster. Prompts if omitted.\n.PARAMETER ThresholdPercent\n    Minimum space.percent_used to report a volume. Defaults to 80.\n.PARAMETER SkipCertificateCheck\n    Accepts self-signed cluster certificates. Use only on a management network you trust.\n.PARAMETER OutputPath\n    If set, writes the results to this CSV path in addition to the console.\n.EXAMPLE\n    .\\Get-NetAppVolumesOverThreshold.ps1 -Clusters \"cluster1-mgmt.example.com\", \"cluster2-mgmt.example.com\" -ThresholdPercent 75\n.NOTES\n    Author  : Thomas Lasswell (https:\u002F\u002Fwww.techcolumnist.com)\n    Version : 1.0 (2025-08-13)\n    Requires: PowerShell 7, ONTAP 9.9 or later, a login with the http application and readonly role\n#>\n#Requires -Version 7.0\n[CmdletBinding()]\nparam (\n    [Parameter(Mandatory = $true)]\n    [string[]]$Clusters,\n\n    [Parameter(Mandatory = $false)]\n    [System.Management.Automation.PSCredential]$Credential,\n\n    [Parameter(Mandatory = $false)]\n    [ValidateRange(1, 100)]\n    [int]$ThresholdPercent = 80,\n\n    [Parameter(Mandatory = $false)]\n    [switch]$SkipCertificateCheck,\n\n    [Parameter(Mandatory = $false)]\n    [string]$OutputPath\n)\n\nif (-not $Credential) {\n    $Credential = Get-Credential -Message \"ONTAP read-only login used for every cluster\"\n}\n\n$fields = @(\n    'name', 'svm.name', 'state', 'style', 'aggregates.name',\n    'space.size', 'space.used', 'space.available', 'space.percent_used',\n    'space.snapshot.reserve_percent', 'space.nearly_full_threshold_percent'\n) -join ','\n\n$restParams = @{\n    Method         = 'Get'\n    Authentication = 'Basic'\n    Credential     = $Credential\n    ErrorAction    = 'Stop'\n}\nif ($SkipCertificateCheck) {\n    $restParams['SkipCertificateCheck'] = $true\n}\n\n$results = foreach ($cluster in $Clusters) {\n    Write-Host \"Querying $cluster ...\"\n\n    # Filter on the cluster: online volumes at or above the threshold. \">=\" is URL-encoded.\n    $nextPath = \"\u002Fapi\u002Fstorage\u002Fvolumes?state=online&space.percent_used=%3E%3D$ThresholdPercent&max_records=500&fields=$fields\"\n\n    while ($nextPath) {\n        try {\n            $response = Invoke-RestMethod -Uri \"https:\u002F\u002F$cluster$nextPath\" @restParams\n        } catch {\n            Write-Warning \"Could not query ${cluster}: $($_.Exception.Message)\"\n            break\n        }\n\n        foreach ($volume in $response.records) {\n            $space = $volume.space\n            $nearlyFullAt = if ($space.nearly_full_threshold_percent) { $space.nearly_full_threshold_percent } else { 95 }\n\n            [PSCustomObject]@{\n                Cluster        = $cluster\n                Svm            = $volume.svm.name\n                Volume         = $volume.name\n                Style          = $volume.style\n                SizeGB         = [math]::Round($space.size \u002F 1GB, 0)\n                UsedGB         = [math]::Round($space.used \u002F 1GB, 0)\n                AvailGB        = [math]::Round($space.available \u002F 1GB, 0)\n                PercentUsed    = $space.percent_used\n                NearlyFull     = $space.percent_used -ge $nearlyFullAt\n                SnapReservePct = $space.snapshot.reserve_percent\n                Aggregate      = ($volume.aggregates.name | Sort-Object -Unique) -join ','\n            }\n        }\n\n        # ONTAP returns a relative next link while more records remain.\n        $nextPath = $response._links.next.href\n    }\n}\n\n$results = @($results | Sort-Object -Property PercentUsed -Descending)\n\n$results | Format-Table -Property Cluster, Svm, Volume, Style, SizeGB, UsedGB, AvailGB, PercentUsed, NearlyFull, Aggregate -AutoSize\n\nWrite-Host \"\"\nWrite-Host \"$($results.Count) volume(s) at or above $ThresholdPercent% used across $($Clusters.Count) cluster(s).\"\n\nif ($OutputPath) {\n    $results | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8\n    Write-Host \"Results written to $OutputPath\"\n}\n",[18,461,462,468,475,480,488,494,500,506,512,518,529,535,545,551,561,567,577,583,593,599,607,613,621,627,633,639,645,658,670,679,703,717,724,742,755,760,777,797,815,820,837,850,855,872,882,888,893,908,925,931,936,949,977,1000,1011,1023,1028,1041,1052,1063,1074,1085,1090,1098,1115,1120,1125,1145,1160,1165,1171,1194,1199,1208,1217,1244,1255,1285,1291,1297,1302,1316,1327,1352,1357,1374,1385,1396,1407,1418,1449,1474,1499,1510,1527,1538,1564,1570,1575,1580,1586,1597,1603,1608,1613,1639,1644,1709,1714,1723,1760,1765,1773,1799,1812],{"__ignoreMap":85},[129,463,464],{"class":220,"line":221},[129,465,467],{"class":466},"sAwPA","\u003C#\n",[129,469,470,472],{"class":220,"line":283},[129,471,174],{"class":227},[129,473,474],{"class":231},"SYNOPSIS\n",[129,476,477],{"class":220,"line":302},[129,478,479],{"class":466},"    Reports every volume across a set of NetApp ONTAP clusters above a capacity threshold.\n",[129,481,483,485],{"class":220,"line":482},4,[129,484,174],{"class":227},[129,486,487],{"class":231},"DESCRIPTION\n",[129,489,491],{"class":220,"line":490},5,[129,492,493],{"class":466},"    Calls GET \u002Fapi\u002Fstorage\u002Fvolumes on each cluster through the ONTAP REST API, asking the cluster to\n",[129,495,497],{"class":220,"line":496},6,[129,498,499],{"class":466},"    return only online volumes whose space.percent_used is at or above the threshold, with just the\n",[129,501,503],{"class":220,"line":502},7,[129,504,505],{"class":466},"    fields the report needs. Follows _links.next for large result sets. Reports FlexVol and FlexGroup\n",[129,507,509],{"class":220,"line":508},8,[129,510,511],{"class":466},"    volumes (not FlexGroup constituents), flags volumes past their own nearly-full threshold, and\n",[129,513,515],{"class":220,"line":514},9,[129,516,517],{"class":466},"    applies the same bar to every cluster regardless of how each cluster's alerting is configured.\n",[129,519,521,523,526],{"class":220,"line":520},10,[129,522,174],{"class":227},[129,524,525],{"class":231},"PARAMETER",[129,527,528],{"class":231}," Clusters\n",[129,530,532],{"class":220,"line":531},11,[129,533,534],{"class":466},"    Cluster management hostnames or IPs to sweep.\n",[129,536,538,540,542],{"class":220,"line":537},12,[129,539,174],{"class":227},[129,541,525],{"class":231},[129,543,544],{"class":231}," Credential\n",[129,546,548],{"class":220,"line":547},13,[129,549,550],{"class":466},"    Credential used against every cluster. Prompts if omitted.\n",[129,552,554,556,558],{"class":220,"line":553},14,[129,555,174],{"class":227},[129,557,525],{"class":231},[129,559,560],{"class":231}," ThresholdPercent\n",[129,562,564],{"class":220,"line":563},15,[129,565,566],{"class":466},"    Minimum space.percent_used to report a volume. Defaults to 80.\n",[129,568,570,572,574],{"class":220,"line":569},16,[129,571,174],{"class":227},[129,573,525],{"class":231},[129,575,576],{"class":231}," SkipCertificateCheck\n",[129,578,580],{"class":220,"line":579},17,[129,581,582],{"class":466},"    Accepts self-signed cluster certificates. Use only on a management network you trust.\n",[129,584,586,588,590],{"class":220,"line":585},18,[129,587,174],{"class":227},[129,589,525],{"class":231},[129,591,592],{"class":231}," OutputPath\n",[129,594,596],{"class":220,"line":595},19,[129,597,598],{"class":466},"    If set, writes the results to this CSV path in addition to the console.\n",[129,600,602,604],{"class":220,"line":601},20,[129,603,174],{"class":227},[129,605,606],{"class":231},"EXAMPLE\n",[129,608,610],{"class":220,"line":609},21,[129,611,612],{"class":466},"    .\\Get-NetAppVolumesOverThreshold.ps1 -Clusters \"cluster1-mgmt.example.com\", \"cluster2-mgmt.example.com\" -ThresholdPercent 75\n",[129,614,616,618],{"class":220,"line":615},22,[129,617,174],{"class":227},[129,619,620],{"class":231},"NOTES\n",[129,622,624],{"class":220,"line":623},23,[129,625,626],{"class":466},"    Author  : Thomas Lasswell (https:\u002F\u002Fwww.techcolumnist.com)\n",[129,628,630],{"class":220,"line":629},24,[129,631,632],{"class":466},"    Version : 1.0 (2025-08-13)\n",[129,634,636],{"class":220,"line":635},25,[129,637,638],{"class":466},"    Requires: PowerShell 7, ONTAP 9.9 or later, a login with the http application and readonly role\n",[129,640,642],{"class":220,"line":641},26,[129,643,644],{"class":466},"#>\n",[129,646,648,651,654],{"class":220,"line":647},27,[129,649,650],{"class":466},"#",[129,652,653],{"class":231},"Requires -Version",[129,655,657],{"class":656},"s9osk"," 7.0\n",[129,659,661,664,667],{"class":220,"line":660},28,[129,662,663],{"class":224},"[",[129,665,666],{"class":227},"CmdletBinding",[129,668,669],{"class":224},"()]\n",[129,671,673,676],{"class":220,"line":672},29,[129,674,675],{"class":231},"param",[129,677,678],{"class":224}," (\n",[129,680,682,685,688,691,694,697,700],{"class":220,"line":681},30,[129,683,684],{"class":224},"    [",[129,686,687],{"class":227},"Parameter",[129,689,690],{"class":224},"(",[129,692,693],{"class":656},"Mandatory",[129,695,696],{"class":231}," =",[129,698,699],{"class":227}," $true",[129,701,702],{"class":224},")]\n",[129,704,706,708,711,714],{"class":220,"line":705},31,[129,707,684],{"class":224},[129,709,710],{"class":231},"string",[129,712,713],{"class":224},"[]]$Clusters",[129,715,716],{"class":231},",\n",[129,718,720],{"class":220,"line":719},32,[129,721,723],{"emptyLinePlaceholder":722},true,"\n",[129,725,727,729,731,733,735,737,740],{"class":220,"line":726},33,[129,728,684],{"class":224},[129,730,687],{"class":227},[129,732,690],{"class":224},[129,734,693],{"class":656},[129,736,696],{"class":231},[129,738,739],{"class":227}," $false",[129,741,702],{"class":224},[129,743,745,747,750,753],{"class":220,"line":744},34,[129,746,684],{"class":224},[129,748,749],{"class":231},"System.Management.Automation.PSCredential",[129,751,752],{"class":224},"]$Credential",[129,754,716],{"class":231},[129,756,758],{"class":220,"line":757},35,[129,759,723],{"emptyLinePlaceholder":722},[129,761,763,765,767,769,771,773,775],{"class":220,"line":762},36,[129,764,684],{"class":224},[129,766,687],{"class":227},[129,768,690],{"class":224},[129,770,693],{"class":656},[129,772,696],{"class":231},[129,774,739],{"class":227},[129,776,702],{"class":224},[129,778,780,782,785,787,790,792,795],{"class":220,"line":779},37,[129,781,684],{"class":224},[129,783,784],{"class":227},"ValidateRange",[129,786,690],{"class":224},[129,788,789],{"class":227},"1",[129,791,242],{"class":231},[129,793,794],{"class":227}," 100",[129,796,702],{"class":224},[129,798,800,802,805,808,810,813],{"class":220,"line":799},38,[129,801,684],{"class":224},[129,803,804],{"class":231},"int",[129,806,807],{"class":224},"]$ThresholdPercent ",[129,809,261],{"class":231},[129,811,812],{"class":227}," 80",[129,814,716],{"class":231},[129,816,818],{"class":220,"line":817},39,[129,819,723],{"emptyLinePlaceholder":722},[129,821,823,825,827,829,831,833,835],{"class":220,"line":822},40,[129,824,684],{"class":224},[129,826,687],{"class":227},[129,828,690],{"class":224},[129,830,693],{"class":656},[129,832,696],{"class":231},[129,834,739],{"class":227},[129,836,702],{"class":224},[129,838,840,842,845,848],{"class":220,"line":839},41,[129,841,684],{"class":224},[129,843,844],{"class":231},"switch",[129,846,847],{"class":224},"]$SkipCertificateCheck",[129,849,716],{"class":231},[129,851,853],{"class":220,"line":852},42,[129,854,723],{"emptyLinePlaceholder":722},[129,856,858,860,862,864,866,868,870],{"class":220,"line":857},43,[129,859,684],{"class":224},[129,861,687],{"class":227},[129,863,690],{"class":224},[129,865,693],{"class":656},[129,867,696],{"class":231},[129,869,739],{"class":227},[129,871,702],{"class":224},[129,873,875,877,879],{"class":220,"line":874},44,[129,876,684],{"class":224},[129,878,710],{"class":231},[129,880,881],{"class":224},"]$OutputPath\n",[129,883,885],{"class":220,"line":884},45,[129,886,887],{"class":224},")\n",[129,889,891],{"class":220,"line":890},46,[129,892,723],{"emptyLinePlaceholder":722},[129,894,896,899,902,905],{"class":220,"line":895},47,[129,897,898],{"class":231},"if",[129,900,901],{"class":224}," (",[129,903,904],{"class":231},"-not",[129,906,907],{"class":224}," $Credential) {\n",[129,909,911,914,916,918,920,922],{"class":220,"line":910},48,[129,912,913],{"class":224},"    $Credential ",[129,915,261],{"class":231},[129,917,264],{"class":227},[129,919,232],{"class":231},[129,921,277],{"class":224},[129,923,924],{"class":238},"\"ONTAP read-only login used for every cluster\"\n",[129,926,928],{"class":220,"line":927},49,[129,929,930],{"class":224},"}\n",[129,932,934],{"class":220,"line":933},50,[129,935,723],{"emptyLinePlaceholder":722},[129,937,939,942,944,946],{"class":220,"line":938},51,[129,940,941],{"class":224},"$fields ",[129,943,261],{"class":231},[129,945,408],{"class":231},[129,947,948],{"class":224},"(\n",[129,950,952,955,957,960,962,965,967,970,972,975],{"class":220,"line":951},52,[129,953,954],{"class":238},"    'name'",[129,956,242],{"class":231},[129,958,959],{"class":238}," 'svm.name'",[129,961,242],{"class":231},[129,963,964],{"class":238}," 'state'",[129,966,242],{"class":231},[129,968,969],{"class":238}," 'style'",[129,971,242],{"class":231},[129,973,974],{"class":238}," 'aggregates.name'",[129,976,716],{"class":231},[129,978,980,983,985,988,990,993,995,998],{"class":220,"line":979},53,[129,981,982],{"class":238},"    'space.size'",[129,984,242],{"class":231},[129,986,987],{"class":238}," 'space.used'",[129,989,242],{"class":231},[129,991,992],{"class":238}," 'space.available'",[129,994,242],{"class":231},[129,996,997],{"class":238}," 'space.percent_used'",[129,999,716],{"class":231},[129,1001,1003,1006,1008],{"class":220,"line":1002},54,[129,1004,1005],{"class":238},"    'space.snapshot.reserve_percent'",[129,1007,242],{"class":231},[129,1009,1010],{"class":238}," 'space.nearly_full_threshold_percent'\n",[129,1012,1014,1017,1020],{"class":220,"line":1013},55,[129,1015,1016],{"class":224},") ",[129,1018,1019],{"class":231},"-join",[129,1021,1022],{"class":238}," ','\n",[129,1024,1026],{"class":220,"line":1025},56,[129,1027,723],{"emptyLinePlaceholder":722},[129,1029,1031,1034,1036,1038],{"class":220,"line":1030},57,[129,1032,1033],{"class":224},"$restParams ",[129,1035,261],{"class":231},[129,1037,408],{"class":231},[129,1039,1040],{"class":224},"{\n",[129,1042,1044,1047,1049],{"class":220,"line":1043},58,[129,1045,1046],{"class":224},"    Method         ",[129,1048,261],{"class":231},[129,1050,1051],{"class":238}," 'Get'\n",[129,1053,1055,1058,1060],{"class":220,"line":1054},59,[129,1056,1057],{"class":224},"    Authentication ",[129,1059,261],{"class":231},[129,1061,1062],{"class":238}," 'Basic'\n",[129,1064,1066,1069,1071],{"class":220,"line":1065},60,[129,1067,1068],{"class":224},"    Credential     ",[129,1070,261],{"class":231},[129,1072,1073],{"class":224}," $Credential\n",[129,1075,1077,1080,1082],{"class":220,"line":1076},61,[129,1078,1079],{"class":224},"    ErrorAction    ",[129,1081,261],{"class":231},[129,1083,1084],{"class":238}," 'Stop'\n",[129,1086,1088],{"class":220,"line":1087},62,[129,1089,930],{"class":224},[129,1091,1093,1095],{"class":220,"line":1092},63,[129,1094,898],{"class":231},[129,1096,1097],{"class":224}," ($SkipCertificateCheck) {\n",[129,1099,1101,1104,1107,1110,1112],{"class":220,"line":1100},64,[129,1102,1103],{"class":224},"    $restParams[",[129,1105,1106],{"class":238},"'SkipCertificateCheck'",[129,1108,1109],{"class":224},"] ",[129,1111,261],{"class":231},[129,1113,1114],{"class":227}," $true\n",[129,1116,1118],{"class":220,"line":1117},65,[129,1119,930],{"class":224},[129,1121,1123],{"class":220,"line":1122},66,[129,1124,723],{"emptyLinePlaceholder":722},[129,1126,1128,1131,1133,1136,1139,1142],{"class":220,"line":1127},67,[129,1129,1130],{"class":224},"$results ",[129,1132,261],{"class":231},[129,1134,1135],{"class":231}," foreach",[129,1137,1138],{"class":224}," ($cluster ",[129,1140,1141],{"class":231},"in",[129,1143,1144],{"class":224}," $Clusters) {\n",[129,1146,1148,1151,1154,1157],{"class":220,"line":1147},68,[129,1149,1150],{"class":227},"    Write-Host",[129,1152,1153],{"class":238}," \"Querying ",[129,1155,1156],{"class":224},"$cluster",[129,1158,1159],{"class":238}," ...\"\n",[129,1161,1163],{"class":220,"line":1162},69,[129,1164,723],{"emptyLinePlaceholder":722},[129,1166,1168],{"class":220,"line":1167},70,[129,1169,1170],{"class":466},"    # Filter on the cluster: online volumes at or above the threshold. \">=\" is URL-encoded.\n",[129,1172,1174,1177,1179,1182,1185,1188,1191],{"class":220,"line":1173},71,[129,1175,1176],{"class":224},"    $nextPath ",[129,1178,261],{"class":231},[129,1180,1181],{"class":238}," \"\u002Fapi\u002Fstorage\u002Fvolumes?state=online&space.percent_used=%3E%3D",[129,1183,1184],{"class":224},"$ThresholdPercent",[129,1186,1187],{"class":238},"&max_records=500&fields=",[129,1189,1190],{"class":224},"$fields",[129,1192,1193],{"class":238},"\"\n",[129,1195,1197],{"class":220,"line":1196},72,[129,1198,723],{"emptyLinePlaceholder":722},[129,1200,1202,1205],{"class":220,"line":1201},73,[129,1203,1204],{"class":231},"    while",[129,1206,1207],{"class":224}," ($nextPath) {\n",[129,1209,1211,1214],{"class":220,"line":1210},74,[129,1212,1213],{"class":231},"        try",[129,1215,1216],{"class":224}," {\n",[129,1218,1220,1223,1225,1228,1230,1232,1235,1238,1241],{"class":220,"line":1219},75,[129,1221,1222],{"class":224},"            $response ",[129,1224,261],{"class":231},[129,1226,1227],{"class":227}," Invoke-RestMethod",[129,1229,232],{"class":231},[129,1231,367],{"class":224},[129,1233,1234],{"class":238},"\"https:\u002F\u002F",[129,1236,1237],{"class":224},"$cluster$nextPath",[129,1239,1240],{"class":238},"\"",[129,1242,1243],{"class":224}," @restParams\n",[129,1245,1247,1250,1253],{"class":220,"line":1246},76,[129,1248,1249],{"class":224},"        } ",[129,1251,1252],{"class":231},"catch",[129,1254,1216],{"class":224},[129,1256,1258,1261,1264,1267,1270,1273,1275,1277,1280,1283],{"class":220,"line":1257},77,[129,1259,1260],{"class":227},"            Write-Warning",[129,1262,1263],{"class":238}," \"Could not query ",[129,1265,1266],{"class":224},"${cluster}",[129,1268,1269],{"class":238},": ",[129,1271,1272],{"class":231},"$",[129,1274,690],{"class":238},[129,1276,427],{"class":227},[129,1278,1279],{"class":224},".Exception.Message",[129,1281,1282],{"class":238},")",[129,1284,1193],{"class":238},[129,1286,1288],{"class":220,"line":1287},78,[129,1289,1290],{"class":231},"            break\n",[129,1292,1294],{"class":220,"line":1293},79,[129,1295,1296],{"class":224},"        }\n",[129,1298,1300],{"class":220,"line":1299},80,[129,1301,723],{"emptyLinePlaceholder":722},[129,1303,1305,1308,1311,1313],{"class":220,"line":1304},81,[129,1306,1307],{"class":231},"        foreach",[129,1309,1310],{"class":224}," ($volume ",[129,1312,1141],{"class":231},[129,1314,1315],{"class":224}," $response.records) {\n",[129,1317,1319,1322,1324],{"class":220,"line":1318},82,[129,1320,1321],{"class":224},"            $space ",[129,1323,261],{"class":231},[129,1325,1326],{"class":224}," $volume.space\n",[129,1328,1330,1333,1335,1338,1341,1344,1346,1349],{"class":220,"line":1329},83,[129,1331,1332],{"class":224},"            $nearlyFullAt ",[129,1334,261],{"class":231},[129,1336,1337],{"class":231}," if",[129,1339,1340],{"class":224}," ($space.nearly_full_threshold_percent) { $space.nearly_full_threshold_percent } ",[129,1342,1343],{"class":231},"else",[129,1345,424],{"class":224},[129,1347,1348],{"class":227},"95",[129,1350,1351],{"class":224}," }\n",[129,1353,1355],{"class":220,"line":1354},84,[129,1356,723],{"emptyLinePlaceholder":722},[129,1358,1360,1363,1366,1369,1372],{"class":220,"line":1359},85,[129,1361,1362],{"class":224},"            [",[129,1364,1365],{"class":231},"PSCustomObject",[129,1367,1368],{"class":224},"]",[129,1370,1371],{"class":231},"@",[129,1373,1040],{"class":224},[129,1375,1377,1380,1382],{"class":220,"line":1376},86,[129,1378,1379],{"class":224},"                Cluster        ",[129,1381,261],{"class":231},[129,1383,1384],{"class":224}," $cluster\n",[129,1386,1388,1391,1393],{"class":220,"line":1387},87,[129,1389,1390],{"class":224},"                Svm            ",[129,1392,261],{"class":231},[129,1394,1395],{"class":224}," $volume.svm.name\n",[129,1397,1399,1402,1404],{"class":220,"line":1398},88,[129,1400,1401],{"class":224},"                Volume         ",[129,1403,261],{"class":231},[129,1405,1406],{"class":224}," $volume.name\n",[129,1408,1410,1413,1415],{"class":220,"line":1409},89,[129,1411,1412],{"class":224},"                Style          ",[129,1414,261],{"class":231},[129,1416,1417],{"class":224}," $volume.style\n",[129,1419,1421,1424,1426,1429,1432,1435,1438,1441,1444,1447],{"class":220,"line":1420},90,[129,1422,1423],{"class":224},"                SizeGB         ",[129,1425,261],{"class":231},[129,1427,1428],{"class":224}," [",[129,1430,1431],{"class":231},"math",[129,1433,1434],{"class":224},"]::Round($space.size ",[129,1436,1437],{"class":231},"\u002F",[129,1439,1440],{"class":227}," 1",[129,1442,1443],{"class":231},"GB,",[129,1445,1446],{"class":227}," 0",[129,1448,887],{"class":224},[129,1450,1452,1455,1457,1459,1461,1464,1466,1468,1470,1472],{"class":220,"line":1451},91,[129,1453,1454],{"class":224},"                UsedGB         ",[129,1456,261],{"class":231},[129,1458,1428],{"class":224},[129,1460,1431],{"class":231},[129,1462,1463],{"class":224},"]::Round($space.used ",[129,1465,1437],{"class":231},[129,1467,1440],{"class":227},[129,1469,1443],{"class":231},[129,1471,1446],{"class":227},[129,1473,887],{"class":224},[129,1475,1477,1480,1482,1484,1486,1489,1491,1493,1495,1497],{"class":220,"line":1476},92,[129,1478,1479],{"class":224},"                AvailGB        ",[129,1481,261],{"class":231},[129,1483,1428],{"class":224},[129,1485,1431],{"class":231},[129,1487,1488],{"class":224},"]::Round($space.available ",[129,1490,1437],{"class":231},[129,1492,1440],{"class":227},[129,1494,1443],{"class":231},[129,1496,1446],{"class":227},[129,1498,887],{"class":224},[129,1500,1502,1505,1507],{"class":220,"line":1501},93,[129,1503,1504],{"class":224},"                PercentUsed    ",[129,1506,261],{"class":231},[129,1508,1509],{"class":224}," $space.percent_used\n",[129,1511,1513,1516,1518,1521,1524],{"class":220,"line":1512},94,[129,1514,1515],{"class":224},"                NearlyFull     ",[129,1517,261],{"class":231},[129,1519,1520],{"class":224}," $space.percent_used ",[129,1522,1523],{"class":231},"-ge",[129,1525,1526],{"class":224}," $nearlyFullAt\n",[129,1528,1530,1533,1535],{"class":220,"line":1529},95,[129,1531,1532],{"class":224},"                SnapReservePct ",[129,1534,261],{"class":231},[129,1536,1537],{"class":224}," $space.snapshot.reserve_percent\n",[129,1539,1541,1544,1546,1549,1552,1555,1557,1560,1562],{"class":220,"line":1540},96,[129,1542,1543],{"class":224},"                Aggregate      ",[129,1545,261],{"class":231},[129,1547,1548],{"class":224}," ($volume.aggregates.name ",[129,1550,1551],{"class":231},"|",[129,1553,1554],{"class":227}," Sort-Object",[129,1556,232],{"class":231},[129,1558,1559],{"class":224},"Unique) ",[129,1561,1019],{"class":231},[129,1563,1022],{"class":238},[129,1565,1567],{"class":220,"line":1566},97,[129,1568,1569],{"class":224},"            }\n",[129,1571,1573],{"class":220,"line":1572},98,[129,1574,1296],{"class":224},[129,1576,1578],{"class":220,"line":1577},99,[129,1579,723],{"emptyLinePlaceholder":722},[129,1581,1583],{"class":220,"line":1582},100,[129,1584,1585],{"class":466},"        # ONTAP returns a relative next link while more records remain.\n",[129,1587,1589,1592,1594],{"class":220,"line":1588},101,[129,1590,1591],{"class":224},"        $nextPath ",[129,1593,261],{"class":231},[129,1595,1596],{"class":224}," $response._links.next.href\n",[129,1598,1600],{"class":220,"line":1599},102,[129,1601,1602],{"class":224},"    }\n",[129,1604,1606],{"class":220,"line":1605},103,[129,1607,930],{"class":224},[129,1609,1611],{"class":220,"line":1610},104,[129,1612,723],{"emptyLinePlaceholder":722},[129,1614,1616,1618,1620,1622,1625,1627,1629,1631,1634,1636],{"class":220,"line":1615},105,[129,1617,1130],{"class":224},[129,1619,261],{"class":231},[129,1621,408],{"class":231},[129,1623,1624],{"class":224},"($results ",[129,1626,1551],{"class":231},[129,1628,1554],{"class":227},[129,1630,232],{"class":231},[129,1632,1633],{"class":224},"Property PercentUsed ",[129,1635,314],{"class":231},[129,1637,1638],{"class":224},"Descending)\n",[129,1640,1642],{"class":220,"line":1641},106,[129,1643,723],{"emptyLinePlaceholder":722},[129,1645,1647,1649,1651,1654,1656,1659,1661,1664,1666,1669,1671,1674,1676,1679,1681,1684,1686,1689,1691,1694,1696,1699,1701,1704,1706],{"class":220,"line":1646},107,[129,1648,1130],{"class":224},[129,1650,1551],{"class":231},[129,1652,1653],{"class":227}," Format-Table",[129,1655,232],{"class":231},[129,1657,1658],{"class":224},"Property Cluster",[129,1660,242],{"class":231},[129,1662,1663],{"class":224}," Svm",[129,1665,242],{"class":231},[129,1667,1668],{"class":224}," Volume",[129,1670,242],{"class":231},[129,1672,1673],{"class":224}," Style",[129,1675,242],{"class":231},[129,1677,1678],{"class":224}," SizeGB",[129,1680,242],{"class":231},[129,1682,1683],{"class":224}," UsedGB",[129,1685,242],{"class":231},[129,1687,1688],{"class":224}," AvailGB",[129,1690,242],{"class":231},[129,1692,1693],{"class":224}," PercentUsed",[129,1695,242],{"class":231},[129,1697,1698],{"class":224}," NearlyFull",[129,1700,242],{"class":231},[129,1702,1703],{"class":224}," Aggregate ",[129,1705,314],{"class":231},[129,1707,1708],{"class":224},"AutoSize\n",[129,1710,1712],{"class":220,"line":1711},108,[129,1713,723],{"emptyLinePlaceholder":722},[129,1715,1717,1720],{"class":220,"line":1716},109,[129,1718,1719],{"class":227},"Write-Host",[129,1721,1722],{"class":238}," \"\"\n",[129,1724,1726,1728,1731,1733,1735,1738,1740,1743,1745,1748,1750,1752,1755,1757],{"class":220,"line":1725},110,[129,1727,1719],{"class":227},[129,1729,1730],{"class":238}," \"",[129,1732,1272],{"class":231},[129,1734,690],{"class":238},[129,1736,1737],{"class":224},"$results.Count",[129,1739,1282],{"class":238},[129,1741,1742],{"class":238}," volume(s) at or above ",[129,1744,1184],{"class":224},[129,1746,1747],{"class":238},"% used across ",[129,1749,1272],{"class":231},[129,1751,690],{"class":238},[129,1753,1754],{"class":224},"$Clusters.Count",[129,1756,1282],{"class":238},[129,1758,1759],{"class":238}," cluster(s).\"\n",[129,1761,1763],{"class":220,"line":1762},111,[129,1764,723],{"emptyLinePlaceholder":722},[129,1766,1768,1770],{"class":220,"line":1767},112,[129,1769,898],{"class":231},[129,1771,1772],{"class":224}," ($OutputPath) {\n",[129,1774,1776,1779,1781,1784,1786,1789,1791,1794,1796],{"class":220,"line":1775},113,[129,1777,1778],{"class":224},"    $results ",[129,1780,1551],{"class":231},[129,1782,1783],{"class":227}," Export-Csv",[129,1785,232],{"class":231},[129,1787,1788],{"class":224},"Path $OutputPath ",[129,1790,314],{"class":231},[129,1792,1793],{"class":224},"NoTypeInformation ",[129,1795,314],{"class":231},[129,1797,1798],{"class":224},"Encoding UTF8\n",[129,1800,1802,1804,1807,1810],{"class":220,"line":1801},114,[129,1803,1150],{"class":227},[129,1805,1806],{"class":238}," \"Results written to ",[129,1808,1809],{"class":224},"$OutputPath",[129,1811,1193],{"class":238},[129,1813,1815],{"class":220,"line":1814},115,[129,1816,930],{"class":224},[35,1818,1820],{"id":1819},"notes","Notes",[40,1822,1823,1853,1887,1905,1922,1932,1941,1951,1976],{},[43,1824,1825,1829,1830,1832,1833,1836,1837,1840,1841,1844,1845,1848,1849,1852],{},[1826,1827,1828],"strong",{},"What the numbers mean."," NetApp's REST reference defines ",[18,1831,62],{}," as the percentage of the volume size that is used, ",[18,1834,1835],{},"space.used"," as the virtual space used including volume reserves, before storage efficiency, and ",[18,1838,1839],{},"space.size"," as the total provisioned size. The reference also defines ",[18,1842,1843],{},"space.afs_total"," as the active file system size excluding snapshot reserve, so a volume with a large ",[18,1846,1847],{},"SnapReservePct"," has less room for data than ",[18,1850,1851],{},"SizeGB"," suggests; the column is in the CSV for that reason.",[43,1854,1855,1858,1859,1862,1863,21,1866,21,1869,21,1872,49,1875,1878,1879,1882,1883,1886],{},[1826,1856,1857],{},"Why filter on the cluster."," The ONTAP REST API accepts operators after the equals sign (",[18,1860,1861],{},"\u003Cfield>=>=\u003Cvalue>",", plus ",[18,1864,1865],{},"\u003C",[18,1867,1868],{},">",[18,1870,1871],{},"\u003C=",[18,1873,1874],{},"!",[18,1876,1877],{},"*"," wildcards), so ",[18,1880,1881],{},"space.percent_used=>=80"," makes each cluster return only the volumes that matter instead of every volume in the fleet. Requesting explicit ",[18,1884,1885],{},"fields"," also keeps the response small. By default a GET returns only identifying fields.",[43,1888,1889,1892,1893,1896,1897,1900,1901,1904],{},[1826,1890,1891],{},"Paging."," ONTAP returns up to 10,000 records per GET by default and stops early if it hits the 15-second ",[18,1894,1895],{},"return_timeout",". When more records remain, the response carries ",[18,1898,1899],{},"_links.next.href",", and the loop follows it. ",[18,1902,1903],{},"max_records=500"," keeps each page modest.",[43,1906,1907,1910,1911,1913,1914,1917,1918,1921],{},[1826,1908,1909],{},"FlexGroups."," ",[18,1912,28],{}," defaults to ",[18,1915,1916],{},"is_constituent=false",", so a FlexGroup is reported once, with the aggregates of its constituents in the ",[18,1919,1920],{},"Aggregate"," column, rather than as dozens of constituent rows.",[43,1923,1924,1927,1928,1931],{},[1826,1925,1926],{},"Offline and restricted volumes are skipped"," by the ",[18,1929,1930],{},"state=online"," filter. A volume that's offline for a migration shouldn't show up as a capacity problem.",[43,1933,1934,1937,1938,1940],{},[1826,1935,1936],{},"Certificates."," Clusters ship with self-signed certificates. ",[18,1939,52],{}," gets you running, but installing a CA-signed certificate on each cluster management LIF is the better fix, because the script sends a password with every request.",[43,1942,1943,1946,1947,1950],{},[1826,1944,1945],{},"Different logins per cluster."," The script uses one credential everywhere, which is why a dedicated read-only login created with the same name on each cluster is worth the minute it takes. If your clusters use different accounts, replace ",[18,1948,1949],{},"$Credential"," with a hashtable of credentials keyed by cluster name.",[43,1952,1953,1956,1957,1960,1961,1964,1965,1968,1969,1971,1972,1975],{},[1826,1954,1955],{},"Prefer the Toolkit?"," NetApp's PowerShell Toolkit is now the ",[18,1958,1959],{},"NetApp.ONTAP"," module on the PowerShell Gallery (",[18,1962,1963],{},"Install-Module NetApp.ONTAP",", Windows PowerShell 5.1 or PowerShell 7.3.4 and later). Its installation guide says that on ONTAP 9.10 or later a cmdlet uses the REST API by default when a REST equivalent exists, and falls back to ONTAPI otherwise; the ",[18,1966,1967],{},"-ONTAPI"," parameter forces ONTAPI. It also warns that some properties are missing when a cmdlet runs over REST, so property paths from old ",[18,1970,24],{}," scripts (",[18,1973,1974],{},"VolumeSpaceAttributes.PercentageSizeUsed"," and friends) are worth re-testing before you trust them.",[43,1977,1978,1979,1982],{},"This reports volume capacity, not aggregate capacity. A volume can look fine while its aggregate is nearly full, especially with thin provisioning; sweep ",[18,1980,1981],{},"\u002Fapi\u002Fstorage\u002Faggregates"," the same way if you want the full picture.",[35,1984,1986],{"id":1985},"source","Source",[40,1988,1989,1998,2005,2012,2019,2026,2033],{},[43,1990,1991],{},[1992,1993,1997],"a",{"href":1994,"rel":1995},"https:\u002F\u002Fdocs.netapp.com\u002Fus-en\u002Fontap-restapi\u002Fget-storage-volumes.html",[1996],"nofollow","ONTAP REST API reference: Retrieve volumes (GET \u002Fapi\u002Fstorage\u002Fvolumes)",[43,1999,2000],{},[1992,2001,2004],{"href":2002,"rel":2003},"https:\u002F\u002Fdocs.netapp.com\u002Fus-en\u002Fontap-automation\u002Frest\u002Finput_variables.html",[1996],"Input variables for an ONTAP REST API request (filters, fields, max_records, paging)",[43,2006,2007],{},[1992,2008,2011],{"href":2009,"rel":2010},"https:\u002F\u002Fdocs.netapp.com\u002Fus-en\u002Fontap-cli\u002Fvolume-modify.html",[1996],"ONTAP CLI: volume modify (nearly-full and full threshold defaults)",[43,2013,2014],{},[1992,2015,2018],{"href":2016,"rel":2017},"https:\u002F\u002Fdocs.netapp.com\u002Fus-en\u002Fontap-cli\u002Fsecurity-login-create.html",[1996],"ONTAP CLI: security login create",[43,2020,2021],{},[1992,2022,2025],{"href":2023,"rel":2024},"https:\u002F\u002Fkb.netapp.com\u002Fon-prem\u002Fontap\u002FDM\u002FREST-API\u002FREST_API_KBs\u002FDeferral_of_ONTAPI_ZAPI_End_of_Availability",[1996],"Deferral of ONTAPI (ZAPI) end of availability (NetApp KB)",[43,2027,2028],{},[1992,2029,2032],{"href":2030,"rel":2031},"https:\u002F\u002Fwww.powershellgallery.com\u002Fpackages\u002FNetApp.ONTAP",[1996],"NetApp.ONTAP on the PowerShell Gallery",[43,2034,2035],{},[1992,2036,2039],{"href":2037,"rel":2038},"https:\u002F\u002Fdocs.netapp.com\u002Fus-en\u002Fontap-automation\u002Fpstk\u002Flearn-about-pstk.html",[1996],"Learn about the NetApp ONTAP PowerShell Toolkit",[2041,2042,2043],"style",{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":85,"searchDepth":283,"depth":283,"links":2045},[2046,2047,2048,2049,2050,2051],{"id":37,"depth":283,"text":38},{"id":90,"depth":283,"text":91},{"id":206,"depth":283,"text":207},{"id":455,"depth":283,"text":456},{"id":1819,"depth":283,"text":1820},{"id":1985,"depth":283,"text":1986},"techcolumnist",[2054,2055,2056],"ps","scripts","dotps","2025-08-13T14:00:00Z","Sweep every ONTAP cluster you manage through the ONTAP REST API from PowerShell and report volumes above a capacity threshold, with a read-only login.","md",false,null,{},"\u002Fblog\u002F2025\u002F08\u002F13\u002Fpowershell-netapp-discover-every-volume-over-80-percent-capacity",{"title":6,"description":2058},[2052],"blog\u002F2025\u002F08\u002F13\u002Fpowershell-netapp-discover-every-volume-over-80-percent-capacity",[215,2068,2069,2070],"netapp","ontap","discovery","\u002F2025\u002F08\u002F13\u002Fpowershell-netapp-discover-every-volume-over-80-percent-capacity\u002F","WT2poV_3pD9N9HFj4o-hQHSOtHFMMiuP4WCfswphyng",{"title":2074,"description":2075,"date":2076,"url":2077,"categories":2078,"tags":2079,"image":2061,"readingTime":482,"canonical":2052,"sites":2081,"series":2061,"seriesOrder":2061},"PowerShell: ConnectWise – Sync Configurations from Discovery Scans","Reconcile a network discovery CSV against ConnectWise PSA configurations over the REST API: match by serial, MAC or name, patch what changed, create the rest.","2025-08-20T14:00:00Z","\u002F2025\u002F08\u002F20\u002Fpowershell-connectwise-sync-configuration-items-from-discovery-scans\u002F",[2054,2055],[215,2080,2070],"connectwise",[2052],{"title":2083,"description":2084,"date":2085,"url":2086,"categories":2087,"tags":2088,"image":2061,"readingTime":482,"canonical":2052,"sites":2090,"series":2061,"seriesOrder":2061},"PowerShell: Entra ID – Audit Conditional Access Policy Drift","A PowerShell script that snapshots Entra ID Conditional Access policies, reports setting-level drift against a baseline, and flags missing break-glass exclusions.","2025-08-06T14:00:00Z","\u002F2025\u002F08\u002F06\u002Fpowershell-entra-id-audit-conditional-access-policy-drift\u002F",[2054,2055],[215,2089],"entra-id",[2052],[2092,2101,2110],{"title":2093,"description":2094,"date":2095,"url":2096,"categories":2097,"tags":2098,"image":2061,"readingTime":221,"canonical":2052,"sites":2099,"series":2061,"seriesOrder":2061},"PowerShell: NetApp – Gather Volume Information","This is a simple script to gather volume information including dedupe schedule and autogrow settings.","2014-04-28T12:57:58Z","\u002F2014\u002F04\u002F28\u002Fpowershell-netapp-gather-volume-information\u002F",[2056,2054,2055],[2068,215,455],[2100,2052],"lasswell",{"title":2102,"description":2103,"date":2104,"url":2105,"categories":2106,"tags":2107,"image":2061,"readingTime":221,"canonical":2052,"sites":2109,"series":2061,"seriesOrder":2061},"PowerShell: NetApp – Gather Snapshot Details","Gathering snapshot statistics is a tedious task when looking at autosupports and cli output.","2014-01-21T16:15:38Z","\u002F2014\u002F01\u002F21\u002Fpowershell-gather-netapp-snapshot-details\u002F",[2056,2054,2055],[2068,215,2108],"snapshots",[2100,2052],{"title":2111,"description":2112,"date":2113,"url":2114,"categories":2115,"tags":2116,"image":2061,"readingTime":490,"canonical":2052,"sites":2119,"series":2061,"seriesOrder":2061},"PowerShell: Windows – Discover Local Admins Across Every Workstation","A script that reads the local Administrators group on every workstation by SID, survives orphaned-SID errors, and flags members outside an approved allowlist.","2025-10-08T14:00:00Z","\u002F2025\u002F10\u002F08\u002Fpowershell-windows-discover-local-admins-across-every-workstation\u002F",[2054,2055],[215,2117,2070,2118],"windows","active-directory",[2052],{"doc":2061,"posts":2121},[],1790052513114]