# Refresh helper batch scripts within a specific project directory. param( [string]$ProjectPath ) Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' 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' } ) # Config files to deploy to projectroot\.config\ $configAssets = @( @{ Name = 'config.json'; Source = Join-Path -Path $structDir -ChildPath 'config.json' }, @{ Name = 'GetStructDir.ps1'; Source = Join-Path -Path $structDir -ChildPath 'GetStructDir.ps1' } ) 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 $configAssets) { if (-not (Test-Path -LiteralPath $asset.Source -PathType Leaf)) { Write-Error "Config asset not found: $($asset.Source)" exit 1 } } # Ensure .config directory exists in project root $projectConfigDir = Join-Path -Path $resolvedProject -ChildPath '.config' if (-not (Test-Path -LiteralPath $projectConfigDir -PathType Container)) { New-Item -Path $projectConfigDir -ItemType Directory -Force | Out-Null Write-Host "Created .config directory: $projectConfigDir" -ForegroundColor Cyan } $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 "[OK] $($target.FullName)" -ForegroundColor Green $updated++ $targetDir = $target.Directory.FullName if (-not $touchedDirs.ContainsKey($targetDir)) { $touchedDirs[$targetDir] = $true } } catch { Write-Host "[FAIL] $($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 # Deploy config files to projectroot\.config\ Write-Host "`n=== Deploying config files to .config\ ===" -ForegroundColor Magenta foreach ($asset in $configAssets) { $targetPath = Join-Path -Path $projectConfigDir -ChildPath $asset.Name try { Copy-Item -Path $asset.Source -Destination $targetPath -Force Write-Host "[OK] $targetPath" -ForegroundColor Green } catch { Write-Host "[FAIL] $targetPath" -ForegroundColor Red Write-Host " $($_.Exception.Message)" -ForegroundColor DarkRed exit 1 } } Write-Host "Config files deployed successfully." -ForegroundColor Green