Param( [Parameter(Mandatory = $true)] [ValidateScript({ Test-Path $_ -PathType Container })] [string]$RootPath, [Parameter(Mandatory = $true)] [ValidatePattern('^https?://')] [string]$BaseUrl, [string[]]$Extensions = @('.html', '.htm', '.php', '.aspx', '.asp', '.jsp') ) # Normalize base URL (remove trailing slash) if ($BaseUrl.EndsWith('/')) { $BaseUrl = $BaseUrl.TrimEnd('/') } $files = Get-ChildItem -Path $RootPath -Recurse -File | Where-Object { $Extensions -contains $_.Extension.ToLower() } $sitemapPath = Join-Path -Path $RootPath -ChildPath 'sitemap.xml' $settings = New-Object System.Xml.XmlWriterSettings $settings.Indent = $true $settings.IndentChars = " " $settings.Encoding = [System.Text.UTF8Encoding]::new($false) $writer = [System.Xml.XmlWriter]::Create($sitemapPath, $settings) try { $writer.WriteStartDocument() $writer.WriteStartElement('urlset', 'http://www.sitemaps.org/schemas/sitemap/0.9') foreach ($file in $files) { # Compute relative URL $relativePath = $file.FullName.Substring($RootPath.Length).TrimStart('\', '/') $relativePath = $relativePath -replace '\\', '/' $url = "$BaseUrl/$relativePath" # Last modification date in UTC ISO 8601 format $lastMod = $file.LastWriteTimeUtc.ToString('yyyy-MM-ddTHH:mm:ssZ') $writer.WriteStartElement('url') $writer.WriteElementString('loc', $url) $writer.WriteElementString('lastmod', $lastMod) $writer.WriteEndElement() # url } $writer.WriteEndElement() # urlset $writer.WriteEndDocument() } finally { $writer.Close() $writer.Dispose() } Write-Host "Sitemap generated at: $sitemapPath" -ForegroundColor Green