param( [Parameter(Mandatory=$true)][string]$Base, [Parameter(ValueFromRemainingArguments=$true)][string[]]$PassThruArgs ) try { [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding } catch {} $scriptPath = $MyInvocation.MyCommand.Definition $scriptDir = Split-Path -Parent $scriptPath $registry = Split-Path -Parent $scriptDir $dirScripts = Join-Path $registry 'scripts' function gv([string]$n){ $m=[regex]::Match($n,'_v([0-9]+(?:\.[0-9]+)*)$'); if($m.Success){ try { return [version]$m.Groups[1].Value } catch { return [version]'0.0' } } return [version]'0.0' } # pick latest writer $pattern = $Base + '_v*.ps1' $writers = Get-ChildItem -LiteralPath $dirScripts -Filter $pattern -File -EA SilentlyContinue if(-not $writers){ Write-Host "[ERR] Aucun writer ne correspond a $pattern"; exit 1 } $best = $writers | Sort-Object @{Expression={ gv $_.BaseName };Descending=$true}, @{Expression={$_.LastWriteTime};Descending=$true} | Select-Object -First 1 # 1) run writer & 'powershell.exe' -NoProfile -ExecutionPolicy Bypass -File $best.FullName @PassThruArgs 2>&1 | Write-Host $exitWriter = $LASTEXITCODE # 2) post-hook only if -Write present $doWrite = ($PassThruArgs -contains '-Write') if($doWrite){ $encPs = Join-Path $dirScripts 'text_encoding_guard_v1.3.4.ps1' if(Test-Path $encPs){ Write-Host "POST-HOOK: encoding guard (All -Write, manifest recalc off)..." & 'powershell.exe' -NoProfile -ExecutionPolicy Bypass -File $encPs -Scope All -Write | Out-Null Write-Host "POST-HOOK: encoding report (All -Preview)..." & 'powershell.exe' -NoProfile -ExecutionPolicy Bypass -File $encPs -Scope All -Preview | Out-Null } else { Write-Host "[WARN] text_encoding_guard_v1.3.4.ps1 introuvable." } $lint11 = Join-Path $dirScripts 'ps_script_linter_v1.1.ps1' $lint10 = Join-Path $dirScripts 'ps_script_linter_v1.0.ps1' $lintUse = $null if(Test-Path $lint11){ $lintUse=$lint11 } elseif(Test-Path $lint10){ $lintUse=$lint10 } if($lintUse){ Write-Host "POST-HOOK: PS script linter..." $files = Get-ChildItem -LiteralPath $dirScripts -Filter '*.ps1' -File -EA SilentlyContinue | Where-Object { $_.FullName -ne $lintUse } | ForEach-Object { $_.FullName } & 'powershell.exe' -NoProfile -ExecutionPolicy Bypass -File $lintUse -Files $files -SummaryOnly $lintExit=$LASTEXITCODE if($lintExit -ne 0){ Write-Host "[BLOCK] Lint a detecte des anomalies dans scripts\\*.ps1 (voir log). Commit refuse." exit 2 } } else { Write-Host "[WARN] Aucun linter trouve (ps_script_linter_v1.1/1.0)." } } exit $exitWriter