From 7638cc34aeb7f71b8679d940bd24d8d44972f335 Mon Sep 17 00:00:00 2001 From: JakobL-MSFT <110699333+JakobL-MSFT@users.noreply.github.com> Date: Sun, 18 Feb 2024 22:26:04 -0800 Subject: Update main branch infverif flags (#1118) --- Build-AllSamples.ps1 | 5 +++- Build-Sample.ps1 | 15 ++++------- Build-SampleSet.ps1 | 73 +++++++++++++++++++++++++++++++++++++--------------- exclusions.csv | 23 +++++++---------- 4 files changed, 70 insertions(+), 46 deletions(-) diff --git a/Build-AllSamples.ps1 b/Build-AllSamples.ps1 index 353d95a3..6b3a1976 100644 --- a/Build-AllSamples.ps1 +++ b/Build-AllSamples.ps1 @@ -56,7 +56,10 @@ $sampleSet = @{} foreach ($file in $solutionFiles) { $dir = (Get-Item $file).DirectoryName $dir_norm = $dir.Replace($root, '').Trim('\').Replace('\', '.').ToLower() - if ($dir_norm -match ($Samples)) { + if ($dir_norm -match ("^packages.")) { + Write-Verbose "`u{1F50E} Found and ignored non-sample [$dir_norm] at $dir" + } + elseif ($dir_norm -match ($Samples)) { Write-Verbose "`u{1F50E} Found and filtered in sample [$dir_norm] at $dir" $sampleSet[$dir_norm] = $dir } diff --git a/Build-Sample.ps1 b/Build-Sample.ps1 index a7c9deb2..cb927d3f 100644 --- a/Build-Sample.ps1 +++ b/Build-Sample.ps1 @@ -17,6 +17,9 @@ Configuration name that will be used to build the solution. Common available val .PARAMETER Platform Platform to build the solution for (e.g. "x64", "arm64"). +.PARAMETER InfVerif_AdditionalOptions +Additional options for infverif (e.g. "/samples"). + .PARAMETER LogFilesDirectoy Path to a directory where the log files will be written to. If not provided, outputs will be logged to the current working directory. @@ -43,6 +46,7 @@ param( [string]$SampleName, [string]$Configuration = "Debug", [string]$Platform = "x64", + [string]$InfVerif_AdditionalOptions = "/samples", $LogFilesDirectory = (Get-Location) ) @@ -138,16 +142,7 @@ $warnLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.wrn" $OutLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.out" Write-Verbose "Building Sample: $SampleName; Configuration: $Configuration; Platform: $Platform {" - -# Exclude certain InfVerif exceptions to allow samples to build and detect other errors. -# error 1205: Section [xxx] referenced from DelFiles and CopyFiles directive - network\trans -# error 1144: Device software with SoftwareType 1 may not execute on all product types - general\dchu\osrfx2_dchu_extension_tight -# error 1233: Missing directive CatalogFile required for digital signature - storage\class\disk -# error 2083: Section [xxx] not referenced or used - network\trans, storage\msdsm -# error 2084: Service binary 'xxx' should reference a CopyFiles destination file - network\trans, wpd\wpdservicesampledriver -# errors 1324, 1420, 1421, 1402 will be excluded in main branch only until the fixes are merged. -# error 2086 will be excluded until the WDK used in GitHub is updated. -msbuild $solutionFile -clp:Verbosity=m -t:clean,build -property:Configuration=$Configuration -property:Platform=$Platform -p:TargetVersion=Windows10 -p:InfVerif_AdditionalOptions="/samples /msft /sw1144 /sw1199 /sw1205 /sw1233 /sw1324 /sw1420 /sw1421 /sw2083 /sw2084 /sw2086 /sw1402" -p:SignToolWS=/fdws -p:DriverCFlagAddOn=/wd4996 -warnaserror -flp1:errorsonly`;logfile=$errorLogFilePath -flp2:WarningsOnly`;logfile=$warnLogFilePath -noLogo > $OutLogFilePath +msbuild $solutionFile -clp:Verbosity=m -t:rebuild -property:Configuration=$Configuration -property:Platform=$Platform -p:TargetVersion=Windows10 -p:InfVerif_AdditionalOptions="$InfVerif_AdditionalOptions" -p:SignToolWS=/fdws -p:DriverCFlagAddOn=/wd4996 -warnaserror -flp1:errorsonly`;logfile=$errorLogFilePath -flp2:WarningsOnly`;logfile=$warnLogFilePath -noLogo > $OutLogFilePath if ($env:WDS_WipeOutputs -ne $null) { Write-Verbose ("WipeOutputs: "+$Directory+" "+(((Get-Volume ($DriveLetter=(Get-Item ".").PSDrive.Name)).SizeRemaining/1GB))) diff --git a/Build-SampleSet.ps1 b/Build-SampleSet.ps1 index 535ac6db..6e9a3b17 100644 --- a/Build-SampleSet.ps1 +++ b/Build-SampleSet.ps1 @@ -45,15 +45,32 @@ finally { } # -# Determine build environment: 'WDK', 'EWDK', or 'GitHub'. Only used to determine build number. +# Determine build environment: 'GitHub', 'NuGet', 'EWDK', or 'WDK'. Only used to determine build number. # Determine build number (used for exclusions based on build number). Five digits. Say, '22621'. # $build_environment="" $build_number=0 # +# WDK NuGet will require presence of a folder 'packages' +# +# +# Hack: In GitHub we do not have an environment variable where we can see WDK build number, so we have it hard coded. +# +if (-not $env:GITHUB_REPOSITORY -eq '') { + $build_environment="GitHub" + $build_number=22621 +} +# +# Hack: If user has hydrated nuget packages, then use those. That will be indicated by presence of a folder named .\packages. +# +elseif(Test-Path(".\packages")) { + $build_environment=("NuGet") + $build_number=26061 +} +# # EWDK sets environment variable BuildLab. For example 'ni_release_svc_prod1.22621.2428'. # -if($env:BuildLab -match '(?[^.]*).(?[^.]*).(?[^.]*)') { +elseif($env:BuildLab -match '(?[^.]*).(?[^.]*).(?[^.]*)') { $build_environment=("EWDK."+$Matches.branch+"."+$Matches.build+"."+$Matches.qfe) $build_number=$Matches.build } @@ -64,13 +81,6 @@ elseif ($env:UCRTVersion -match '10.0.(?.*).0') { $build_environment="WDK" $build_number=$Matches.build } -# -# Hack: In GitHub we do not have an environment variable where we can see WDK build number, so we have it hard coded. -# -elseif (-not $env:GITHUB_REPOSITORY -eq '') { - $build_environment="GitHub" - $build_number=22621 -} else { # Dump all environment variables so as to help debug error: @@ -82,6 +92,25 @@ else { exit 1 } +# +# InfVerif_AdditionalOptions +# +# Samples must build cleanly and even without warnings. +# +# For this branch we handle this with infverif exclusions. +# +# In NI WDK the /msft flag excludes expected warnings. +# This flag not to be used after NI. Instead use /samples. +# +$InfVerif_AdditionalOptions= + ( + $build_number -le 22621 ? + "/msft" : + "/samples /sw1199 /sw1204 /sw1208 /sw1233 /sw1402 /sw1423 /sw2084" + ) + + " " + + "/sw1203 /sw1205 /sw1296 /sw1324 /sw1420 /sw1421 /sw1422 /sw2083" + # # Determine exclusions. # @@ -127,17 +156,18 @@ $jresult = @{ $SolutionsTotal = $sampleSet.Count * $Configurations.Count * $Platforms.Count -Write-Output ("Build Environment: " + $build_environment) -Write-Output ("Build Number: " + $build_number) -Write-Output ("Samples: " + $sampleSet.Count) -Write-Output ("Configurations: " + $Configurations.Count + " (" + $Configurations + ")") -Write-Output ("Platforms: " + $Platforms.Count + " (" + $Platforms + ")") -Write-Output "Combinations: $SolutionsTotal" -Write-Output "LogicalProcessors: $LogicalProcessors" -Write-Output "ThrottleFactor: $ThrottleFactor" -Write-Output "ThrottleLimit: $ThrottleLimit" -Write-Output "WDS_WipeOutputs: $env:WDS_WipeOutputs" -Write-Output ("Disk Remaining (GB): " + (((Get-Volume ($DriveLetter = (Get-Item ".").PSDrive.Name)).SizeRemaining / 1GB))) +Write-Output ("Build Environment: " + $build_environment) +Write-Output ("Build Number: " + $build_number) +Write-Output ("Samples: " + $sampleSet.Count) +Write-Output ("Configurations: " + $Configurations.Count + " (" + $Configurations + ")") +Write-Output ("Platforms: " + $Platforms.Count + " (" + $Platforms + ")") +Write-Output "InfVerif_AdditionalOptions: $InfVerif_AdditionalOptions" +Write-Output "Combinations: $SolutionsTotal" +Write-Output "LogicalProcessors: $LogicalProcessors" +Write-Output "ThrottleFactor: $ThrottleFactor" +Write-Output "ThrottleLimit: $ThrottleLimit" +Write-Output "WDS_WipeOutputs: $env:WDS_WipeOutputs" +Write-Output ("Disk Remaining (GB): " + (((Get-Volume ($DriveLetter = (Get-Item ".").PSDrive.Name)).SizeRemaining / 1GB))) Write-Output "" Write-Output "T: Combinations" Write-Output "B: Built" @@ -161,6 +191,7 @@ $SampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral $exclusionReasons = $using:exclusionReasons $Configurations = $using:Configurations $Platforms = $using:Platforms + $InfVerif_AdditionalOptions = $using:InfVerif_AdditionalOptions $Verbose = $using:Verbose $sampleName = $_.Key @@ -185,7 +216,7 @@ $SampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral $thisresult = "Excluded" } else { - .\Build-Sample -Directory $directory -SampleName $sampleName -LogFilesDirectory $LogFilesDirectory -Configuration $configuration -Platform $platform -Verbose:$Verbose + .\Build-Sample -Directory $directory -SampleName $sampleName -LogFilesDirectory $LogFilesDirectory -Configuration $configuration -Platform $platform -InfVerif_AdditionalOptions $InfVerif_AdditionalOptions -Verbose:$Verbose if ($LASTEXITCODE -eq 0) { $thissucceeded += 1 $thisresult = "Succeeded" diff --git a/exclusions.csv b/exclusions.csv index ebaea66a..4820f615 100644 --- a/exclusions.csv +++ b/exclusions.csv @@ -1,17 +1,12 @@ Path,Configurations,MinBuild,MaxBuild,Reason -avstream\sampledevicemft,*,26031,,Only GE: Fails to build -general\dchu\osrfx2_dchu_base,*,,,Wrong Toolset - needs migration -general\dchu\osrfx2_dchu_extension_loose,*,,,Needs fix for project not found -general\dchu\osrfx2_dchu_extension_tight,*,,,Wrong Toolset - needs migration -general\filehistory,*,,,Deprecated APIs +avstream\sampledevicemft,*|x64,26000,,Only GE: Only x64: Fails to build +general\dchu\osrfx2_dchu_base,*|x64,,,Only x64: Wrong Toolset - needs migration +general\dchu\osrfx2_dchu_extension_loose,*|x64,,,Only x64: Needs fix for project not found +general\dchu\osrfx2_dchu_extension_tight,*|x64,,,Only x64: Wrong Toolset - needs migration +general\filehistory,*|x64,,,Only x64: Deprecated APIs general\simplemediasource,Debug|arm64,,,Only Debug|arm64: LNK1181: cannot open input file 'SimpleMediaSource.lib' -general\winhec 2017 lab\toaster driver,*,,,Needs input from end user -general\winhec 2017 lab\toaster support app,*,,,Needs input from end user -network\trans\stmedit,*,,,Invalid Win32 architecture -network\trans\wfpsampler,*,,,Missing INF section; missing libs -network\wlan\wdi,*,,,Invalid architecture -print\oem printer customization plug-in samples\c++,*,,,Invalid architecture -print\v4printdriversamples\printerextensionsample,*,,,Invalid architecture -storage\class\cdrom,*,26031,,Only GE: Fails to build -tree,*,,,Missing headers +general\winhec 2017 lab\toaster support app,*|x64,,,Only x64: Needs input from end user +network\trans\stmedit,Debug|x64,,,Only x64: Only Debug: Invalid architecture +network\trans\wfpsampler,*|x64,,,Only x64: Missing libs +tree,*|x64,,,Only x64: Missing headers video\indirectdisplay,*|arm64,,,Only arm64: Warning C4530: C++ exception handler used but unwind semantics are not enabled -- cgit v1.3.1 From b968cfbed5566a3a9597f5368334beb3b6dad4d2 Mon Sep 17 00:00:00 2001 From: JakobL-MSFT <110699333+JakobL-MSFT@users.noreply.github.com> Date: Mon, 26 Feb 2024 08:40:07 -0800 Subject: Merge tools in develop to main (#1128) * Merge tools in develop to main * Fine tune testenv --- Build-Sample.ps1 | 70 ++++++++++++++++++++++++++++++++++++++++++++--------- Build-SampleSet.ps1 | 41 +++++++++++++++++++++++++++---- 2 files changed, 94 insertions(+), 17 deletions(-) diff --git a/Build-Sample.ps1 b/Build-Sample.ps1 index cb927d3f..70abadc2 100644 --- a/Build-Sample.ps1 +++ b/Build-Sample.ps1 @@ -134,23 +134,60 @@ foreach ($line in Get-Content -Path $solutionFile) if (-not $configurationIsSupported) { Write-Verbose "[$SampleName] `u{23E9} Skipped. Configuration $Configuration|$Platform not supported." - exit 2 + exit 3 } -$errorLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.err" -$warnLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.wrn" -$OutLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.out" - Write-Verbose "Building Sample: $SampleName; Configuration: $Configuration; Platform: $Platform {" -msbuild $solutionFile -clp:Verbosity=m -t:rebuild -property:Configuration=$Configuration -property:Platform=$Platform -p:TargetVersion=Windows10 -p:InfVerif_AdditionalOptions="$InfVerif_AdditionalOptions" -p:SignToolWS=/fdws -p:DriverCFlagAddOn=/wd4996 -warnaserror -flp1:errorsonly`;logfile=$errorLogFilePath -flp2:WarningsOnly`;logfile=$warnLogFilePath -noLogo > $OutLogFilePath -if ($env:WDS_WipeOutputs -ne $null) -{ - Write-Verbose ("WipeOutputs: "+$Directory+" "+(((Get-Volume ($DriveLetter=(Get-Item ".").PSDrive.Name)).SizeRemaining/1GB))) - Get-ChildItem -path $Directory -Recurse -Include x64|Remove-Item -Recurse - Get-ChildItem -path $Directory -Recurse -Include arm64|Remove-Item -Recurse + +$myexit=0 + +# +# Let us build up to three times (0th, 1st, and 2nd attempt). +# If we succeed at first, then it is a success. +# If we fail at first, but succeed at either of next two attempts, then it is a sporadic failure. +# If we even at third attempt fail, then it is a true failure. +# +for ($i=0; $i -le 2; $i++) { + $errorLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.$i.err" + $warnLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.$i.wrn" + $OutLogFilePath = "$LogFilesDirectory\$SampleName.$Configuration.$Platform.$i.out" + + msbuild $solutionFile -clp:Verbosity=m -t:rebuild -property:Configuration=$Configuration -property:Platform=$Platform -p:TargetVersion=Windows10 -p:InfVerif_AdditionalOptions="$InfVerif_AdditionalOptions" -p:SignToolWS=/fdws -p:DriverCFlagAddOn=/wd4996 -warnaserror -flp1:errorsonly`;logfile=$errorLogFilePath -flp2:WarningsOnly`;logfile=$warnLogFilePath -noLogo > $OutLogFilePath + if ($env:WDS_WipeOutputs -ne $null) + { + Write-Verbose ("WipeOutputs: "+$Directory+" "+(((Get-Volume ($DriveLetter=(Get-Item ".").PSDrive.Name)).SizeRemaining/1GB))) + Get-ChildItem -path $Directory -Recurse -Include x64|Remove-Item -Recurse + Get-ChildItem -path $Directory -Recurse -Include arm64|Remove-Item -Recurse + } + if ($LASTEXITCODE -eq 0) + { + # We succeeded building. + # If at first attempt, then $myexit=0 + # If at later attempt, then $myexit=2 + if ($i -eq 0) + { + $myexit=0 + } + else + { + $myexit=2 + } + break; + } + else + { + # We failed building. + # Let us sleep for a bit. + # Then let the while loop do its thing and re-run. + sleep 1 + if ($Verbose) + { + Write-Warning "`u{274C} Build failed. Retrying to see if sporadic..." + } + } } -if ($LASTEXITCODE -ne 0) +if ($myexit -eq 1) { if ($Verbose) { @@ -159,4 +196,13 @@ if ($LASTEXITCODE -ne 0) exit 1 } +if ($myexit -eq 2) +{ + if ($Verbose) + { + Write-Warning "`u{274C} Build sporadically failed. Log available at $errorLogFilePath" + } + exit 2 +} + Write-Verbose "Building Sample: $SampleName; Configuration: $Configuration; Platform: $Platform }" diff --git a/Build-SampleSet.ps1 b/Build-SampleSet.ps1 index 6e9a3b17..5c15f067 100644 --- a/Build-SampleSet.ps1 +++ b/Build-SampleSet.ps1 @@ -65,7 +65,7 @@ if (-not $env:GITHUB_REPOSITORY -eq '') { # elseif(Test-Path(".\packages")) { $build_environment=("NuGet") - $build_number=26061 + $build_number=26066 } # # EWDK sets environment variable BuildLab. For example 'ni_release_svc_prod1.22621.2428'. @@ -149,6 +149,7 @@ $jresult = @{ SolutionsExcluded = 0 SolutionsUnsupported = 0 SolutionsFailed = 0 + SolutionsSporadic = 0 Results = @() FailSet = @() lock = [System.Threading.Mutex]::new($false) @@ -178,6 +179,7 @@ Write-Output "S: Built and result was 'Succeeded'" Write-Output "E: Built and result was 'Excluded'" Write-Output "U: Built and result was 'Unsupported' (Platform and Configuration combination)" Write-Output "F: Built and result was 'Failed'" +Write-Output "O: Built and result was 'Sporadic'" Write-Output "" Write-Output "Building all combinations..." @@ -204,10 +206,12 @@ $SampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral foreach ($platform in $Platforms) { $thisunsupported = 0 $thisfailed = 0 + $thissporadic = 0 $thisexcluded = 0 $thissucceeded = 0 $thisresult = "Not run" $thisfailset = @() + $thissporadicset = @() if ($exclusionConfigurations.ContainsKey($sampleName) -and ($exclusionConfigurations[$sampleName].Split(';') | Where-Object { "$configuration|$platform" -like $_ })) { # Verbose @@ -226,8 +230,13 @@ $SampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral $thisfailed += 1 $thisresult = "Failed" } + elseif ($LASTEXITCODE -eq 2) { + $thissporadicset += "$sampleName $configuration|$platform" + $thissporadic += 1 + $thisresult = "Sporadic" + } else { - # ($LASTEXITCODE -eq 2) + # ($LASTEXITCODE -eq 3) $thisunsupported += 1 $thisresult = "Unsupported" } @@ -241,7 +250,9 @@ $SampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral ($using:jresult).SolutionsExcluded += $thisexcluded ($using:jresult).SolutionsUnsupported += $thisunsupported ($using:jresult).SolutionsFailed += $thisfailed + ($using:jresult).SolutionsSporadic += $thissporadic ($using:jresult).FailSet += $thisfailset + ($using:jresult).SporadicSet += $thissporadicset $SolutionsTotal = $using:SolutionsTotal $ThrottleLimit = $using:ThrottleLimit $SolutionsBuilt = ($using:jresult).SolutionsBuilt @@ -250,7 +261,7 @@ $SampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral $SolutionsPending = if ($SolutionsRemaining -ge $ThrottleLimit) { ($SolutionsRemaining - $ThrottleLimit) } else { 0 } $SolutionsBuiltPercent = [Math]::Round(100 * ($SolutionsBuilt / $using:SolutionsTotal)) $TBRP = "T:" + ($SolutionsTotal) + "; B:" + (($using:jresult).SolutionsBuilt) + "; R:" + ($SolutionsRunning) + "; P:" + ($SolutionsPending) - $rstr = "S:" + (($using:jresult).SolutionsSucceeded) + "; E:" + (($using:jresult).SolutionsExcluded) + "; U:" + (($using:jresult).SolutionsUnsupported) + "; F:" + (($using:jresult).SolutionsFailed) + $rstr = "S:" + (($using:jresult).SolutionsSucceeded) + "; E:" + (($using:jresult).SolutionsExcluded) + "; U:" + (($using:jresult).SolutionsUnsupported) + "; F:" + (($using:jresult).SolutionsFailed) + "; O:" + (($using:jresult).SolutionsSporadic) Write-Progress -Activity "Building combinations" -Status "$SolutionsBuilt of $using:SolutionsTotal combinations built ($SolutionsBuiltPercent%) | $TBRP | $rstr" -PercentComplete $SolutionsBuiltPercent } finally { @@ -269,6 +280,8 @@ $SampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral $sw.Stop() +Write-Output "" + if ($jresult.FailSet.Count -gt 0) { Write-Output "Some combinations were built with errors:" $jresult.FailSet = $jresult.FailSet | Sort-Object @@ -278,10 +291,27 @@ if ($jresult.FailSet.Count -gt 0) { $failConfiguration = $Matches[2] $failPlatform = $Matches[3] Write-Output "Build errors in Sample $failName; Configuration: $failConfiguration; Platform: $failPlatform {" - Get-Content "$LogFilesDirectory\$failName.$failConfiguration.$failPlatform.err" | Write-Output + Get-Content "$LogFilesDirectory\$failName.$failConfiguration.$failPlatform.0.err" | Write-Output Write-Output "} $failedSample" } Write-Error "Some combinations were built with errors." + Write-Output "" +} + +if ($jresult.SporadicSet.Count -gt 0) { + Write-Output "Some combinations were built with sporadic error:" + $jresult.SporadicSet = $jresult.SporadicSet | Sort-Object + foreach ($sporadicSample in $jresult.SporadicSet) { + $sporadicSample -match "^(.*) (\w*)\|(\w*)$" | Out-Null + $sporadicName = $Matches[1] + $sporadicConfiguration = $Matches[2] + $sporadicPlatform = $Matches[3] + Write-Output "Build sporadic errors in Sample $sporadicName; Configuration: $sporadicConfiguration; Platform: $sporadicPlatform {" + Get-Content "$LogFilesDirectory\$sporadicName.$sporadicConfiguration.$sporadicPlatform.0.err" | Write-Output + Write-Output "} $sporadicSample" + } + Write-Error "Some combinations were built with sporadic errors." + Write-Output "" } # Display timer statistics to host @@ -292,9 +322,9 @@ $SolutionsSucceeded = $jresult.SolutionsSucceeded $SolutionsExcluded = $jresult.SolutionsExcluded $SolutionsUnsupported = $jresult.SolutionsUnsupported $SolutionsFailed = $jresult.SolutionsFailed +$SolutionsSporadic = $jresult.SolutionsSporadic $Results = $jresult.Results -Write-Output "" Write-Output "Built all combinations." Write-Output "" Write-Output "Elapsed time: $min minutes, $seconds seconds." @@ -307,6 +337,7 @@ Write-Output "Succeeded: $SolutionsSucceeded" Write-Output "Excluded: $SolutionsExcluded" Write-Output "Unsupported: $SolutionsUnsupported" Write-Output "Failed: $SolutionsFailed" +Write-Output "Sporadic: $SolutionsSporadic" Write-Output "Log files directory: $LogFilesDirectory" Write-Output "Overview report: $reportFilePath" Write-Output "" -- cgit v1.3.1