# Define file paths
$jsonPath = "D:\Azure_IP\ServiceTags_Public_20251006.json"
$idCsvPath = "D:\Azure_IP\ids.csv"
$outputFolder = "D:\Azure_IP\Subnets"
# Create output folder if missing
if (!(Test-Path -Path $outputFolder)) {
New-Item -ItemType Directory -Path $outputFolder | Out-Null
}
# Load and parse JSON
try {
$jsonRaw = Get-Content -Raw -Path $jsonPath -ErrorAction Stop
$json = $jsonRaw | ConvertFrom-Json -ErrorAction Stop
} catch {
Write-Error "Failed to read/parse JSON at '$jsonPath'. $_"
exit 1
}
# Ensure values array exists
if (-not $json.PSObject.Properties.Name -contains 'values' -or -not $json.values) {
Write-Error "JSON does not contain a 'values' array."
exit 1
}
$values = $json.values
# Read IDs from CSV or plain text file (supports:
# - CSV with header 'Id'
# - CSV with another header (first column used)
# - Plain text file with one ID per line)
$ids = @()
try {
$csv = Import-Csv -Path $idCsvPath -ErrorAction Stop
if ($csv.Count -gt 0) {
$firstProps = $csv[0].PSObject.Properties | ForEach-Object { $_.Name }
if ($firstProps -contains 'Id') {
$ids = $csv | ForEach-Object { $_.Id }
} else {
# take the first property/column if Id header is not present
$firstProp = $firstProps[0]
$ids = $csv | ForEach-Object { $_.$firstProp }
}
} else {
# empty CSV, fall back to Get-Content
$ids = Get-Content -Path $idCsvPath | Where-Object { $_ -and $_.Trim() -ne "" }
}
} catch {
# Import-Csv failed -> try reading as plain text lines
Write-Verbose "Import-Csv failed, trying Get-Content: $_"
$ids = Get-Content -Path $idCsvPath -ErrorAction Stop | Where-Object { $_ -and $_.Trim() -ne "" }
}
if ($ids.Count -eq 0) {
Write-Warning "No IDs found in '$idCsvPath'. Nothing to process."
exit 0
}
# Process each ID
foreach ($rawId in $ids) {
$id = [string]$rawId
$id = $id.Trim()
if ([string]::IsNullOrWhiteSpace($id)) { continue }
# Find matching value object by id (case-insensitive)
$match = $values | Where-Object {
$objId = ""
if ($_.PSObject.Properties.Name -contains 'id') { $objId = $_.id }
elseif ($_.PSObject.Properties.Name -contains 'Id') { $objId = $_.Id }
else { $objId = $_ | Select-Object -ExpandProperty id -ErrorAction SilentlyContinue }
return ($objId -as [string]) -ne $null -and ($objId -ieq $id)
}
if (-not $match) {
Write-Warning "No matching entry found in JSON for Id: '$id'"
continue
}
# Extract addressPrefixes - safe navigation
$prefixes = $null
try {
$prefixes = $match.properties.addressPrefixes
} catch {
$prefixes = $null
}
# Prepare safe filename (replace invalid filename chars)
$safeName = $id -replace '[\\/:*?"<>|]', '_'
$outFile = Join-Path $outputFolder ("{0}.csv" -f $safeName)
if ($null -eq $prefixes) {
# Write empty CSV with header only
@([PSCustomObject]@{ addressPrefix = "" }) |
Select-Object -First 0 | # no rows
Export-Csv -Path $outFile -NoTypeInformation -Encoding UTF8 -Force
Write-Host "No addressPrefixes for '$id' — created empty CSV with header: $outFile"
continue
}
# Ensure prefixes is an array/list (if single string, convert to array)
if ($prefixes -is [string]) {
$prefixes = ,$prefixes
}
# Convert to objects and export
$rows = $prefixes | ForEach-Object {
[PSCustomObject]@{
addressPrefix = $_
}
}
$rows | Export-Csv -Path $outFile -NoTypeInformation -Encoding UTF8 -Force
Write-Host "Exported $($rows.Count) prefixes for '$id' → $outFile"
}
Write-Host "Done."