What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
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.
#1 Best Overall
- 1.1 GHz (boost up to 2.4GHz) Intel Celeron N5030 Quad-Core
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
ProvTracefiles in ETL, XML, and TXT formats and aProvLogReportXLS 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
- 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.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Rank #3
- 14" diagonal, 1366x768 resolution, HD BrightView LED, Glossy NON-TOUCH Display
[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
- 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.
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.
Best Value
- 【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”
- 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.
- Read the provisioning output after the command returns. Start with
ProvTrace*.TXTfor readable detail, then preserve the ETL, XML, and report files for deeper analysis. Compare file and transcript timestamps with when the status stopped changing. - 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.
- 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.
- 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.
- 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
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.




