修掉的:空 catch 5 处;名词白名单 7 处;default-value 开关、自带 -WhatIf、lab 的明文口令与 irm|iex 各挂抑制并写明理由。 MaxDepth:它是分析器拓出来的真 bug —— 参数声明了却从未使用,也就是配置里的 CatalogMaxDepth 是假的,前缀补全实际只查 1 层,而配置注释与 README 都承诺「向下找几层」。按确认过的原则处理:**先让文档不撒谎**,所以把整条链路去掉(配置默认值、三个函数的参数、70 处实参、配置注释),而不是留一个假旋钮。零行为变化。想真的支持多层补全时,那是一个独立决定。 剩下 3 条都是分析器的误判,而且我实测确认过其中一条:$sourcePath 被报「赋值后从未使用」,我照着改成 $null = 之后,Set-StrictMode -Version 3.0 下读未定义变量直接抛错,Security 套件的 BeforeAll 挂掉、4 条用例连带失败。恢复后才绿。 这一类误判有共同成因:静态分析看不到「在传给 Test-Case / It / Where-Object 的 scriptblock 里被使用」。所以我只对能证明是误判的挂抑制并写明理由,不为了数字好看去改代码。 验收:test.ps1 9/9 全绿(7 与 5.1)、100 个文件两版解析零错、Run-RealSmoke 4/4。
49 lines
1.4 KiB
PowerShell
49 lines
1.4 KiB
PowerShell
function Write-BakNRetLog {
|
|
<#
|
|
.SYNOPSIS
|
|
写一条日志到控制台,并在启用日志文件时落盘。
|
|
|
|
.DESCRIPTION
|
|
落盘失败不会影响主流程(吞掉异常),因为备份本身比日志更重要。
|
|
#>
|
|
param(
|
|
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
|
|
[ValidateNotNullOrEmpty()]
|
|
[string]$Message,
|
|
|
|
[Parameter()]
|
|
[ValidateSet('INFO', 'WARN', 'ERROR', 'DEBUG')]
|
|
[string]$Level = 'INFO'
|
|
)
|
|
|
|
process {
|
|
if ($Level -eq 'DEBUG' -and -not $script:LogConfig.EnableDebug) {
|
|
return
|
|
}
|
|
|
|
$timestamp = Get-Date -Format $script:LogConfig.TimeFormat
|
|
$line = "[$timestamp] [$Level] $Message"
|
|
|
|
$colorMap = @{
|
|
'INFO' = 'Green'
|
|
'WARN' = 'Yellow'
|
|
'ERROR' = 'Red'
|
|
'DEBUG' = 'Gray'
|
|
}
|
|
Write-Host $line -ForegroundColor $colorMap[$Level]
|
|
|
|
if ($script:LogConfig.FilePath) {
|
|
try {
|
|
[System.IO.File]::AppendAllText(
|
|
$script:LogConfig.FilePath,
|
|
$line + [Environment]::NewLine,
|
|
$script:LogEncoding)
|
|
}
|
|
catch {
|
|
# 日志落盘失败时保持沉默:不能因为写日志失败而让备份失败。
|
|
$null = $_
|
|
}
|
|
}
|
|
}
|
|
}
|