param( [Parameter(Mandatory=$true)][string]$Executable, [Parameter(Mandatory=$true)][string]$OutputDirectory ) $ErrorActionPreference = 'Stop' $exe = (Resolve-Path $Executable).Path $directory = [IO.Path]::GetFullPath($OutputDirectory) if (Test-Path $directory) { throw 'Use a new output directory to preserve earlier evidence.' } [IO.Directory]::CreateDirectory($directory) | Out-Null $utf8 = New-Object Text.UTF8Encoding($false) $results = @() $cases = @( @{ Name='recover'; Args=@('recover-ui','--timeout','30') }, @{ Name='doctor'; Args=@('doctor','--timeout','30') }, @{ Name='inspect'; Args=@('inspect-ui','--output',"$directory\ui-tree.json",'--timeout','30') }, @{ Name='smoke'; Args=@('smoke','--output',"$directory\smoke-ui-tree.json",'--timeout','30') }, @{ Name='recovery'; Args=@('recovery-smoke','--timeout','60') }, @{ Name='listener'; Args=@('listener-smoke','--output',"$directory\listener",'--timeout','60') }, @{ Name='listener-independent'; Args=@('listener-smoke','--independent','--output',"$directory\listener-independent",'--timeout','60') }, @{ Name='independent-ui'; Args=@('inspect-ui','--window-title','文件传输助手','--output',"$directory\independent-ui-tree.json",'--timeout','30') }, @{ Name='stability'; Args=@('stability-smoke','--seconds','30','--sample-seconds','5','--output',"$directory\stability",'--timeout','90') }, @{ Name='diagnose'; Args=@('diagnose','--baseline',"$directory\ui-tree.json",'--output',"$directory\diagnostics",'--timeout','60') } ) foreach ($case in $cases) { $started = [DateTimeOffset]::UtcNow $arguments = $case.Args $lines = & $exe @arguments $code = $LASTEXITCODE [IO.File]::WriteAllText("$directory\$($case.Name).json", ($lines -join [Environment]::NewLine), $utf8) $results += @{ Name=$case.Name; ExitCode=$code; StartedAt=$started; FinishedAt=[DateTimeOffset]::UtcNow } } $started = [DateTimeOffset]::UtcNow & (Join-Path $PSScriptRoot 'Test-CommandGate.ps1') -Executable $exe -OutputPath "$directory\command-gate.json" $gateCode = $LASTEXITCODE $results += @{ Name='command-gate'; ExitCode=$gateCode; StartedAt=$started; FinishedAt=[DateTimeOffset]::UtcNow } $summary = @{ BinarySha256=(Get-FileHash $exe -Algorithm SHA256).Hash SessionId=[Diagnostics.Process]::GetCurrentProcess().SessionId OperatingSystem=[Environment]::OSVersion.VersionString Results=$results Passed=(@($results | Where-Object { $_.ExitCode -ne 0 }).Count -eq 0) } [IO.File]::WriteAllText("$directory\validation-summary.json", ($summary | ConvertTo-Json -Depth 8), $utf8) if (!$summary.Passed) { exit 2 } exit 0