148 lines
4.7 KiB
PowerShell
148 lines
4.7 KiB
PowerShell
|
|
# Refresh helper batch scripts within a specific project directory.
|
||
|
|
|
||
|
|
Set-StrictMode -Version Latest
|
||
|
|
$ErrorActionPreference = 'Stop'
|
||
|
|
|
||
|
|
param(
|
||
|
|
[string]$ProjectPath
|
||
|
|
)
|
||
|
|
|
||
|
|
if (-not $PSScriptRoot) {
|
||
|
|
$PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||
|
|
}
|
||
|
|
|
||
|
|
$configLoader = Join-Path -Path $PSScriptRoot -ChildPath 'ConfigLoader.ps1'
|
||
|
|
if (-not (Test-Path -LiteralPath $configLoader)) {
|
||
|
|
throw "Missing ConfigLoader.ps1 in $PSScriptRoot"
|
||
|
|
}
|
||
|
|
. $configLoader
|
||
|
|
|
||
|
|
$structDir = Get-StructDirectory
|
||
|
|
if (-not (Test-Path -LiteralPath $structDir -PathType Container)) {
|
||
|
|
throw "Configured structDir not found: $structDir"
|
||
|
|
}
|
||
|
|
|
||
|
|
if ([string]::IsNullOrWhiteSpace($ProjectPath)) {
|
||
|
|
$ProjectPath = Read-Host 'Enter the full path to the project directory'
|
||
|
|
}
|
||
|
|
|
||
|
|
if ([string]::IsNullOrWhiteSpace($ProjectPath)) {
|
||
|
|
Write-Error 'No project directory provided.'
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
$resolvedProject = (Resolve-Path -LiteralPath $ProjectPath -ErrorAction Stop).Path
|
||
|
|
}
|
||
|
|
catch {
|
||
|
|
Write-Error "Unable to resolve project directory: $($_.Exception.Message)"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
if (-not (Test-Path -LiteralPath $resolvedProject -PathType Container)) {
|
||
|
|
Write-Error "Project path is not a directory: $resolvedProject"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
Write-Host "Project directory: $resolvedProject" -ForegroundColor Cyan
|
||
|
|
Write-Host "Struct directory: $structDir" -ForegroundColor Cyan
|
||
|
|
|
||
|
|
$specs = @(
|
||
|
|
@{ Name = 'UpdateSequences.bat'; Source = Join-Path -Path $structDir -ChildPath 'UpdateSequences.bat' },
|
||
|
|
@{ Name = 'UpdateAllSequences.bat'; Source = Join-Path -Path $structDir -ChildPath 'UpdateAllSequences.bat' },
|
||
|
|
@{ Name = 'ZipSeqArchv.bat'; Source = Join-Path -Path $structDir -ChildPath 'ZipSeqArchv.bat' },
|
||
|
|
@{ Name = 'UnzipSeqArchv.bat'; Source = Join-Path -Path $structDir -ChildPath 'UnzipSeqArchv.bat' },
|
||
|
|
@{ Name = 'NewDaily.bat'; Source = Join-Path -Path $structDir -ChildPath 'NewDaily.bat' }
|
||
|
|
)
|
||
|
|
|
||
|
|
$sharedAssets = @(
|
||
|
|
@{ Name = 'ConfigLoader.ps1'; Source = Join-Path -Path $structDir -ChildPath 'ConfigLoader.ps1' },
|
||
|
|
@{ Name = 'config.json'; Source = Join-Path -Path $structDir -ChildPath 'config.json' }
|
||
|
|
)
|
||
|
|
|
||
|
|
foreach ($spec in $specs) {
|
||
|
|
if (-not (Test-Path -LiteralPath $spec.Source -PathType Leaf)) {
|
||
|
|
Write-Error "Source file not found: $($spec.Source)"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach ($asset in $sharedAssets) {
|
||
|
|
if (-not (Test-Path -LiteralPath $asset.Source -PathType Leaf)) {
|
||
|
|
Write-Error "Shared asset not found: $($asset.Source)"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$touchedDirs = @{}
|
||
|
|
$summary = @()
|
||
|
|
|
||
|
|
foreach ($spec in $specs) {
|
||
|
|
Write-Host "`n=== Updating $($spec.Name) ===" -ForegroundColor Magenta
|
||
|
|
|
||
|
|
$targets = Get-ChildItem -LiteralPath $resolvedProject -Recurse -Filter $spec.Name -File -ErrorAction SilentlyContinue
|
||
|
|
$targets = $targets | Where-Object { $_.FullName -ne $spec.Source }
|
||
|
|
|
||
|
|
if (-not $targets) {
|
||
|
|
Write-Host "No targets found." -ForegroundColor Yellow
|
||
|
|
$summary += [pscustomobject]@{
|
||
|
|
Name = $spec.Name
|
||
|
|
Updated = 0
|
||
|
|
Failed = 0
|
||
|
|
Skipped = 0
|
||
|
|
Total = 0
|
||
|
|
}
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
|
||
|
|
$updated = 0
|
||
|
|
$failed = 0
|
||
|
|
|
||
|
|
foreach ($target in $targets) {
|
||
|
|
try {
|
||
|
|
Copy-Item -Path $spec.Source -Destination $target.FullName -Force
|
||
|
|
Write-Host "✓ $($target.FullName)" -ForegroundColor Green
|
||
|
|
$updated++
|
||
|
|
|
||
|
|
$targetDir = $target.Directory.FullName
|
||
|
|
if (-not $touchedDirs.ContainsKey($targetDir)) {
|
||
|
|
foreach ($asset in $sharedAssets) {
|
||
|
|
try {
|
||
|
|
Copy-Item -Path $asset.Source -Destination (Join-Path -Path $targetDir -ChildPath $asset.Name) -Force
|
||
|
|
}
|
||
|
|
catch {
|
||
|
|
Write-Host " ✗ Failed to copy $($asset.Name) into $targetDir: $($_.Exception.Message)" -ForegroundColor Red
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$touchedDirs[$targetDir] = $true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch {
|
||
|
|
Write-Host "✗ $($target.FullName)" -ForegroundColor Red
|
||
|
|
Write-Host " $($_.Exception.Message)" -ForegroundColor DarkRed
|
||
|
|
$failed++
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$summary += [pscustomobject]@{
|
||
|
|
Name = $spec.Name
|
||
|
|
Updated = $updated
|
||
|
|
Failed = $failed
|
||
|
|
Skipped = 0
|
||
|
|
Total = $targets.Count
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Write-Host "`n=== Summary ===" -ForegroundColor Cyan
|
||
|
|
foreach ($item in $summary) {
|
||
|
|
Write-Host ("{0,-22} Updated: {1,3} Failed: {2,3} Total: {3,3}" -f $item.Name, $item.Updated, $item.Failed, $item.Total)
|
||
|
|
}
|
||
|
|
|
||
|
|
if (($summary | Measure-Object -Property Failed -Sum).Sum -gt 0) {
|
||
|
|
Write-Host "Completed with errors." -ForegroundColor Yellow
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
Write-Host "All batch files refreshed successfully." -ForegroundColor Green
|
||
|
|
|