From 248ca71d4445ed7fad410247e1992c0344e07925 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 15:15:39 +0000 Subject: [PATCH 1/6] Initial plan From 42c2aea7dd2dec210ce153cf416ccce3c6e55ef3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 15:24:49 +0000 Subject: [PATCH 2/6] fix(docs): remove broken external URIs and replace placeholder links Agent-Logs-Url: https://github.com/microsoft/finops-toolkit/sessions/966e7305-52d7-4afc-a3d9-7f54676259c9 Co-authored-by: MSBrett <24294904+MSBrett@users.noreply.github.com> --- docs-mslearn/best-practices/storage.md | 3 +- docs-mslearn/framework/manage/onboarding.md | 4 +- .../framework/quantify/benchmarking.md | 4 +- docs-mslearn/toolkit/changelog.md | 4 +- docs-mslearn/toolkit/hubs/deploy.md | 4 +- docs-mslearn/toolkit/power-bi/setup.md | 4 +- src/powershell/Tests/Unit/DocsLinks.Tests.ps1 | 53 +++++++++++++++++++ 7 files changed, 64 insertions(+), 12 deletions(-) diff --git a/docs-mslearn/best-practices/storage.md b/docs-mslearn/best-practices/storage.md index 6e61ebd3f..cc15eaddd 100644 --- a/docs-mslearn/best-practices/storage.md +++ b/docs-mslearn/best-practices/storage.md @@ -3,7 +3,7 @@ title: FinOps best practices for Storage description: This article outlines proven FinOps practices for storage services, focusing on cost optimization, efficiency improvements, and resource insights. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-learning-resources @@ -76,7 +76,6 @@ Azure managed disks are block-level storage volumes that are managed by Azure an Related resources: -- [Managed disks product page](https://azure.microsoft.com/products/managed-disks) - [Managed disks pricing](https://azure.microsoft.com/pricing/details/managed-disks) - [Managed disks documentation](/azure/virtual-machines/managed-disks-overview) diff --git a/docs-mslearn/framework/manage/onboarding.md b/docs-mslearn/framework/manage/onboarding.md index 04a301c8a..7c17b61a5 100644 --- a/docs-mslearn/framework/manage/onboarding.md +++ b/docs-mslearn/framework/manage/onboarding.md @@ -3,7 +3,7 @@ title: Onboarding workloads description: This article helps you understand the onboarding workloads capability within the FinOps Framework and how to implement that in the Microsoft Cloud. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-learning-resources @@ -73,7 +73,7 @@ Document your onboarding process. Using existing tools and processes where avail ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see the [Onboarding workloads capability](https://www.finops.org/framework/capabilities/onboarding-workloads/) article in the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see the Onboarding workloads capability article in the FinOps Framework documentation. You can also find related videos on the FinOps Foundation YouTube channel: diff --git a/docs-mslearn/framework/quantify/benchmarking.md b/docs-mslearn/framework/quantify/benchmarking.md index 4db88a05f..86bc4c837 100644 --- a/docs-mslearn/framework/quantify/benchmarking.md +++ b/docs-mslearn/framework/quantify/benchmarking.md @@ -3,7 +3,7 @@ title: FinOps benchmarking description: This article helps you understand the benchmarking capability within the FinOps Framework and how to implement that in the Microsoft Cloud. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-learning-resources @@ -58,7 +58,7 @@ At this point, you implemented best practices based on cross-company benchmarks ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see to the [benchmarking](https://www.finops.org/framework/capabilities/benchmarking) article in the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see the benchmarking article in the FinOps Framework documentation.
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index dc22e673f..ae8c96a9e 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -3,7 +3,7 @@ title: FinOps toolkit changelog description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more. author: MSBrett ms.author: brettwil -ms.date: 04/29/2026 +ms.date: 05/12/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit @@ -1058,7 +1058,7 @@ _**Breaking change**_ - Added param to disable external access to Azure Data Lake and Azure Data Explorer. - Added param to specify subnet range of virtual network - minimum size = /26 - Support for storage account infrastructure encryption. - - Published a [schema file](https://aka.ms/finops/hubs/settings-schema) for the hub settings.json file. + - Published a schema file for the hub settings.json file. - **Changed** - Changed dataset names in the ingestion container to facilitate Azure Data Explorer ingestion. > [!IMPORTANT] diff --git a/docs-mslearn/toolkit/hubs/deploy.md b/docs-mslearn/toolkit/hubs/deploy.md index 4c7760ef0..eaae43be3 100644 --- a/docs-mslearn/toolkit/hubs/deploy.md +++ b/docs-mslearn/toolkit/hubs/deploy.md @@ -3,7 +3,7 @@ title: How to create and update FinOps hubs description: This tutorial helps you create a new or update an existing FinOps hubs instance in Azure or Microsoft Fabric. author: flanakin ms.author: micflan -ms.date: 04/21/2026 +ms.date: 05/12/2026 ms.topic: tutorial ms.service: finops ms.subservice: finops-toolkit @@ -560,7 +560,7 @@ For more information, see [Configure Data Explorer dashboards](configure-dashboa - **Azure Data Explorer (Kusto)** – Use an account that has at least viewer access to the Hub and Ingestion databases. - **Azure Resource Graph** – Use an account that has direct access to any subscriptions you would like to report on. - **(your storage account)** – Use a SAS token or an account that has Storage Blob Data Reader or greater access. - - **...** – Anonymous access. This URL is used for reservation size flexibility data. + - **** – Anonymous access. This URL is used for reservation size flexibility data. - **...** – Anonymous access. This URL is used for FinOps toolkit open data files. For more information, see [Set up Power BI reports](../power-bi/setup.md). diff --git a/docs-mslearn/toolkit/power-bi/setup.md b/docs-mslearn/toolkit/power-bi/setup.md index 6aeae6653..7121162f8 100644 --- a/docs-mslearn/toolkit/power-bi/setup.md +++ b/docs-mslearn/toolkit/power-bi/setup.md @@ -3,7 +3,7 @@ title: Set up Power BI reports description: Learn how to set up Power BI FinOps reports using the FinOps toolkit, customize visuals, and connect to your cost data for detailed analysis. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: how-to ms.service: finops ms.subservice: finops-toolkit @@ -115,7 +115,7 @@ The FinOps toolkit Power BI reports include preconfigured visuals, but aren't co - **Azure Data Explorer (Kusto)** – Use an account that has at least viewer access to the Hub database. - **Azure Resource Graph** – Use an account that has direct access to any subscriptions you would like to report on. - **(your storage account)** – Use a SAS token or an account that has Storage Blob Data Reader or greater access. - - **...** – Anonymous access. This URL is used for reservation size flexibility data. + - **** – Anonymous access. This URL is used for reservation size flexibility data. - **...** – Anonymous access. This URL is used for FinOps toolkit open data files. If you run into any issues syncing your data, see [Troubleshooting Power BI reports](../help/troubleshooting.md). diff --git a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 index 5415919a6..eb3b085b9 100644 --- a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 +++ b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 @@ -102,6 +102,45 @@ BeforeDiscovery { $mslearnFiles = Get-MarkdownFiles $mslearnRoot $mslearnRoot $mslearnInternalLinks = Get-InternalMdLinks $mslearnFiles $mslearnUrls = Get-MarkdownUrls $mslearnFiles + $knownBrokenExternalUrls = @( + 'https://azure.microsoft.com/products/managed-disks', + 'https://www.finops.org/framework/capabilities/onboarding-workloads/', + 'https://www.finops.org/framework/capabilities/benchmarking', + 'https://aka.ms/finops/hubs/settings-schema' + ) + $knownBrokenExternalUrlMatches = @() + foreach ($file in $mslearnFiles) + { + $cleanContent = Remove-HtmlComments $file.Content + foreach ($url in $knownBrokenExternalUrls) + { + $matches = [regex]::Matches($cleanContent, [regex]::Escape($url)) + foreach ($match in $matches) + { + $knownBrokenExternalUrlMatches += @{ + SourceFile = $file.FullName + SourceRel = $file.RelativePath + Url = $url + LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count + } + } + } + } + $incompleteExternalUrlMatches = @() + foreach ($file in $mslearnFiles) + { + $cleanContent = Remove-HtmlComments $file.Content + $matches = [regex]::Matches($cleanContent, 'https://ccmstorageprod(?!\.)') + foreach ($match in $matches) + { + $incompleteExternalUrlMatches += @{ + SourceFile = $file.FullName + SourceRel = $file.RelativePath + Url = $match.Value + LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count + } + } + } #endregion #region docs (Jekyll site) @@ -259,6 +298,20 @@ Describe 'Documentation links' { } } + Context 'docs-mslearn: No known broken external URLs' { + + It 'Should not contain known broken external URLs' { + $knownBrokenExternalUrlMatches | Should -BeNullOrEmpty -Because 'known broken external URLs should not appear in docs-mslearn content' + } + } + + Context 'docs-mslearn: No incomplete placeholder external URLs' { + + It 'Should not contain incomplete placeholder URLs' { + $incompleteExternalUrlMatches | Should -BeNullOrEmpty -Because 'incomplete placeholder URLs should not appear in docs-mslearn content' + } + } + #endregion #region docs (Jekyll site) From ea2c178f38c6dd527862432567eadad4e9bbeae9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 15:30:17 +0000 Subject: [PATCH 3/6] test(docs): strengthen docs link regression checks Agent-Logs-Url: https://github.com/microsoft/finops-toolkit/sessions/966e7305-52d7-4afc-a3d9-7f54676259c9 Co-authored-by: MSBrett <24294904+MSBrett@users.noreply.github.com> --- docs-mslearn/framework/manage/onboarding.md | 2 +- docs-mslearn/framework/quantify/benchmarking.md | 2 +- docs-mslearn/toolkit/changelog.md | 2 +- src/powershell/Tests/Unit/DocsLinks.Tests.ps1 | 17 ++++++++--------- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/docs-mslearn/framework/manage/onboarding.md b/docs-mslearn/framework/manage/onboarding.md index 7c17b61a5..4220594b0 100644 --- a/docs-mslearn/framework/manage/onboarding.md +++ b/docs-mslearn/framework/manage/onboarding.md @@ -73,7 +73,7 @@ Document your onboarding process. Using existing tools and processes where avail ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see the Onboarding workloads capability article in the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the FinOps Framework documentation. You can also find related videos on the FinOps Foundation YouTube channel: diff --git a/docs-mslearn/framework/quantify/benchmarking.md b/docs-mslearn/framework/quantify/benchmarking.md index 86bc4c837..812780404 100644 --- a/docs-mslearn/framework/quantify/benchmarking.md +++ b/docs-mslearn/framework/quantify/benchmarking.md @@ -58,7 +58,7 @@ At this point, you implemented best practices based on cross-company benchmarks ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see the benchmarking article in the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the FinOps Framework documentation.
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index ae8c96a9e..76fe1b70f 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -1058,7 +1058,7 @@ _**Breaking change**_ - Added param to disable external access to Azure Data Lake and Azure Data Explorer. - Added param to specify subnet range of virtual network - minimum size = /26 - Support for storage account infrastructure encryption. - - Published a schema file for the hub settings.json file. + - Published a schema file for the hub settings.json file in this release. - **Changed** - Changed dataset names in the ingestion container to facilitate Azure Data Explorer ingestion. > [!IMPORTANT] diff --git a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 index eb3b085b9..df2c882c0 100644 --- a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 +++ b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 @@ -108,14 +108,17 @@ BeforeDiscovery { 'https://www.finops.org/framework/capabilities/benchmarking', 'https://aka.ms/finops/hubs/settings-schema' ) + # Match incomplete ccmstorageprod URLs (no domain suffix), while allowing valid hosts like ccmstorageprod.blob.core.windows.net. + $incompletePlaceholderUrlPattern = 'https://ccmstorageprod(?!\.)' $knownBrokenExternalUrlMatches = @() + $incompleteExternalUrlMatches = @() foreach ($file in $mslearnFiles) { $cleanContent = Remove-HtmlComments $file.Content foreach ($url in $knownBrokenExternalUrls) { - $matches = [regex]::Matches($cleanContent, [regex]::Escape($url)) - foreach ($match in $matches) + $urlMatches = [regex]::Matches($cleanContent, [regex]::Escape($url)) + foreach ($match in $urlMatches) { $knownBrokenExternalUrlMatches += @{ SourceFile = $file.FullName @@ -125,13 +128,9 @@ BeforeDiscovery { } } } - } - $incompleteExternalUrlMatches = @() - foreach ($file in $mslearnFiles) - { - $cleanContent = Remove-HtmlComments $file.Content - $matches = [regex]::Matches($cleanContent, 'https://ccmstorageprod(?!\.)') - foreach ($match in $matches) + + $placeholderMatches = [regex]::Matches($cleanContent, $incompletePlaceholderUrlPattern) + foreach ($match in $placeholderMatches) { $incompleteExternalUrlMatches += @{ SourceFile = $file.FullName From bf4fa18826fadabb61eced4be84de2d068a27aeb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 15:31:54 +0000 Subject: [PATCH 4/6] docs: point FinOps capability refs to framework home Agent-Logs-Url: https://github.com/microsoft/finops-toolkit/sessions/966e7305-52d7-4afc-a3d9-7f54676259c9 Co-authored-by: MSBrett <24294904+MSBrett@users.noreply.github.com> --- docs-mslearn/framework/manage/onboarding.md | 2 +- docs-mslearn/framework/quantify/benchmarking.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-mslearn/framework/manage/onboarding.md b/docs-mslearn/framework/manage/onboarding.md index 4220594b0..e8a8800f1 100644 --- a/docs-mslearn/framework/manage/onboarding.md +++ b/docs-mslearn/framework/manage/onboarding.md @@ -73,7 +73,7 @@ Document your onboarding process. Using existing tools and processes where avail ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the [FinOps Framework documentation](https://www.finops.org/framework/). You can also find related videos on the FinOps Foundation YouTube channel: diff --git a/docs-mslearn/framework/quantify/benchmarking.md b/docs-mslearn/framework/quantify/benchmarking.md index 812780404..5f18652ac 100644 --- a/docs-mslearn/framework/quantify/benchmarking.md +++ b/docs-mslearn/framework/quantify/benchmarking.md @@ -58,7 +58,7 @@ At this point, you implemented best practices based on cross-company benchmarks ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the [FinOps Framework documentation](https://www.finops.org/framework/).
From 0b9f458bdf688ed7c54753bd569c974e535498e9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 16:25:49 +0000 Subject: [PATCH 5/6] test(docs): fix vacuous broken-link guard assertions Agent-Logs-Url: https://github.com/microsoft/finops-toolkit/sessions/231bd2bf-9bcb-4b1a-9ec7-958f98fbd94e Co-authored-by: MSBrett <24294904+MSBrett@users.noreply.github.com> --- src/powershell/Tests/Unit/DocsLinks.Tests.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 index df2c882c0..774a409d3 100644 --- a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 +++ b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 @@ -299,15 +299,15 @@ Describe 'Documentation links' { Context 'docs-mslearn: No known broken external URLs' { - It 'Should not contain known broken external URLs' { - $knownBrokenExternalUrlMatches | Should -BeNullOrEmpty -Because 'known broken external URLs should not appear in docs-mslearn content' + It 'Should not contain known broken external URL: : ' -ForEach $knownBrokenExternalUrlMatches { + $Url | Should -Not -Match '^(https://azure.microsoft.com/products/managed-disks|https://www.finops.org/framework/capabilities/onboarding-workloads/|https://www.finops.org/framework/capabilities/benchmarking|https://aka.ms/finops/hubs/settings-schema)$' -Because "known broken external URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" } } Context 'docs-mslearn: No incomplete placeholder external URLs' { - It 'Should not contain incomplete placeholder URLs' { - $incompleteExternalUrlMatches | Should -BeNullOrEmpty -Because 'incomplete placeholder URLs should not appear in docs-mslearn content' + It 'Should not contain incomplete placeholder URL: : ' -ForEach $incompleteExternalUrlMatches { + $Url | Should -Not -Match '^https://ccmstorageprod(?!\.)' -Because "incomplete placeholder URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" } } From 645c9ff0923fafd16edc8664b512911fe89feaa7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 16:26:57 +0000 Subject: [PATCH 6/6] test(docs): execute broken-link guards via foreach cases Agent-Logs-Url: https://github.com/microsoft/finops-toolkit/sessions/231bd2bf-9bcb-4b1a-9ec7-958f98fbd94e Co-authored-by: MSBrett <24294904+MSBrett@users.noreply.github.com> --- src/powershell/Tests/Unit/DocsLinks.Tests.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 index 774a409d3..5d92fa414 100644 --- a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 +++ b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 @@ -124,6 +124,7 @@ BeforeDiscovery { SourceFile = $file.FullName SourceRel = $file.RelativePath Url = $url + Pattern = "^$([regex]::Escape($url))$" LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count } } @@ -136,6 +137,7 @@ BeforeDiscovery { SourceFile = $file.FullName SourceRel = $file.RelativePath Url = $match.Value + Pattern = $incompletePlaceholderUrlPattern LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count } } @@ -300,14 +302,14 @@ Describe 'Documentation links' { Context 'docs-mslearn: No known broken external URLs' { It 'Should not contain known broken external URL: : ' -ForEach $knownBrokenExternalUrlMatches { - $Url | Should -Not -Match '^(https://azure.microsoft.com/products/managed-disks|https://www.finops.org/framework/capabilities/onboarding-workloads/|https://www.finops.org/framework/capabilities/benchmarking|https://aka.ms/finops/hubs/settings-schema)$' -Because "known broken external URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" + $Url | Should -Not -Match $Pattern -Because "known broken external URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" } } Context 'docs-mslearn: No incomplete placeholder external URLs' { It 'Should not contain incomplete placeholder URL: : ' -ForEach $incompleteExternalUrlMatches { - $Url | Should -Not -Match '^https://ccmstorageprod(?!\.)' -Because "incomplete placeholder URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" + $Url | Should -Not -Match $Pattern -Because "incomplete placeholder URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" } }