sample.ps1

function Invoke-SccmOfflineUpgradeWorkflow {
    param(
        [string]$SiteCode   = 'TST',
        [string]$SiteServer = 'srvtst.domain.com',
        [string]$ModuleUNC  = '\\srvtst\offline\Module',
        [string]$RootUNC    = '\\srvtst\offline',
        [string]$SvcToolPathOffline = 'X:\ConfigMgr\cd.latest\SMSSETUP\TOOLS\ServiceConnectionTool'
    )

    # Yollar
    $ExportDir   = Join-Path $RootUNC 'Export'
    $DownloadDir = Join-Path $RootUNC 'Download'
    $ImportDir   = Join-Path $RootUNC 'Import'
    $LogsDir     = Join-Path $RootUNC 'Logs'

    $ExportZip   = Join-Path $ExportDir   'TST-UsageData-And-Tool.zip'
    $ExportLog   = Join-Path $LogsDir     'Export-TST.log'
    $PackageZip  = Join-Path $ImportDir   'TST-UpdatePacks.zip'
    $OnlineLog   = Join-Path $LogsDir     'OnlineDownload-TST.log'
    $ErrorLog    = Join-Path $LogsDir     'OnlineDownloadErrors-TST.log'
    $ImportLog   = Join-Path $LogsDir     'Import-TST.log'

    # Klasörleri hazırla
    foreach ($p in @($ExportDir,$DownloadDir,$ImportDir,$LogsDir)) {
        if (-not (Test-Path $p)) { New-Item -ItemType Directory -Path $p -Force | Out-Null }
    }

    # DLL import
    $dllPath = Join-Path $ModuleUNC 'SccmOfflineUpgrade.dll'
    if (-not (Test-Path $dllPath)) {
        throw "DLL not found: $dllPath"
    }
    Import-Module $dllPath -Force

    # Versiyon bilgisi
    function Show-CurrentVersion {
        try {
            $ns = "root\SMS\site_$SiteCode"
            $site = Get-CimInstance -Namespace $ns -ClassName SMS_Site -ComputerName $SiteServer -ErrorAction Stop
            if ($site.Version) {
                Write-Host ("Current SCCM Version: {0} (Build {1})" -f $site.Version,$site.BuildNumber) -ForegroundColor Cyan
                return
            }
        } catch {}
        try {
            $full = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\SMS\Setup' -Name 'Full Version' -ErrorAction Stop).'Full Version'
            if ($full) { Write-Host "Current SCCM Version (registry): $full" -ForegroundColor Cyan }
        } catch {}
    }

    function Show-LatestUpdateHint {
        try {
            $ns = "root\SMS\site_$SiteCode"
            $upd = Get-CimInstance -Namespace $ns -ClassName SMS_CM_UpdatePackages -ComputerName $SiteServer |
                   Sort-Object CreationDate -Descending | Select-Object -First 1 Name,State
            if ($upd) { Write-Host "Latest Available Update: $($upd.Name) [State: $($upd.State)]" -ForegroundColor Yellow }
        } catch {
            Write-Host "Could not query latest update via WMI: $($_.Exception.Message)" -ForegroundColor DarkYellow
        }
    }

    # Fazlar
    function Phase-1-Prepare {
        Show-CurrentVersion
        Write-Host "=== PHASE 1: OFFLINE PREPARE ===" -ForegroundColor Green

        Export-SccmOfflinePackage `
            -OutputZip $ExportZip `
            -LogPath   $ExportLog `
            -ServiceConnectionToolPath $SvcToolPathOffline `
            -StagingRoot $ExportDir `
            -UsageDataCabName 'UsageData.cab' `
            -EnsureOdbc18 `
            -OdbcInstallerPath (Join-Path $ModuleUNC 'Prereqs\ODBC18\msodbcsql18.msi') `
            -Verbose

        Write-Host "PREPARE complete." -ForegroundColor Green
    }

    function Phase-2-Download {
        Write-Host "=== PHASE 2: ONLINE DOWNLOAD ===" -ForegroundColor Green

        Invoke-SccmOnlineDownload `
            -InputZip $ExportZip `
            -DownloadOutput $DownloadDir `
            -OutputZip $PackageZip `
            -LogPath $OnlineLog `
            -ErrorLogPath $ErrorLog `
            -IncludeOdbc18 `
            -EnsureOdbc18 `
            -Verbose

        Write-Host "DOWNLOAD complete." -ForegroundColor Green
    }

    function Phase-3-Import {
        Show-CurrentVersion
        Write-Host "=== PHASE 3: OFFLINE IMPORT ===" -ForegroundColor Green

        Import-SccmOfflineUpdates `
            -InputZip $PackageZip `
            -LogPath $ImportLog `
            -ServiceConnectionToolPath $SvcToolPathOffline `
            -StagingRoot $ImportDir `
            -RunPrereqCheck `
            -TriggerUpgrade `
            -SiteCode $SiteCode `
            -SiteServer $SiteServer `
            -Verbose

        Show-LatestUpdateHint
        Write-Host "IMPORT complete." -ForegroundColor Green
    }

    # Menü
    Write-Host ""
    Write-Host "SCCM Offline Upgrade Workflow" -ForegroundColor White
    Write-Host "1) Phase 1 - OFFLINE PREPARE"
    Write-Host "2) Phase 2 - ONLINE DOWNLOAD"
    Write-Host "3) Phase 3 - OFFLINE IMPORT"
    $choice = Read-Host "Select phase (1/2/3)"

    switch ($choice) {
        '1' { Phase-1-Prepare }
        '2' { Phase-2-Download }
        '3' { Phase-3-Import }
        default { Write-Host "Invalid choice" -ForegroundColor Red }
    }
}