# 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