Files
winutil/docs/content/dev/features/Fixes/CorruptionScan.md
Gabi f59598cf07 Update-docs (#3889)
* Update _index.md

* Rename AH.md to Activity.md

* Update Activity.md

* Update Activity.md

* Update Activity.md

* Update ConsumerFeatures.md

* Update and rename DVR.md to GameDVR.md

* Update DeleteTempFiles.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/DisableRecall.md

* Update _index.md

* Update _index.md

* Update DiskCleanup.md

* Update EdgeDebloat.md

* Update Activity.md

* Update EndTaskOnTaskbar.md

* Update ConsumerFeatures.md

* Update GameDVR.md

* Update and rename Hiber.md to Hibernation.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/Home.md

* Update IPv46.md

* Update LaptopHibernation.md

* Update and rename Loc.md to Location.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/Powershell7.md

* Update Powershell7Tele.md

* Update RestorePoint.md

* Update Services.md

* Update Storage.md

* Update Tele.md

* Rename Tele.md to Telemetry.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/Wifi.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update and rename RemoveUltPerf.md to RemoveProfile.md

* Delete docs/content/dev/tweaks/Performance-Plans/AddUltPerf.md

* Rename RemoveProfile.md to Profile.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update BingSearch.md

* Update DarkMode.md

* Update DetailedBSoD.md

* Update HiddenFiles.md

* Update MouseAcceleration.md

* Update NumLock.md

* Update ShowExt.md

* Update SnapFlyout.md

* Update SnapSuggestion.md

* Update SnapWindow.md

* Update StickyKeys.md

* Update TaskView.md

* Update TaskbarAlignment.md

* Update TaskbarSearch.md

* Update TaskbarWidgets.md

* Update VerboseLogon.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update BlockAdobeNet.md

* Update DeBloat.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DebloatAdobe.md

* Update DisableBGapps.md

* Update DisableFSO.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableLMS1.md

* Update DisableNotifications.md

* Update and rename Disableipsix.md to DisableIPv6.md

* Update Display.md

* Update OOSUbutton.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveCopilot.md

* Update and rename RemoveEdge.md to EdgeUninstall.md

* Update and rename RemoveHomeGallery.md to RemoveHome.md

* Create RemoveGallery.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveOnedrive.md

* Update RightClickMenu.md

* Update Teredo.md

* Update UTC.md

* Update Undoall.md

* Update button.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/changedns.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/button.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/Undoall.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update DisableLegacyRecovery.md

* Delete docs/content/dev/features/Features/DisableSearchSuggestions.md

* Update EnableLegacyRecovery.md

* Update DisableLegacyRecovery.md

* Delete docs/content/dev/features/Features/EnableSearchSuggestions.md

* Delete docs/content/dev/features/Features/Install.md

* Update RegBackup.md

* Update Sandbox.md

* Update dotnet.md

* Update hyperv.md

* Update legacymedia.md

* Update nfs.md

* Update wsl.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update Autologin.md

* Update and rename DISM.md to CorruptionScan.md

* Update Network.md

* Update RunAdobeCCCleanerTool.md

* Update Update.md

* Update Winget.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update control.md

* Update network.md

* Update power.md

* Update printer.md

* Update region.md

* Update sound.md

* Update system.md

* Update user.md

* Update _index.md

* Update _index.md

* Update _index.md

* Delete docs/assets/images/Compile.png

* Add files via upload

* Update KnownIssues.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Delete docs/archetypes directory

* Delete docs/i18n directory

* Delete docs/assets/images/Install/Installation-completion.png

* Delete docs/assets/images/Install/track-progress.png

* Delete docs/assets/images/microwin/dism++_drivercontrol.png

* Delete docs/assets/images/microwin/dism++_driverexport.png

* Delete docs/assets/images/microwin/dt_activeinst.png

* Delete docs/assets/images/microwin/dt_exportdrvs.png

* Delete docs/assets/images/microwin/dt_exporttarget.png

* Rename microwin-customuser-dark.png to microwin-user-dark.png

* Rename microwin-customuser-light.png to microwin-user-light.png

* Delete docs/assets/images/microwin/microwin-downloader-dark.png

* Delete docs/assets/images/microwin/microwin-downloader-light.png

* Delete docs/assets/images/microwin/microwin-screen-dark.png

* Delete docs/assets/images/microwin/microwin-screen-full-dark.png

* Delete docs/assets/images/microwin/microwin-screen-full-light.png

* Delete docs/assets/images/microwin/microwin-screen-light.png

* Delete docs/assets/images/microwin/microwin-skuselect-dark.png

* Delete docs/assets/images/microwin/microwin-skuselect-light.png

* Delete docs/assets/images/microwin/microwin-user-dark.png

* Delete docs/assets/images/microwin/microwin-user-light.png

* Delete docs/assets/images/microwin/rapr_folderpicker.png

* Delete docs/assets/images/microwin/rapr_menu.png

* Create 4

* Add files via upload

* Delete docs/assets/images/microwin/4

* Delete docs/assets/images/microwin/Configure-Windows-ISO.png

* Add files via upload

* Delete docs/assets/images/microwin/Configure-Windows-ISO.png

* Add files via upload

* Create default.md

* Fix formatting in automation user guide

* Fix typo in Edge uninstall link text

* Fix typo in DeBloat.md description

Corrected a typo in the description of the WPFTweaksDeBloat section.

* Update links for Delete Temp Files and Activity History

* fix bad urls

* update typos

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-01-14 12:28:45 -06:00

6.3 KiB

System Corruption Scan

function Invoke-WPFSystemRepair {
    <#
    .SYNOPSIS
        Checks for system corruption using Chkdsk, SFC, and DISM

    .DESCRIPTION
        1. Chkdsk    - Fixes disk and filesystem corruption
        2. SFC Run 1 - Fixes system file corruption, and fixes DISM if it was corrupted
        3. DISM      - Fixes system image corruption, and fixes SFC's system image if it was corrupted
        4. SFC Run 2 - Fixes system file corruption, this time with an almost guaranteed uncorrupted system image
    #>

    function Invoke-Chkdsk {
        <#
        .SYNOPSIS
            Runs chkdsk on the system drive
        .DESCRIPTION
            Chkdsk /Scan - Runs an online scan on the system drive, attempts to fix any corruption, and queues other corruption for fixing on reboot
        #>
        param(
            [int]$parentProgressId = 0
        )

        Write-Progress -Id 1 -ParentId $parentProgressId -Activity $childProgressBarActivity -Status "Running chkdsk..." -PercentComplete 0
        $oldpercent = 0
        # 2>&1 redirects stdout, allowing iteration over the output
        chkdsk.exe /scan /perf 2>&1 | ForEach-Object {
            Write-Debug $_
            # Regex to match the total percentage regardless of windows locale (it's always the second percentage in the status output)
            if ($_ -match "%.*?(\d+)%") {
                [int]$percent = $matches[1]
                if ($percent -gt $oldpercent) {
                    Write-Progress -Id 1 -Activity $childProgressBarActivity -Status "Running chkdsk... ($percent%)" -PercentComplete $percent
                    $oldpercent = $percent
                }
            }
        }
        Write-Progress -Id 1 -Activity $childProgressBarActivity -Status "chkdsk Completed" -PercentComplete 100 -Completed
    }

    function Invoke-SFC {
        <#
        .SYNOPSIS
            Runs sfc on the system drive
        .DESCRIPTION
            SFC /ScanNow - Performs a scan of the system files and fixes any corruption
        .NOTES
            ErrorActionPreference is set locally within a script block & {...} to isolate their effects.
            ErrorActionPreference suppresses false errors caused by sfc.exe output redirection.
            A bug in SFC output buffering causes progress updates to appear in chunks when redirecting output
        #>
        param(
            [int]$parentProgressId = 0
        )
        & {
            $ErrorActionPreference = "SilentlyContinue"
            Write-Progress -Id 1 -ParentId $parentProgressId -Activity $childProgressBarActivity -Status "Running SFC..." -PercentComplete 0
            $oldpercent = 0
            sfc.exe /scannow 2>&1 | ForEach-Object {
                Write-Debug $_
                if ($_ -ne "") {
                    # sfc.exe /scannow outputs unicode characters, so we directly remove null characters for optimization
                    $utf8line = $_ -replace "`0", ""
                    if ($utf8line -match "(\d+)\s*%") {
                        [int]$percent = $matches[1]
                        if ($percent -gt $oldpercent) {
                            Write-Progress -Id 1 -Activity $childProgressBarActivity -Status "Running SFC... ($percent%)" -PercentComplete $percent
                            $oldpercent = $percent
                        }
                    }
                }
            }
            Write-Progress -Id 1 -Activity $childProgressBarActivity -Status "SFC Completed" -PercentComplete 100 -Completed
        }
    }

    function Invoke-DISM {
        <#
        .SYNOPSIS
            Runs DISM on the system drive
        .DESCRIPTION
            DISM                - Fixes system image corruption, and fixes SFC's system image if it was corrupted
              /Online           - Fixes the currently running system image
              /Cleanup-Image    - Performs cleanup operations on the image, could remove some unneeded temporary files
              /Restorehealth    - Performs a scan of the image and fixes any corruption
        #>
        param(
            [int]$parentProgressId = 0
        )
        Write-Progress -Id 1 -ParentId $parentProgressId -Activity $childProgressBarActivity -Status "Running DISM..." -PercentComplete 0
        $oldpercent = 0
        DISM /Online /Cleanup-Image /RestoreHealth | ForEach-Object {
            Write-Debug $_
            # Filter for lines that contain a percentage that is greater than the previous one
            if ($_ -match "(\d+)[.,]\d+%") {
                [int]$percent = $matches[1]
                if ($percent -gt $oldpercent) {
                    # Update the progress bar
                    Write-Progress -Id 1 -Activity $childProgressBarActivity -Status "Running DISM... ($percent%)" -PercentComplete $percent
                    $oldpercent = $percent
                }
            }
        }
        Write-Progress -Id 1 -Activity $childProgressBarActivity -Status "DISM Completed" -PercentComplete 100 -Completed
    }

    try {
        Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo"

        $childProgressBarActivity = "Scanning for corruption"
        Write-Progress -Id 0 -Activity "Repairing Windows" -PercentComplete 0
        # Step 1: Run chkdsk to fix disk and filesystem corruption before proceeding with system file repairs
        Invoke-Chkdsk
        Write-Progress -Id 0 -Activity "Repairing Windows" -PercentComplete 25

        # Step 2: Run SFC to fix system file corruption and ensure DISM can operate correctly
        Invoke-SFC
        Write-Progress -Id 0 -Activity "Repairing Windows" -PercentComplete 50

        # Step 3: Run DISM to repair the system image, which SFC relies on for accurate repairs
        Invoke-DISM
        Write-Progress -Id 0 -Activity "Repairing Windows" -PercentComplete 75

        # Step 4: Run SFC again to ensure system files are repaired using the now-fixed system image
        Invoke-SFC
        Write-Progress -Id 0 -Activity "Repairing Windows" -PercentComplete 100 -Completed

        Set-WinUtilTaskbaritem -state "None" -overlay "checkmark"
    } catch {
        Write-Error "An error occurred while repairing the system: $_"
        Set-WinUtilTaskbaritem -state "Error" -overlay "warning"
    } finally {
        Write-Host "==> Finished System Repair"
        Set-WinUtilTaskbaritem -state "None" -overlay "checkmark"
    }

}