#Requires -Version 5.1 $FfsExe = 'C:\Program Files\FreeFileSync\FreeFileSync.exe' $ScriptDir = $PSScriptRoot $LogDir = Join-Path $ScriptDir 'logs' $ReportDir = Join-Path $ScriptDir 'reports' $SyncJobs = @( 'D:\jobs\shuttlebay_SyncSettings.ffs_batch' 'D:\jobs\main_bridge_SyncSettings.ffs_batch' 'D:\jobs\engineering_SyncSettings.ffs_batch' ) # ── Setup ────────────────────────────────────────────────────────────────────── foreach ($dir in $LogDir, $ReportDir) { if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null } } $RunTs = Get-Date -Format 'yyyyMMdd_HHmmss' $LogFile = Join-Path $LogDir "sync_history_$RunTs.log" function Write-Log { param([string]$Message) $line = "[$(Get-Date -Format 'ddd MM/dd/yyyy HH:mm:ss.ff')] $Message" Write-Host $line Add-Content -Path $LogFile -Value $line } Write-Log 'Sync run started' Write-Host "Log file: $LogFile" # ── Run sync jobs ────────────────────────────────────────────────────────────── foreach ($job in $SyncJobs) { $jobName = Split-Path $job -Leaf Write-Host '' Write-Log "Running synchronization: $jobName" $tmpOut = [IO.Path]::GetTempFileName() $proc = Start-Process -FilePath $FfsExe -ArgumentList $job ` -RedirectStandardOutput $tmpOut -NoNewWindow -PassThru -Wait $rc = $proc.ExitCode $output = Get-Content -Path $tmpOut -Raw Remove-Item $tmpOut -Force if ($output) { Add-Content -Path $LogFile -Value $output } switch ($rc) { 0 { Write-Log 'Synchronization completed successfully.' } 1 { Write-Log 'Synchronization completed with warnings.' } default { Write-Log "Synchronization failed or was aborted. Exit code: $rc" exit $rc } } } Write-Host '' Write-Log 'All synchronization jobs completed.' # ── Copy HTML reports ────────────────────────────────────────────────────────── $logPaths = Select-String -Path $LogFile -Pattern '"logFile"\s*:\s*"([^"]+)"' | ForEach-Object { $_.Matches[0].Groups[1].Value -replace '\\\\', '\' } | Sort-Object -Unique $copied = 0 foreach ($path in $logPaths) { if ([IO.Path]::GetExtension($path) -ieq '.html') { if (Test-Path $path) { Copy-Item -Path $path -Destination $ReportDir -Force Write-Log "Copied report: $(Split-Path $path -Leaf)" $copied++ } else { Write-Log "Report not found: $path" } } } Write-Log "Total reports copied: $copied" # ── Shutdown ─────────────────────────────────────────────────────────────────── Write-Log 'Shutting down server now.' Stop-Computer -Force