Skip to content

v2.0.0 release#144

Merged
tpcarman merged 48 commits into
masterfrom
dev
May 15, 2026
Merged

v2.0.0 release#144
tpcarman merged 48 commits into
masterfrom
dev

Conversation

@tpcarman
Copy link
Copy Markdown
Contributor

Description

This is a major version release representing a complete module rewrite with a modular architecture, internationalization support, numerous new report sections, and several bug fixes.

Related Issue

  • #30 — vCenter resource & inventory summary tables
  • #88 — vCenter Server Certificate section reporting incorrect certificate
  • #96Filter.Cluster configuration option
  • #101 — TPM attestation state and host encryption settings
  • #105, #111, #127 — PCI Drivers & Firmware section not reporting on vSphere 8
  • #113 — Null disk group crash in OSA vSAN clusters
  • #122ShowRoles and ShowAlarms options
  • #123 — Licensing errors on vCenter 8.0.2
  • #126 — I/O Device Identifiers subsection for HCL validation

Motivation and Context

v2.0.0 is a ground-up rewrite of the module designed to improve long-term maintainability, fix a number of long-standing bugs across vSphere 7 and 8 environments, and significantly expand report coverage with new sections that have been frequently requested by the community.

How Has This Been Tested?

  • Tested against vCenter Server 7.0 and 8.0 environments
  • Pester test suite (AsBuiltReport.VMware.vSphere.Tests.ps1, LocalizationData.Tests.ps1) executed via Invoke-Tests.ps1
  • GitHub Actions Pester workflow validates all localization data files and module structure on each commit

Screenshots (if appropriate):

N/A

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Breaking changes: Windows PowerShell 5.1 (Desktop edition) support has been dropped. Minimum
PowerShell version is now 7.4 (Core edition only). Requires AsBuiltReport.Core >= 1.6.2.
Module source structure has changed to a nested folder layout.

Checklist:

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have read the contributing documentation.

tpcarman and others added 30 commits August 28, 2025 17:37
## [2.0.0] - Unreleased

### Added

- Modular architecture: each report section is now a dedicated private function (`Get-AbrVSphere*`)
- Internationalization (i18n) support via `Language/` `.psd1` files (`en-US`, `en-GB`, `es-ES`, `fr-FR`, `de-DE`)
- Pester test suite (`AsBuiltReport.VMware.vSphere.Tests.ps1`, `LocalizationData.Tests.ps1`, `Invoke-Tests.ps1`)
- GitHub Actions Pester workflow (`.github/workflows/Pester.yml`)

### Changed

- Complete module rewrite for improved maintainability and extensibility
- Module source now uses nested folder structure (`AsBuiltReport.VMware.vSphere/`)
- Requires `AsBuiltReport.Core` >= 1.6.2
- `CompatiblePSEditions` now explicitly declares `Desktop` and `Core` support
Added permissions for contents, issues, pull-requests, and id-token.
Convert VMware managed objects stored as PSCustomObject property values
to plain strings (.Name or [string] cast) before passing to PScribo's
Table cmdlet, preventing .NET's Dictionary<K,V>.Add() from throwing a
duplicate-key exception when formatting TEXT output.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…123)

- Guard against null LicenseAssignmentManager MoRef (Bug B) to prevent
  'Index operation failed; the array index evaluated to null' crash
- Replace broken reflection-based QueryAssignedLicenses call with direct
  method call and fix $_ out-of-scope bug in vCenter license path (Bug A)
- Guard null/empty LicenseKey before masking in both VMHost and vCenter
  paths to avoid errors when no license is assigned (Bug C)
- Wrap Get-License calls in try/catch in Get-AbrVSphereVMHostHardware
  and Get-AbrVSpherevCenter to prevent fatal propagation (Bug D)
- Add LicenseError locale key to all five language files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a new NOTOCHeading5 subsection under each host's Hardware section
displaying VID, DID, SVID, and SSID in lowercase hex for HCL validation.

Uses PCI address mapping via Get-VMHostNetworkAdapter/Get-VMHostHba instead
of VMkernelName (unpopulated on ESXi 8). Guards null PCI keys to handle
software HBAs (iSCSI, software NVMe) without physical PCI addresses.

Adds 7 new localisation keys to all 5 locale files (en-US, en-GB, es-ES,
fr-FR, de-DE).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Guard Get-VsanDisk against a null VsanDiskGroup parameter, which occurs
when an OSA cluster has no claimed disks. The cluster detail table now
renders correctly; Disk Groups and Disks subsections are skipped when
no disk groups exist.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace vpxd.certmgmt.certs.cn.* advanced settings reads with a direct
TLS connection to port 443, returning the actual deployed certificate.

Use SslStream with an explicit-parameter RemoteCertificateValidationCallback
for reliable PS 5.1 and 7.x compatibility. Certificate status (VALID /
EXPIRING_SOON / EXPIRING / EXPIRED) is computed from NotAfter vs the
existing soft/hard threshold advanced settings.

Fields removed: Country, Email, Locality, State, Organization,
OrganizationUnit, Validity (VMCA template settings — not the live cert).
Fields added: Subject, Issuer, ValidFrom, ValidTo, Thumbprint, CertStatus.

All five locale files (en-US, en-GB, es-ES, fr-FR, de-DE) updated.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CompatiblePSEditions: Core only (Desktop removed)
- PowerShellVersion minimum set to 7.4 per VMware PowerCLI requirement
- PSEdition_Desktop tag removed from manifest
- Pester: replace separate Desktop/Core assertions with a single
  'Core only' check that also asserts Desktop is absent
- README: add Broadcom PowerCLI Installation Guide link and PS 7.4
  minimum requirement note
- CHANGELOG: document as Changed (min version) and Removed (PS 5.1)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move from .github/workflows/Dependabot.yml to .github/dependabot.yml.
GitHub was parsing it as an Actions workflow (requiring on:/jobs:)
instead of a Dependabot configuration file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add ESXi Host TPM & Encryption section to Get-AbrVSphereVMHostSecurity
  - Reports TPM attestation status via ExtensionData.Config.TpmAttestation
  - Reports encryption mode, RequireSecureBoot, and RequireSignedVIBs via esxcli
  - Recovery keys sub-table gated behind ShowEncryptionKeys option (InfoLevel >= 3)
  - TpmAttestation healthcheck warns when TPM present but not attested
- Add ShowEncryptionKeys option (default: false) to report JSON config
- Add TpmAttestation healthcheck (default: true) to report JSON config
- Add i18n keys to all 5 locale files (en-US, en-GB, es-ES, fr-FR, de-DE)
- Update README.md options and healthcheck tables

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sub-functions (ClusterHA, ClusterProactiveHA, ClusterDRS, VMHostHardware,
VMHostSystem, VMHostStorage, VMHostNetwork, VMHostSecurity) all share their
parent's InfoLevel setting (Cluster or VMHost) rather than having their own
dedicated JSON config key. Emitting "VMHost Network InfoLevel set to 3"
implied a separate configurable setting that doesn't exist.

InfoLevel messages are retained only in the 10 top-level functions that
correspond directly to InfoLevel keys in the report JSON config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On ESXi 8.x, VMkernelName is no longer populated in the output of
esxcli hardware.pci.list, causing the Where-Object filter in
Get-PciDeviceDetail to return no devices and the section to be silently
suppressed.

Fix by adding an optional -VMHost parameter and building a PCI address to
VMkernel name lookup map via the PowerCLI API (same pattern already used
by the PCI Devices and I/O Device Identifiers sections). The VMkernelName
field is used directly when present (ESXi < 8), with the address map as
fallback (ESXi 8+).

Also fix a secondary bug where $firmwareVersion and $driverVib were not
reset between loop iterations, causing values from a previous device to
bleed into the next device's output.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…IOC, VM Swap Location, and DSCluster SDRS improvements

- Add Tags reporting to VMHost, Datastore, DSCluster, ResourcePool, Network (VDS), and VM sections
- Add ESXi Host Certificate section (subject, issuer, validity dates, SHA-256 thumbprint)
- Add VM Swap File Location section using Get-View with camelCase property paths
- Expand Syslog section to include log directory, rotation count, and log size via esxcli
- Add vSAN Services section (Performance, File, iSCSI, Deduplication, Encryption, Health) for both OSA and ESA code paths
- Add VDS LACP section using ExtensionData instead of unavailable Get-VDLacpPolicy cmdlet
- Add VDS NetFlow section and NIOC Resource Pools section
- Fix NIOC pool limit integer comparison (was string '-1', now integer -1)
- Add Cluster LCM and Cluster VUM as separate sub-section functions
- Fix DSCluster SDRS rules, space/IO load balance config reporting
- Update all 5 locale files (en-US, en-GB, es-ES, fr-FR, de-DE) with new keys

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Backup Schedule table shows status (Activated/Deactivated), recurrence
  with appliance timezone, backup location, data components (mapped from
  API part names to human-readable labels), and retention count
- Backup Job History table shows 10 most recent jobs via
  GET /api/appliance/recovery/backup/job/details; columns: location,
  type, status, data transferred, duration (HH:MM:SS), end time
- Healthcheck: Warning if schedule deactivated, Critical if job failed
- Requires vSphere 7.0+ REST API; renders informational paragraph on
  older versions
- Add Backup healthcheck key to AsBuiltReport.VMware.vSphere.json
- Update all 5 locale files with new backup keys

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…to vCenter report

- Add vCenter Server Backup Settings section (InfoLevel 3+) with Backup Schedule and Backup Job History subsections via REST API
- Add Certificate healthcheck (Critical: EXPIRED/EXPIRING, Warning: EXPIRING_SOON)
- Add Backup healthcheck (Warning: schedule deactivated, Critical: job failed)
- Update report JSON with Certificate and Backup healthcheck defaults
- Update README vCenter healthcheck table with Certificate and Backup rows
- Update CHANGELOG with Certificate healthcheck entry
- Add pre-release support to Release.yml (manifest Prerelease string, conditional tweet/bsky jobs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…howTags options

- Add vCenter resource/inventory summary tables at InfoLevel 1+ (#30)
- Add Content Libraries section to vCenter report (InfoLevel 3+)
- Add ShowRoles, ShowAlarms (#122), and ShowTags options
- Gate tag reporting across all sections with ShowTags option
- Use Convert-DataSize for memory/storage and library item sizes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Change dorny/test-reporter from java-junit to dotnet-nunit to match
the NUnitXml format generated by Invoke-Tests.ps1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
dorny/test-reporter@v1 only supports java-junit (JUnit XML) format;
switch Invoke-Tests.ps1 output from NUnitXml to JUnitXml to match

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add matrix strategy across windows-latest, ubuntu-latest, macos-latest
- Replace dorny/test-reporter with actions/upload-artifact (avoids XML
  format parsing issues; test results stored as downloadable artifacts)
- Add Codecov code coverage upload (Windows only)
- Add workflow_dispatch for manual runs
- Revert output format to NUnitXml (JUnitXml change reverted)
- Split module installs into separate named steps
- Always use pwsh shell (PS5.1 not supported by this module)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
tpcarman and others added 18 commits March 14, 2026 16:57
Bumps [zentered/bluesky-post-action](https://github.com/zentered/bluesky-post-action) from 0.2.0 to 0.4.0.
- [Release notes](https://github.com/zentered/bluesky-post-action/releases)
- [Commits](zentered/bluesky-post-action@v0.2.0...v0.4.0)

---
updated-dependencies:
- dependency-name: zentered/bluesky-post-action
  dependency-version: 0.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v9...v10)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
…actions/checkout-6

ci(deps): bump actions/checkout from 4 to 6
…actions/stale-10

ci(deps): bump actions/stale from 9 to 10
…actions/upload-artifact-7

ci(deps): bump actions/upload-artifact from 4 to 7
…zentered/bluesky-post-action-0.4.0

ci(deps): bump zentered/bluesky-post-action from 0.2.0 to 0.4.0
IconUri was a relative path ('AsBuiltReport.png') which nuget.exe
rejects with 'Invalid URI' during Publish-Module; changed to a fully
qualified raw GitHub URL. Also fix LicenseUri and ReleaseNotes from
/main/ to /master/ to match the repo's default branch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Prerelease should be blank in source; the Release workflow injects it
dynamically from the tag name only for pre-release GitHub releases.
Having it hardcoded would cause stable releases to publish as pre-release.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Filter.Cluster config option (default ["*"] = all clusters)
- Support plain cluster name or datacenter-qualified "DC/Cluster" format
- Scope VMHosts, VMs, Datastores, ResourcePools, vSAN, DSClusters, and VDS
  to filtered clusters in the entry point; section functions consume
  pre-filtered parent-scope collections
- Fix Get-VsanSpaceUsage to use cluster object rather than name string
  to avoid resolving to the wrong cluster in multi-datacenter environments
- Add CollectingClusters and ClusterNotFound locale keys to all 5 locales
- Update CHANGELOG and README

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@v5...v6)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
…ed data block

- Replace VM summary sub-section with Infrastructure sub-section (Datacenter,
  Cluster, Distributed Switch, Datastore counts); VM summary moved after Hosts
- Move VDS cluster-filter logic from Get-AbrVSphereNetwork into the central
  collection block in Invoke- so $VDSwitches is available to all section functions
- Add Infrastructure localization keys to all 5 locale files
- Fix IconUri to use v2.0.0 tag path (nested folder structure; master branch 404s)
- Reformat AsBuiltReport.VMware.vSphere.json (whitespace only)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…codecov/codecov-action-6

ci(deps): bump codecov/codecov-action from 5 to 6
Add Infrastructure summary table to vCenter Server section
- Update GitHub release workflow to remove X/Twitter tweet action due to their new pay per usage API
- Update CHANGELOG.md
@github-actions
Copy link
Copy Markdown

PSScriptAnalyzer results:

Errors: [0], Warnings: [55], Information: [1]


RuleName   : PSUseBOMForUnicodeEncodedFile
Severity   : Warning
ScriptName : Get-AbrVSphereVMHostHardware.ps1
Line       : 
Message    : Missing BOM encoding for non-ASCII encoded file 
             'Get-AbrVSphereVMHostHardware.ps1'

RuleName   : PSAvoidOverwritingBuiltInCmdlets
Severity   : Warning
ScriptName : Get-Uptime.ps1
Line       : 1
Message    : 'Get-Uptime' is a cmdlet that is included with PowerShell (version 
             core-6.1.0-windows) whose definition should not be overridden

RuleName   : PSUseProcessBlockForPipelineCommand
Severity   : Warning
ScriptName : Get-Uptime.ps1
Line       : 6
Message    : Command accepts pipeline input but has not defined a process block.

RuleName   : PSAvoidUsingEmptyCatchBlock
Severity   : Warning
ScriptName : Get-AbrVSpherevCenter.ps1
Line       : 283
Message    : Empty catch block is used. Please use Write-Error or throw 
             statements in catch blocks.

RuleName   : PSAvoidUsingEmptyCatchBlock
Severity   : Warning
ScriptName : Get-AbrVSpherevCenter.ps1
Line       : 646
Message    : Empty catch block is used. Please use Write-Error or throw 
             statements in catch blocks.

RuleName   : PSAvoidAssignmentToAutomaticVariable
Severity   : Warning
ScriptName : Get-AbrVSpherevCenter.ps1
Line       : 447
Message    : The Variable 'sender' is an automatic variable that is built into 
             PowerShell, assigning to it might have undesired side effects. If 
             assignment is not by design, please use a different name.

RuleName   : PSUseBOMForUnicodeEncodedFile
Severity   : Warning
ScriptName : Get-AbrVSphereClusterLCM.ps1
Line       : 
Message    : Missing BOM encoding for non-ASCII encoded file 
             'Get-AbrVSphereClusterLCM.ps1'

RuleName   : PSUseBOMForUnicodeEncodedFile
Severity   : Warning
ScriptName : Get-AbrVSphereVMHostSecurity.ps1
Line       : 
Message    : Missing BOM encoding for non-ASCII encoded file 
             'Get-AbrVSphereVMHostSecurity.ps1'

RuleName   : PSAvoidUsingEmptyCatchBlock
Severity   : Warning
ScriptName : Get-AbrVSphereClusterProactiveHA.ps1
Line       : 92
Message    : Empty catch block is used. Please use Write-Error or throw 
             statements in catch blocks.

RuleName   : PSUseBOMForUnicodeEncodedFile
Severity   : Warning
ScriptName : Get-AbrVSpherevSAN.ps1
Line       : 
Message    : Missing BOM encoding for non-ASCII encoded file 
             'Get-AbrVSpherevSAN.ps1'

RuleName   : PSUseSingularNouns
Severity   : Warning
ScriptName : Get-vCenterStats.ps1
Line       : 1
Message    : The cmdlet 'Get-vCenterStats' uses a plural noun. A singular noun 
             should be used instead.

RuleName   : PSUseProcessBlockForPipelineCommand
Severity   : Warning
ScriptName : Get-License.ps1
Line       : 35
Message    : Command accepts pipeline input but has not defined a process block.

RuleName   : PSUseProcessBlockForPipelineCommand
Severity   : Warning
ScriptName : Get-License.ps1
Line       : 38
Message    : Command accepts pipeline input but has not defined a process block.

RuleName   : PSPossibleIncorrectComparisonWithNull
Severity   : Warning
ScriptName : Get-License.ps1
Line       : 92
Message    : $null should be on the left side of equality comparisons.

RuleName   : PSPossibleIncorrectComparisonWithNull
Severity   : Warning
ScriptName : Get-License.ps1
Line       : 123
Message    : $null should be on the left side of equality comparisons.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 44
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 45
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 46
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 50
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 57
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 72
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 75
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 108
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 113
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 129
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 130
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 132
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 137
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 138
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 143
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 144
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 145
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 146
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 147
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 148
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 149
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 150
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 154
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 156
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 157
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 163
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 164
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 165
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 173
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 176
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 177
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 178
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 179
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 184
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 185
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 190
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 194
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 198
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSAvoidUsingWriteHost
Severity   : Warning
ScriptName : Invoke-Tests.ps1
Line       : 201
Message    : File 'Invoke-Tests.ps1' uses Write-Host. Avoid using Write-Host 
             because it might not work in all hosts, does not work when there 
             is no host, and (prior to PS 5.0) cannot be suppressed, captured, 
             or redirected. Instead, use Write-Output, Write-Verbose, or 
             Write-Information.

RuleName   : PSUseSingularNouns
Severity   : Warning
ScriptName : LocalizationData.Tests.ps1
Line       : 6
Message    : The cmdlet 'Get-NestedLocalizationKeys' uses a plural noun. A 
             singular noun should be used instead.

RuleName   : PSAvoidTrailingWhitespace
Severity   : Information
ScriptName : Get-Uptime.ps1
Line       : 9
Message    : Line has trailing whitespace

@tpcarman tpcarman merged commit 5512f2a into master May 15, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants