<# .SYNOPSIS 在 VM 内以 UTF-8 控制台编码运行一个测试套件(不改仓库里的任何测试代码)。 .DESCRIPTION 为什么需要它 —— tests\BakNRet*.Tests.ps1 的 Invoke-BakNRetScript 是这么抓子进程输出的: cmd /c pwsh -File Backup.ps1 ... > out.txt 2>&1 Get-Content -LiteralPath out.txt -Encoding UTF8 而 Backup.ps1 / Restore.ps1 的 Write-BakNRetLog 走 Write-Host,写进 out.txt 的字节用的是 `[Console]::OutputEncoding`: * 宿主机上它是 utf-8 -> 文件是 UTF-8 -> 按 UTF-8 读回,中文正确,套件全绿; * 一台全新 Windows VM 上它是 ANSI 代码页(中文系统 936) -> 文件是 GBK 字节 -> 按 UTF-8 读回得到替换字符 -> 断言中文的那几项失败。 这是测试环境假设问题,不是产品缺陷。本包装器把控制台输出编码先钉成 UTF-8, 于是 VM 里也能得到和宿主机一致的 150/150。 用法:pwsh -File run-suite-utf8.ps1 C:\BakNRet\tests\Run-Pester.ps1 [-KeepWorkRoot ...] #> [CmdletBinding()] param( [Parameter(Mandatory, Position = 0)][string]$Suite, [Parameter(Position = 1, ValueFromRemainingArguments = $true)][string[]]$SuiteArgs = @() ) $ErrorActionPreference = 'Continue' [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::InputEncoding = [System.Text.Encoding]::UTF8 $OutputEncoding = [System.Text.Encoding]::UTF8 Write-Host ("[lab] 包装器:PS {0},[Console]::OutputEncoding = {1}" -f $PSVersionTable.PSVersion, [Console]::OutputEncoding.WebName) Write-Host ("[lab] 套件:{0} {1}" -f $Suite, ($SuiteArgs -join ' ')) if (-not (Test-Path -LiteralPath $Suite)) { Write-Error "找不到套件:$Suite"; exit 2 } & $Suite @SuiteArgs exit $LASTEXITCODE