mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2026-08-10 01:51:18 +10:00
* Fix Windows PowerShell runspace cleanup callback * Fix installed app package ID matching * Synchronize installed app selection UI * Streamline installed app detection * Avoid installed app UI runspace deadlock
130 lines
4.6 KiB
PowerShell
130 lines
4.6 KiB
PowerShell
Function Invoke-WinUtilCurrentSystem {
|
|
|
|
<#
|
|
|
|
.SYNOPSIS
|
|
Checks to see what tweaks have already been applied and what programs are installed, and checks the according boxes
|
|
|
|
.EXAMPLE
|
|
InvokeWinUtilCurrentSystem -Checkbox "winget"
|
|
|
|
#>
|
|
|
|
param(
|
|
$CheckBox
|
|
)
|
|
if ($CheckBox -eq "choco") {
|
|
$apps = (choco list | Select-String -Pattern "^\S+").Matches.Value
|
|
$sync.configs.applicationsHashtable.GetEnumerator() | ForEach-Object {
|
|
$packageId = ($_.Value.choco -split ";")[-1].Trim()
|
|
if ($packageId -ne "na" -and $packageId -in $apps) {
|
|
Write-Output $_.Key
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($checkbox -eq "winget") {
|
|
$originalEncoding = [Console]::OutputEncoding
|
|
try {
|
|
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
|
|
$installedProgramOutput = @(winget list --accept-source-agreements --disable-interactivity 2>&1)
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "winget list failed with exit code $LASTEXITCODE."
|
|
}
|
|
} finally {
|
|
[Console]::OutputEncoding = $originalEncoding
|
|
}
|
|
$installedProgramText = $installedProgramOutput -join "`n"
|
|
|
|
$sync.configs.applicationsHashtable.GetEnumerator() | ForEach-Object {
|
|
$packageId = (($_.Value.winget -split ";")[-1] -replace "^msstore:", "").Trim()
|
|
if ([string]::IsNullOrWhiteSpace($packageId) -or $packageId -eq "na") {
|
|
return
|
|
}
|
|
|
|
$packagePattern = "(?im)[^\S\r\n]{2,}$([regex]::Escape($packageId))(?=[^\S\r\n]{2,}|$)"
|
|
if ($installedProgramText -match $packagePattern) {
|
|
Write-Output $_.Key
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($CheckBox -eq "tweaks") {
|
|
|
|
if (!(Test-Path 'HKU:\')) {$null = (New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS)}
|
|
|
|
$sync.configs.tweaks | Get-Member -MemberType NoteProperty | ForEach-Object {
|
|
|
|
$Config = $psitem.Name
|
|
$entry = $sync.configs.tweaks.$Config
|
|
$registryKeys = $entry.registry
|
|
$serviceKeys = $entry.service
|
|
$entryType = $entry.Type
|
|
|
|
if ($registryKeys -or $serviceKeys) {
|
|
$Values = @()
|
|
|
|
if ($entryType -eq "Toggle") {
|
|
if (-not (Get-WinUtilToggleStatus $Config)) {
|
|
$values += $False
|
|
}
|
|
} else {
|
|
$registryMatchCount = 0
|
|
$registryTotal = 0
|
|
|
|
Foreach ($tweaks in $registryKeys) {
|
|
Foreach ($tweak in $tweaks) {
|
|
$registryTotal++
|
|
$regstate = $null
|
|
|
|
if (Test-Path $tweak.Path) {
|
|
$regstate = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name)
|
|
}
|
|
|
|
if ($null -eq $regstate) {
|
|
switch ($tweak.DefaultState) {
|
|
"true" {
|
|
$regstate = $tweak.Value
|
|
}
|
|
"false" {
|
|
$regstate = $tweak.OriginalValue
|
|
}
|
|
default {
|
|
$regstate = $tweak.OriginalValue
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($regstate -eq $tweak.Value) {
|
|
$registryMatchCount++
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($registryTotal -gt 0 -and $registryMatchCount -ne $registryTotal) {
|
|
$values += $False
|
|
}
|
|
}
|
|
|
|
Foreach ($tweaks in $serviceKeys) {
|
|
Foreach ($tweak in $tweaks) {
|
|
$Service = Get-Service -Name $tweak.Name
|
|
|
|
if ($Service) {
|
|
$actualValue = $Service.StartType
|
|
$expectedValue = $tweak.StartupType
|
|
if ($expectedValue -ne $actualValue) {
|
|
$values += $False
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($values -notcontains $false) {
|
|
Write-Output $Config
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|