Scripts/Confirm-PolicyDefinitionIsValid.ps1 (56 lines of code) (raw):
<#
.SYNOPSIS
Validates Azure Policy definitions.
.DESCRIPTION
Ingests complete Policy definition file
Checks required elements
.PARAMETER fileName
Input file name. Default is azurepolicy.json.
.PARAMETER category
Category of the Policy definition. Default is empty indicating to preserve the existing category in metadata.
.EXAMPLE
Confirm-PolicyDefinitionIsValid.ps1 -fileName azurepolicy.json -category "Custom"
.EXAMPLE
Confirm-PolicyDefinitionIsValid.ps1 -fileName azurepolicy.json
#>
[CmdletBinding()]
param(
[parameter(Mandatory = $true, Position = 0)]
[string] $fileName,
[parameter(Mandatory = $false)]
[string] $category = ""
)
. "$($PSScriptRoot)/Format-PolicyDefinition.ps1"
$files = Get-ChildItem -Path $fileName -ErrorAction SilentlyContinue
if ($files.Count -eq 0) {
throw "'$fileName' not found."
}
elseif ($files.Count -gt 1) {
throw "Multiple files ($($files.Count)) found. Instead of '$fileName', specify a file, not a directory or wild card."
}
$file = $files[0]
$content = Get-Content $file.FullName -Raw
$newDefinition, $warningMessages, $errorMessages, $path = Format-PolicyDefinition $content -category $category
if ($errorMessages.Count -gt 0) {
$messagesString = "'$($file.FullName)' failed validation:"
$messagesString += "`n Hard errors:`n "
$messagesString += (($errorMessages.ToArray()) -join "`n ")
if ($warningMessages.Count -gt 0) {
$messagesString += "`n Auto-fixes available:`n "
$messagesString += (($warningMessages.ToArray()) -join "`n ")
}
Write-Host $messagesString -ForegroundColor Red
exit 2 # Errors found
}
else {
if ($warningMessages.Count -gt 0) {
$messagesString = "'$($file.FullName)' has auto-fix warnings:`n "
$messagesString += (($warningMessages.ToArray()) -join "`n ")
Write-Host $messagesString -ForegroundColor Yellow
exit 3 # Warnings found
}
else {
Write-Host "'$($file.FullName)' is valid." -ForegroundColor Blue
exit 0 # No errors or warnings foundS
}
}