October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsClean PCRecommendedOne scan can reveal what keeps slowing WindowsLook for cleanup and repair opportunities.Run ScanOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
PowerShell

How to Log Windows Provisioning Package Installation and Show Progress in PowerShell

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To troubleshoot a Windows provisioning package (.ppkg), have PowerShell create a timestamped transcript, pass a separate directory to the provisioning cmdlet for its trace files, and show phase-based status with Write-Progress. The progress bar can tell you that the wrapper is waiting for installation or collecting results; it generally cannot report the provisioning engine’s exact percentage complete.

The script below detects the available cmdlet and uses its corresponding log parameter. It is a Windows 10/11 deployment baseline, not proof that every setting or application has taken effect: validate the outcome required by your deployment separately.

Choose the provisioning cmdlet available on the target

A provisioning package is a .ppkg file, commonly created with Windows Configuration Designer or another provisioning workflow. Applying one can change device settings, policies, enrollment state, certificates, accounts, and applications. Microsoft documents package application for Windows 10 and Windows 11 client systems and says applying a package to a desktop device requires administrator privileges. Run the deployment in the intended security context and use only packages your organization trusts. See Microsoft’s provisioning package application guidance.

For current Windows client provisioning documentation, Microsoft lists Add-ProvisioningPackage, which accepts -Path and -LogsFolder. The separately documented Install-ProvisioningPackage uses -PackagePath and -LogsDirectoryPath; its reference identifies support for Windows 10 client. Do not assume the cmdlets or parameter names are interchangeable across builds. Check command and parameter availability on the Windows versions you deploy. See Microsoft’s Windows provisioning PowerShell cmdlets and Install-ProvisioningPackage reference.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What the script records—and what it cannot record

  • Wrapper transcript: PowerShell messages, timestamps, and other session output written while the transcript is active. This helps establish what the script did and when.
  • Provisioning-engine logs: The cmdlet’s specified log directory can contain ProvTrace files in ETL, XML, and TXT formats and a ProvLogReport XLS report. These may be finalized after the provisioning command returns, so collect and list them afterward rather than assuming they are ready to tail live. Microsoft describes these outputs in its provisioning cmdlet documentation.
  • Child-installer logs: An MSI, EXE, AppX/MSIX deployment, or script launched by a package may need its own logging options. A provisioning trace can help identify the operation that ran, but it is not necessarily a complete diagnostic log for an arbitrary installer.

Keep diagnostic output in a durable, access-controlled location. Packages and logs can contain sensitive configuration, credentials, or certificate-related information; review and redact material before sharing it.

Use truthful, phase-based progress

Write-Progress displays a PowerShell command-window progress bar. It reports the status your wrapper supplies, not a live percentage from the provisioning engine. The stages below are operational markers, not measured fractions of the package work:

Rank #2
Dell Latitude 5420 14" FHD Business Laptop Computer, Intel Quad-Core i5-1145G7, 16GB DDR4 RAM, 256GB SSD, Camera, HDMI, Windows 11 Pro (Renewed)
  • 256 GB SSD of storage.
  • Multitasking is easy with 16GB of RAM
  • Equipped with a blazing fast Core i5 2.00 GHz processor.
Displayed phase Example percentage What it means
Validate package 5% The wrapper is checking its input.
Prepare logs 15% The run directory and transcript path are being prepared.
Start provisioning 25% The provisioning command is about to run.
Provisioning command running 50% The wrapper is waiting; this is not the engine’s completion percentage.
Collect logs 90% The command returned and the wrapper is gathering its output.
Wrapper complete 100% The wrapper finished its final stage; validate required device outcomes separately.

A timer-based percentage is misleading because installation duration varies and elapsed time does not establish how much work remains. For a command that may take a long time, a stable “provisioning engine is running” status is more honest than a percentage that appears to advance without evidence. The bar may be hidden if $ProgressPreference is set to 'SilentlyContinue'; Microsoft documents this behavior in its Write-Progress reference.

PowerShell script with transcript, provisioning logs, and progress

Save the following as a .ps1 file and run it in the same context in which the package is intended to apply. Supply the package path as the first argument. The script creates a timestamped directory under C:ProgramDataProvisioningDiagnostics by default.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
[CmdletBinding()]
param(
    [Parameter(Mandatory = $true)]
    [ValidateNotNullOrEmpty()]
    [string]$PackagePath,

    [ValidateNotNullOrEmpty()]
    [string]$OutputRoot = 'C:ProgramDataProvisioningDiagnostics'
)

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'

$PackagePath = [System.IO.Path]::GetFullPath($PackagePath)
$OutputRoot = [System.IO.Path]::GetFullPath($OutputRoot)

if (-not (Test-Path -LiteralPath $PackagePath -PathType Leaf)) {
    throw "Provisioning package was not found: $PackagePath"
}

if ([System.IO.Path]::GetExtension($PackagePath) -ine '.ppkg') {
    throw "Input file does not have a .ppkg extension: $PackagePath"
}

$timestamp = Get-Date -Format 'yyyyMMdd-HHmmss'
$runRoot = Join-Path $OutputRoot $timestamp
$logsFolder = Join-Path $runRoot 'ProvisioningLogs'
$transcriptPath = Join-Path $runRoot 'ProvisioningWrapper.log'

New-Item -ItemType Directory -Path $logsFolder -Force | Out-Null
$transcriptStarted = $false

try {
    Start-Transcript -Path $transcriptPath -Force | Out-Null
    $transcriptStarted = $true

    Write-Progress -Activity 'Installing provisioning package' `
        -Status 'Validating package and preparing logs' -PercentComplete 5

    Write-Host "Package: $PackagePath"
    Write-Host "Run folder: $runRoot"
    Write-Host "Provisioning logs: $logsFolder"

    Write-Progress -Activity 'Installing provisioning package' `
        -Status 'Starting provisioning engine' -PercentComplete 25

    $startTime = Get-Date
    $result = $null
    $cmdletName = $null

    $addCommand = Get-Command Add-ProvisioningPackage -ErrorAction SilentlyContinue
    if ($addCommand) {
        $cmdletName = 'Add-ProvisioningPackage'
        $result = Add-ProvisioningPackage `
            -Path $PackagePath `
            -LogsFolder $logsFolder `
            -ForceInstall `
            -QuietInstall `
            -Verbose 4>&1
    }
    else {
        $installCommand = Get-Command Install-ProvisioningPackage -ErrorAction SilentlyContinue
        if (-not $installCommand) {
            throw 'Neither Add-ProvisioningPackage nor Install-ProvisioningPackage is available.'
        }

        $cmdletName = 'Install-ProvisioningPackage'
        $result = Install-ProvisioningPackage `
            -PackagePath $PackagePath `
            -LogsDirectoryPath $logsFolder `
            -ForceInstall `
            -QuietInstall `
            -Verbose 4>&1
    }

    $duration = (Get-Date) - $startTime

    Write-Progress -Activity 'Installing provisioning package' `
        -Status 'Collecting generated logs' -PercentComplete 90

    $generatedLogs = @(Get-ChildItem -LiteralPath $logsFolder -File -ErrorAction SilentlyContinue)

    $result | Out-File -FilePath (Join-Path $runRoot 'CommandOutput.txt') -Encoding utf8
    $generatedLogs |
        Select-Object Name, Length, LastWriteTime, FullName |
        Format-Table -AutoSize |
        Out-File -FilePath (Join-Path $runRoot 'GeneratedFiles.txt') -Encoding utf8

    Write-Host "Cmdlet returned: $cmdletName"
    Write-Host "Elapsed time: $($duration.ToString())"
    Write-Host "Generated provisioning log files: $($generatedLogs.Count)"
    Write-Host "Run folder: $runRoot"

    Write-Progress -Activity 'Installing provisioning package' `
        -Status 'Wrapper completed' -PercentComplete 100 -Completed
}
catch {
    $failurePath = Join-Path $runRoot 'Failure.txt'
    $_ | Out-String | Out-File -FilePath $failurePath -Encoding utf8

    Write-Progress -Activity 'Installing provisioning package' `
        -Status 'Failed; review Failure.txt and the available logs' `
        -PercentComplete 100 -Completed
    throw
}
finally {
    if ($transcriptStarted) {
        Stop-Transcript -ErrorAction SilentlyContinue | Out-Null
    }
}

Example invocation:

.Install-PpkgWithLogs.ps1 -PackagePath 'C:DeployDeviceSetup.ppkg'

Replace the example script name with the name you saved. The resulting run folder contains ProvisioningWrapper.log, CommandOutput.txt, GeneratedFiles.txt, and a ProvisioningLogs directory. On failure, Failure.txt records the terminating error. Because provisioning trace files can be produced when the command finishes, a failure during the command may leave that directory empty or incomplete.

The example uses -QuietInstall for unattended operation. That suppresses customer interaction; it is not appropriate when a visible confirmation or prompt is part of the workflow. A hidden prompt in a noninteractive context can make an installation appear stuck. Test the selected switches and cmdlet on each supported target build before broad deployment.

Rank #4
15.6 Inch Laptop Computer, N4020, 4GB DDR4 RAM, 128GB eMMC,with Windows 11
  • EFFORTLESS EVERYDAY PERFORMANCE: Powered by Intel Celeron N4020 processor and Windows 11 Home system, delivering reliable, low-power efficiency for daily tasks like document editing, email, online classes, and web browsing
  • 15.6-INCH FULL HD DISPLAY: Enjoy immersive visuals on the 15.6" FHD (1920x1080) anti-glare screen with micro-edge bezels. Delivers clear details and comfortable viewing for long study sessions, working on spreadsheets, and video playback
  • RESPONSIVE MULTITASKING & STORAGE: Built with 4GB LPDDR4 RAM and 128GB eMMC storage for smooth daily essential use. Expand your storage by up to 1TB via the integrated TF card slot to easily store movies, photos, and working files
  • ADVANCED CONNECTIVITY: Outfitted with 2x Full-Featured Type-C ports for data transfer, fast charging, and dual-monitor output, alongside 2x USB 3.2 Gen1 ports and a 3.5mm audio jack for complete peripheral compatibility
  • LIGHTWEIGHT & SILENT OPERATION: Slim and portable for effortless travel or commuting. Features a 1MP HD webcam for remote meetings, 38Wh battery with 45W Type-C fast charging, and a fanless silent design for peaceful work environments.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Capture logs and exit codes from child installers

Provisioning success and child-installer success are related but distinct. Configure each embedded command to write its own diagnostics and return a meaningful exit code. For example, a wrapper that launches an MSI can use verbose Windows Installer logging and capture the process result:

$msiLogPath = Join-Path $runRoot 'ApplicationInstall.log'
$arguments = "/i `"$MsiPath`" /qn /L*v `"$msiLogPath`""
$process = Start-Process -FilePath 'msiexec.exe' `
    -ArgumentList $arguments -Wait -PassThru
$childExitCode = $process.ExitCode
"MSI exit code: $childExitCode" | Out-File `
    -FilePath (Join-Path $runRoot 'ApplicationExitCode.txt') -Encoding utf8

Use the application vendor’s documented silent and logging switches for an EXE; there is no universal EXE logging syntax. A PowerShell child can redirect streams to a file, but if launched as a separate process, also capture that process’s exit code. Avoid adding -ExecutionPolicy Bypass reflexively: use it only when the deployment policy explicitly permits it and the script’s provenance and controls are understood.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Windows 11 Laptop with i3 Processor 15.6" Work Laptop for College Students
  • 【Efficient Performance】 Powered by Intel Core i3 processor (2 cores, 4 threads, up to 3.4GHz) with 12GB RAM and 256GB SSD. Handles multitasking, office software, online classes, and HD video streaming smoothly. Integrated Intel UHD Graphics 620
  • Backlit Keyboard & Complete Package】Comes with a cool backlit keyboard. Comes with awebcam, dual stereo speakers (8Ω/1.0W each), DC charger, and user manual – ready for late-night studying, online classes, video conferencing, and daily productivity
  • 【Vibrant Display】 15.6-inch Full HD (1920x1080) anti-glare screen with 16:9 aspect ratio delivers crisp images and vivid colors – perfect for studying, watching lectures, or entertainment. Thin-bezel design maximizes viewing area
  • 【Fast Connectivity & Expansion】 Equipped with WiFi 6 (802.11ax) and Bluetooth 5.2 for stable, high-speed wireless. Features 3 x USB 3.0, HDMI 2.1, Type-C (supports PD3.0 fast charging), and a TF card slot expandable up to 2TB – easily connect external monitors, mice, drives, or expand storage for all your files
  • 【Long Battery Life & Portable】 Built-in 11.55V 5000mAh/57.75Wh high-capacity battery delivers approximately 7 hours of mixed-use battery life – enough for a full day of classes and assignments. Lightweight at just 1.63kg (3.6 lbs) and 19.5mm thin, plus a compact packing size – easily slips into a backpack for campus, library, or coffee shop

Troubleshoot a package that appears stuck at “Pending”

  1. Establish whether the wrapper is still active. Check the transcript’s latest timestamp and the PowerShell process. Determine whether the provisioning cmdlet is still running or waiting on a child installer; a long wait alone does not prove a hang.
  2. Read the provisioning output after the command returns. Start with ProvTrace*.TXT for readable detail, then preserve the ETL, XML, and report files for deeper analysis. Compare file and transcript timestamps with when the status stopped changing.
  3. Investigate each child operation. Check MSI verbose logs, vendor-specific EXE logs, and redirected script output. Confirm the installer supports unattended switches and does not wait for UI input that is invisible in the package’s security context.
  4. Check Windows event logs relevant to the operation. For AppX/MSIX content, use the applicable app deployment logs; Microsoft’s Windows app packaging and deployment troubleshooting guidance describes using detailed event logs when an error code is insufficient.
  5. Collect broader provisioning diagnostics when needed. Run the Microsoft diagnostic tool from an elevated context, choosing a writable output directory:
    MdmDiagnosticsTool.exe -out 'C:ProgramDataProvisioningDiagnosticsMdmDiag'

    Microsoft documents the tool for provisioning diagnosis; it collects evidence rather than repairing every failure. Its diagnostic guidance notes additional multivariant-condition information in reports on Windows 11 version 22H2 and later.

  6. Check context, prerequisites, and restart behavior. A package run interactively can behave differently under device or system context. Some settings or applications need a restart before their effects are visible. Microsoft also documents context-specific requirements for certain operations, including some power settings, in its provisioning diagnostic guidance.

Microsoft describes pressing Esc to interrupt a long-running operation in the documented interactive application workflow. That does not establish that forcibly stopping a separate quiet PowerShell process is safe; preserve available logs and use the recovery procedure appropriate to your deployment environment.

Define success independently of the progress bar

In this script, reaching the end without a terminating error means the provisioning cmdlet returned and the wrapper completed log collection. It does not prove that every application launched by the package succeeded, that conditional package settings applied, or that a restart-dependent change is already visible. Use the cmdlet outcome and its logs together with deployment-specific post-install checks. A 100% bar is a wrapper status—not a Windows provisioning-engine percentage or a device-health verdict.

Quick Recap

Bestseller No. 1
Bestseller No. 2
Dell Latitude 5420 14' FHD Business Laptop Computer, Intel Quad-Core i5-1145G7, 16GB DDR4 RAM, 256GB SSD, Camera, HDMI, Windows 11 Pro (Renewed)
Dell Latitude 5420 14" FHD Business Laptop Computer, Intel Quad-Core i5-1145G7, 16GB DDR4 RAM, 256GB SSD, Camera, HDMI, Windows 11 Pro (Renewed)
256 GB SSD of storage.; Multitasking is easy with 16GB of RAM; Equipped with a blazing fast Core i5 2.00 GHz processor.
$304.99
Bestseller No. 3
HP 14' HD Laptop, Windows 11, Intel Celeron Dual-Core Processor Up to 2.60GHz, 4GB RAM, 64GB SSD, Webcam, Dale Pink (Renewed)
HP 14" HD Laptop, Windows 11, Intel Celeron Dual-Core Processor Up to 2.60GHz, 4GB RAM, 64GB SSD, Webcam, Dale Pink (Renewed)
14" diagonal, 1366x768 resolution, HD BrightView LED, Glossy NON-TOUCH Display
$249.99

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Read next

Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.