diff --git a/Compile.ps1 b/Compile.ps1
index 69265228..1bb5b03f 100644
--- a/Compile.ps1
+++ b/Compile.ps1
@@ -15,7 +15,7 @@ Write-output '
################################################################################################################
' | Out-File ./$scriptname -Append -Encoding ascii
-(Get-Content .\scripts\start.ps1).replace('#{replaceme}',"$(get-date -format yy.MM.dd)") | Out-File ./$scriptname -Append -Encoding ascii
+(Get-Content .\scripts\start.ps1).replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)") | Out-File ./$scriptname -Append -Encoding ascii
Get-ChildItem .\functions -Recurse -File | ForEach-Object {
Get-Content $psitem.FullName | Out-File ./$scriptname -Append -Encoding ascii
@@ -23,9 +23,7 @@ Get-ChildItem .\functions -Recurse -File | ForEach-Object {
Get-ChildItem .\xaml | ForEach-Object {
$xaml = (Get-Content $psitem.FullName).replace("'","''")
- $newXaml = $xaml -replace 'CTTVersion', (Get-Date -Format 'yy.MM.dd')
-
- Write-output "`$$($psitem.BaseName) = '$newXaml'" | Out-File ./$scriptname -Append -Encoding ascii
+ Write-output "`$$($psitem.BaseName) = '$xaml'" | Out-File ./$scriptname -Append -Encoding ascii
}
Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
diff --git a/config/applications.json b/config/applications.json
index 36b694d9..c5ffd996 100755
--- a/config/applications.json
+++ b/config/applications.json
@@ -71,6 +71,15 @@
"link": "https://librewolf-community.gitlab.io/",
"description": "LibreWolf is a privacy-focused web browser based on Firefox, with additional privacy and security enhancements."
},
+ "WPFInstallthorium": {
+ "winget": "Alex313031.Thorium.AVX2",
+ "choco": "na",
+ "category": "Browsers",
+ "panel": "0",
+ "content": "Thorium Browser AVX2",
+ "link": "http://thorium.rocks/",
+ "description": "Browser built for speed over vanilla chromium. It is built with AVX2 optimizations and is the fastest browser on the market."
+ },
"WPFInstalltor": {
"winget": "TorProject.TorBrowser",
"choco": "tor-browser",
@@ -653,7 +662,7 @@
"category": "Document",
"panel": "1",
"content": "Logseq",
- "link": "https://github.com/logseq/logseq/releases",
+ "link": "https://logseq.com/",
"description": "Logseq is a versatile knowledge management and note-taking application designed for the digital thinker. With a focus on the interconnectedness of ideas, Logseq allows users to seamlessly organize their thoughts through a combination of hierarchical outlines and bi-directional linking. It supports both structured and unstructured content, enabling users to create a personalized knowledge graph that adapts to their evolving ideas and insights."
},
"WPFInstallobsidian": {
@@ -961,6 +970,15 @@
"content": ".NET Desktop Runtime 7",
"description": ".NET Desktop Runtime 7 is a runtime environment required for running applications developed with .NET 7.",
"link": "https://dotnet.microsoft.com/download/dotnet/7.0"
+ },
+ "WPFInstalldotnet8": {
+ "winget": "Microsoft.DotNet.DesktopRuntime.8",
+ "choco": "dotnet-8.0-runtime",
+ "category": "Microsoft Tools",
+ "panel": "2",
+ "content": ".NET Desktop Runtime 8",
+ "description": ".NET Desktop Runtime 8 is a runtime environment required for running applications developed with .NET 7.",
+ "link": "https://dotnet.microsoft.com/download/dotnet/8.0"
},
"WPFInstallnuget": {
"winget": "Microsoft.NuGet",
@@ -1070,15 +1088,6 @@
"description": "Blender is a powerful open-source 3D creation suite, offering modeling, sculpting, animation, and rendering tools.",
"link": "https://www.blender.org/"
},
- "WPFInstallcider": {
- "winget": "CiderCollective.Cider",
- "choco": "cider",
- "category": "Multimedia Tools",
- "panel": "3",
- "content": "Cider (FOSS Music Player)",
- "description": "Cider is a free and open-source music player that focuses on simplicity, providing a clean interface for enjoying your music.",
- "link": "https://getcider.io/"
- },
"WPFInstallclementine": {
"winget": "Clementine.Clementine",
"choco": "clementine",
@@ -1925,6 +1934,15 @@
"link": "https://owncloud.com/desktop-app/",
"description": "ownCloud Desktop is the official desktop client for the ownCloud file synchronization and sharing platform."
},
+ "WPFInstallparsec": {
+ "winget": "Parsec.parsec",
+ "choco": "parsec",
+ "category": "Utilities",
+ "panel": "4",
+ "content": "Parsec",
+ "link": "https://parsec.app/",
+ "description": "Parsec is a low-latency, high-quality remote desktop sharing application for collaborating and gaming across devices."
+ },
"WPFInstallpeazip": {
"winget": "Giorgiotani.Peazip",
"choco": "peazip",
@@ -2213,4 +2231,4 @@
"link": "https://www.ghisler.com/",
"description": "Total Commander is a file manager for Windows that provides a powerful and intuitive interface for file management."
}
-}
\ No newline at end of file
+}
diff --git a/config/feature.json b/config/feature.json
index 1bb7f09f..9adf4f74 100644
--- a/config/feature.json
+++ b/config/feature.json
@@ -57,5 +57,70 @@
nfsadmin client localhost config fileaccess=755 SecFlavors=+sys -krb5 -krb5i
"
]
+ },
+ "WPFFeatureEnableSearchSuggestions": {
+ "feature": [
+ ],
+ "InvokeScript": [
+ "
+ If (!(Test-Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer')) {
+ New-Item -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Force | Out-Null
+ }
+ New-ItemProperty -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Name 'DisableSearchBoxSuggestions' -Type DWord -Value 0 -Force
+ Stop-Process -name explorer -force
+ "
+ ]
+ },
+ "WPFFeatureDisableSearchSuggestions": {
+ "feature": [
+ ],
+ "InvokeScript": [
+ "
+ If (!(Test-Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer')) {
+ New-Item -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Force | Out-Null
+ }
+ New-ItemProperty -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Name 'DisableSearchBoxSuggestions' -Type DWord -Value 1 -Force
+ Stop-Process -name explorer -force
+ "
+ ]
+ },
+ "WPFFeatureRegBackup": {
+ "feature": [
+ ],
+ "InvokeScript": [
+ "
+ New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager' -Name 'EnablePeriodicBackup' -Type DWord -Value 1 -Force
+ New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager' -Name 'BackupCount' -Type DWord -Value 2 -Force
+ $action = New-ScheduledTaskAction -Execute 'schtasks' -Argument '/run /i /tn \"\\Microsoft\\Windows\\Registry\\RegIdleBackup\"'
+ $trigger = New-ScheduledTaskTrigger -Daily -At 00:30
+ Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'AutoRegBackup' -Description 'Create System Registry Backups' -User 'System'
+ "
+ ]
+ },
+ "WPFFeatureEnableLegacyRecovery": {
+ "feature": [
+ ],
+ "InvokeScript": [
+ "
+ If (!(Test-Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood')) {
+ New-Item -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Force | Out-Null
+ }
+ New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Name 'Enabled' -Type DWord -Value 1 -Force
+ Start-Process -FilePath cmd.exe -ArgumentList '/c bcdedit /Set {Current} BootMenuPolicy Legacy' -Wait
+ "
+ ]
+ },
+ "WPFFeatureDisableLegacyRecovery": {
+ "feature": [
+ ],
+ "InvokeScript": [
+ "
+ If (!(Test-Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood')) {
+ New-Item -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Force | Out-Null
+ }
+ New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Name 'Enabled' -Type DWord -Value 0 -Force
+ Start-Process -FilePath cmd.exe -ArgumentList '/c bcdedit /Set {Current} BootMenuPolicy Standard' -Wait
+ "
+ ]
}
}
diff --git a/config/preset.json b/config/preset.json
index d7dd7957..51b48fa1 100644
--- a/config/preset.json
+++ b/config/preset.json
@@ -1,33 +1,33 @@
{
"desktop": [
- "WPFEssTweaksAH",
- "WPFEssTweaksDVR",
- "WPFEssTweaksHiber",
- "WPFEssTweaksHome",
- "WPFEssTweaksLoc",
- "WPFEssTweaksOO",
- "WPFEssTweaksServices",
- "WPFEssTweaksStorage",
- "WPFEssTweaksTele",
- "WPFEssTweaksWifi",
+ "WPFTweaksAH",
+ "WPFTweaksDVR",
+ "WPFTweaksHiber",
+ "WPFTweaksHome",
+ "WPFTweaksLoc",
+ "WPFTweaksOO",
+ "WPFTweaksServices",
+ "WPFTweaksStorage",
+ "WPFTweaksTele",
+ "WPFTweaksWifi",
"WPFMiscTweaksPower"
],
"laptop": [
- "WPFEssTweaksAH",
- "WPFEssTweaksDVR",
- "WPFEssTweaksHome",
- "WPFEssTweaksLoc",
- "WPFEssTweaksOO",
- "WPFEssTweaksServices",
- "WPFEssTweaksStorage",
- "WPFEssTweaksTele",
- "WPFEssTweaksWifi",
+ "WPFTweaksAH",
+ "WPFTweaksDVR",
+ "WPFTweaksHome",
+ "WPFTweaksLoc",
+ "WPFTweaksOO",
+ "WPFTweaksServices",
+ "WPFTweaksStorage",
+ "WPFTweaksTele",
+ "WPFTweaksWifi",
"WPFMiscTweaksLapPower"
],
"minimal": [
- "WPFEssTweaksHome",
- "WPFEssTweaksOO",
- "WPFEssTweaksServices",
- "WPFEssTweaksTele"
+ "WPFTweaksHome",
+ "WPFTweaksOO",
+ "WPFTweaksServices",
+ "WPFTweaksTele"
]
}
diff --git a/config/tweaks.json b/config/tweaks.json
index ead26d62..ff0dce16 100644
--- a/config/tweaks.json
+++ b/config/tweaks.json
@@ -1,5 +1,5 @@
{
- "WPFEssTweaksAH": {
+ "WPFTweaksAH": {
"registry": [
{
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System",
@@ -24,7 +24,7 @@
}
]
},
- "WPFEssTweaksHiber": {
+ "WPFTweaksHiber": {
"registry": [
{
"Path": "HKLM:\\System\\CurrentControlSet\\Control\\Session Manager\\Power",
@@ -45,7 +45,7 @@
"powercfg.exe /hibernate off"
]
},
- "WPFEssTweaksHome": {
+ "WPFTweaksHome": {
"service": [
{
"Name": "HomeGroupListener",
@@ -59,7 +59,7 @@
}
]
},
- "WPFEssTweaksLoc": {
+ "WPFTweaksLoc": {
"registry": [
{
"Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\CapabilityAccessManager\\ConsentStore\\location",
@@ -91,7 +91,7 @@
}
]
},
- "WPFEssTweaksServices": {
+ "WPFTweaksServices": {
"service": [
{
"Name": "AJRouter",
@@ -1510,7 +1510,7 @@
}
]
},
- "WPFEssTweaksTele": {
+ "WPFTweaksTele": {
"ScheduledTask": [
{
"Name": "Microsoft\\Windows\\Application Experience\\Microsoft Compatibility Appraiser",
@@ -1897,7 +1897,7 @@
"
]
},
- "WPFEssTweaksWifi": {
+ "WPFTweaksWifi": {
"registry": [
{
"Path": "HKLM:\\Software\\Microsoft\\PolicyManager\\default\\WiFi\\AllowWiFiHotSpotReporting",
@@ -1915,7 +1915,7 @@
}
]
},
- "WPFMiscTweaksUTC": {
+ "WPFTweaksUTC": {
"registry": [
{
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation",
@@ -1926,7 +1926,7 @@
}
]
},
- "WPFMiscTweaksDisplay": {
+ "WPFTweaksDisplay": {
"registry": [
{
"Path": "HKCU:\\Control Panel\\Desktop",
@@ -2027,7 +2027,7 @@
"Remove-ItemProperty -Path \"HKCU:\\Control Panel\\Desktop\" -Name \"UserPreferencesMask\""
]
},
- "WPFEssTweaksDeBloat": {
+ "WPFTweaksDeBloat": {
"appx": [
"Microsoft.Microsoft3DViewer",
"Microsoft.AppConnector",
@@ -2141,7 +2141,7 @@
"
]
},
- "WPFEssTweaksRestorePoint": {
+ "WPFTweaksRestorePoint": {
"InvokeScript": [
"
# Check if the user has administrative privileges
@@ -2178,7 +2178,7 @@
"
]
},
- "WPFEssTweaksOO": {
+ "WPFTweaksOO": {
"InvokeScript": [
"curl.exe -s \"https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/ooshutup10_winutil_settings.cfg\" -o $ENV:temp\\ooshutup10.cfg
curl.exe -s \"https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe\" -o $ENV:temp\\OOSU10.exe
@@ -2186,7 +2186,7 @@
"
]
},
- "WPFEssTweaksStorage": {
+ "WPFTweaksStorage": {
"InvokeScript": [
"Remove-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Recurse -ErrorAction SilentlyContinue"
],
@@ -2195,7 +2195,7 @@
"
]
},
- "WPFEssTweaksRemoveEdge": {
+ "WPFTweaksRemoveEdge": {
"InvokeScript": [
"
#:: Standalone script by AveYo Source: https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat
@@ -2212,7 +2212,7 @@
"
]
},
- "WPFEssTweaksRemoveOnedrive": {
+ "WPFTweaksRemoveOnedrive": {
"InvokeScript": [
"
@@ -2289,7 +2289,7 @@
"
]
},
- "WPFMiscTweaksDisableNotifications": {
+ "WPFTweaksDisableNotifications": {
"registry": [
{
"Path": "HKCU:\\Software\\Policies\\Microsoft\\Windows\\Explorer",
@@ -2307,7 +2307,7 @@
}
]
},
- "WPFMiscTweaksRightClickMenu": {
+ "WPFTweaksRightClickMenu": {
"InvokeScript": [
"New-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Name \"InprocServer32\" -force -value \"\" "
],
@@ -2318,7 +2318,7 @@
"
]
},
- "WPFEssTweaksDiskCleanup": {
+ "WPFTweaksDiskCleanup": {
"InvokeScript": [
"
cleanmgr.exe /d C: /VERYLOWDISK
@@ -2326,7 +2326,7 @@
"
]
},
- "WPFMiscTweaksDisableUAC": {
+ "WPFTweaksDisableUAC": {
"registry": [
{
"Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
@@ -2337,13 +2337,13 @@
}
]
},
- "WPFEssTweaksDeleteTempFiles": {
+ "WPFTweaksDeleteTempFiles": {
"InvokeScript": [
"Get-ChildItem -Path \"C:\\Windows\\Temp\" *.* -Recurse | Remove-Item -Force -Recurse
Get-ChildItem -Path $env:TEMP *.* -Recurse | Remove-Item -Force -Recurse"
]
},
- "WPFEssTweaksDVR": {
+ "WPFTweaksDVR": {
"registry": [
{
"Path": "HKCU:\\System\\GameConfigStore",
@@ -2389,7 +2389,7 @@
}
]
},
- "WPFEssTweaksTeredo": {
+ "WPFTweaksTeredo": {
"registry": [
{
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
@@ -2417,7 +2417,7 @@
}
]
},
- "WPFMiscTweaksDisableipsix": {
+ "WPFTweaksDisableipsix": {
"InvokeScript": [
"Disable-NetAdapterBinding -Name \"*\" -ComponentID ms_tcpip6"
],
@@ -2425,7 +2425,7 @@
"Enable-NetAdapterBinding -Name \"*\" -ComponentID ms_tcpip6"
]
},
- "WPFMiscTweaksEnableipsix": {
+ "WPFTweaksEnableipsix": {
"InvokeScript": [
"Enable-NetAdapterBinding -Name \"*\" -ComponentID ms_tcpip6"
],
diff --git a/functions/private/Get-WinUtilCheckBoxes.ps1 b/functions/private/Get-WinUtilCheckBoxes.ps1
index fef27cc8..2096d1fc 100644
--- a/functions/private/Get-WinUtilCheckBoxes.ps1
+++ b/functions/private/Get-WinUtilCheckBoxes.ps1
@@ -20,56 +20,58 @@ Function Get-WinUtilCheckBoxes {
#>
Param(
- $Group,
- [boolean]$unCheck = $true
+ [boolean]$unCheck = $false
)
-
- $Output = New-Object System.Collections.Generic.List[System.Object]
-
- if($Group -eq "WPFInstall"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
- $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
- Foreach ($CheckBox in $CheckBoxes){
- if($CheckBox.value.ischecked -eq $true){
- $sync.configs.applications.$($CheckBox.Name).winget -split ";" | ForEach-Object {
- $Output.Add($psitem)
- }
- if ($uncheck -eq $true){
- $CheckBox.value.ischecked = $false
- }
-
- }
- }
+ $Output = @{
+ Install = @()
+ WPFTweaks = @()
+ WPFFeature = @()
+ WPFInstall = @()
}
- if($Group -eq "WPFTweaks"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Tweaks*"}
- $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
- Foreach ($CheckBox in $CheckBoxes){
- if($CheckBox.value.ischecked -eq $true){
- $Output.Add($Checkbox.Name)
+ $CheckBoxes = $sync.GetEnumerator() | Where-Object { $_.Value -is [System.Windows.Controls.CheckBox] }
- if ($uncheck -eq $true){
- $CheckBox.value.ischecked = $false
+ foreach ($CheckBox in $CheckBoxes) {
+ $group = if ($CheckBox.Key.StartsWith("WPFInstall")) { "Install" }
+ elseif ($CheckBox.Key.StartsWith("WPFTweaks")) { "WPFTweaks" }
+ elseif ($CheckBox.Key.StartsWith("WPFFeature")) { "WPFFeature" }
+
+ if ($group) {
+ if ($CheckBox.Value.IsChecked -eq $true) {
+ $feature = switch ($group) {
+ "Install" {
+ # Get the winget value
+ $wingetValue = $sync.configs.applications.$($CheckBox.Name).winget
+
+ if (-not [string]::IsNullOrWhiteSpace($wingetValue) -and $wingetValue -ne "na") {
+ $wingetValue -split ";"
+ } else {
+ $sync.configs.applications.$($CheckBox.Name).choco
+ }
+ }
+ default {
+ $CheckBox.Name
+ }
+ }
+
+ if (-not $Output.ContainsKey($group)) {
+ $Output[$group] = @()
+ }
+ if ($group -eq "Install") {
+ $Output["WPFInstall"] += $CheckBox.Name
+ Write-Debug "Adding: $($CheckBox.Name) under: WPFInstall"
+ }
+
+ Write-Debug "Adding: $($feature) under: $($group)"
+ $Output[$group] += $feature
+
+ if ($uncheck -eq $true) {
+ $CheckBox.Value.IsChecked = $false
}
}
}
}
- if($Group -eq "WPFFeature"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Feature*"}
- $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
- Foreach ($CheckBox in $CheckBoxes){
- if($CheckBox.value.ischecked -eq $true){
- $Output.Add($Checkbox.Name)
-
- if ($uncheck -eq $true){
- $CheckBox.value.ischecked = $false
- }
- }
- }
- }
-
- Write-Output $($Output | Select-Object -Unique)
+ return $Output
}
diff --git a/functions/private/Invoke-MicroWin-Helper.ps1 b/functions/private/Invoke-MicroWin-Helper.ps1
index 7abc4936..fb679b47 100644
--- a/functions/private/Invoke-MicroWin-Helper.ps1
+++ b/functions/private/Invoke-MicroWin-Helper.ps1
@@ -276,19 +276,22 @@ function New-Unattend {
# net user administrator /active:yes
#
+ # this section doesn't work in win10/????
+#
+#
+# 0
+#
+#
+# false
+#
+#
+
$unattend = @'
-
-
- 0
-
-
- false
-
-
+
diff --git a/functions/private/Invoke-WinUtilTweaks.ps1 b/functions/private/Invoke-WinUtilTweaks.ps1
index e57a6e73..dfce78e6 100644
--- a/functions/private/Invoke-WinUtilTweaks.ps1
+++ b/functions/private/Invoke-WinUtilTweaks.ps1
@@ -16,6 +16,8 @@ function Invoke-WinUtilTweaks {
$CheckBox,
$undo = $false
)
+
+ Write-Debug "Tweaks: $($CheckBox)"
if($undo){
$Values = @{
Registry = "OriginalValue"
@@ -35,21 +37,25 @@ function Invoke-WinUtilTweaks {
}
if($sync.configs.tweaks.$CheckBox.ScheduledTask){
$sync.configs.tweaks.$CheckBox.ScheduledTask | ForEach-Object {
+ Write-Debug "$($psitem.Name) and state is $($psitem.$($values.ScheduledTask))"
Set-WinUtilScheduledTask -Name $psitem.Name -State $psitem.$($values.ScheduledTask)
}
}
if($sync.configs.tweaks.$CheckBox.service){
$sync.configs.tweaks.$CheckBox.service | ForEach-Object {
+ Write-Debug "$($psitem.Name) and state is $($psitem.$($values.service))"
Set-WinUtilService -Name $psitem.Name -StartupType $psitem.$($values.Service)
}
}
if($sync.configs.tweaks.$CheckBox.registry){
$sync.configs.tweaks.$CheckBox.registry | ForEach-Object {
+ Write-Debug "$($psitem.Name) and state is $($psitem.$($values.registry))"
Set-WinUtilRegistry -Name $psitem.Name -Path $psitem.Path -Type $psitem.Type -Value $psitem.$($values.registry)
}
}
if($sync.configs.tweaks.$CheckBox.$($values.ScriptType)){
$sync.configs.tweaks.$CheckBox.$($values.ScriptType) | ForEach-Object {
+ Write-Debug "$($psitem) and state is $($psitem.$($values.ScriptType))"
$Scriptblock = [scriptblock]::Create($psitem)
Invoke-WinUtilScript -ScriptBlock $scriptblock -Name $CheckBox
}
@@ -58,6 +64,7 @@ function Invoke-WinUtilTweaks {
if(!$undo){
if($sync.configs.tweaks.$CheckBox.appx){
$sync.configs.tweaks.$CheckBox.appx | ForEach-Object {
+ Write-Debug "UNDO $($psitem.Name)"
Remove-WinUtilAPPX -Name $psitem
}
}
diff --git a/functions/private/Show-CustomDialog.ps1 b/functions/private/Show-CustomDialog.ps1
new file mode 100644
index 00000000..e102c43e
--- /dev/null
+++ b/functions/private/Show-CustomDialog.ps1
@@ -0,0 +1,221 @@
+function Show-CustomDialog {
+ <#
+ .SYNOPSIS
+ Displays a custom dialog box with an image, heading, message, and an OK button.
+
+ .DESCRIPTION
+ This function creates a custom dialog box with the specified message and additional elements such as an image, heading, and an OK button. The dialog box is designed with a green border, rounded corners, and a black background.
+
+ .PARAMETER Message
+ The message to be displayed in the dialog box.
+
+ .PARAMETER Width
+ The width of the custom dialog window.
+
+ .PARAMETER Height
+ The height of the custom dialog window.
+
+ .EXAMPLE
+ Show-CustomDialog -Message "This is a custom dialog with a message and an image above." -Width 300 -Height 200
+
+ #>
+ param(
+ [string]$Message,
+ [int]$Width = 300,
+ [int]$Height = 200
+ )
+
+ Add-Type -AssemblyName PresentationFramework
+
+ # Define theme colors
+ $foregroundColor = [Windows.Media.Brushes]::White
+ $backgroundColor = [Windows.Media.Brushes]::Black
+ $font = New-Object Windows.Media.FontFamily("Consolas")
+ $borderColor = [Windows.Media.Brushes]::Green
+ $buttonBackgroundColor = [Windows.Media.Brushes]::Black
+ $buttonForegroundColor = [Windows.Media.Brushes]::White
+ $shadowColor = [Windows.Media.ColorConverter]::ConvertFromString("#AAAAAAAA")
+
+ # Create a custom dialog window
+ $dialog = New-Object Windows.Window
+ $dialog.Title = "About"
+ $dialog.Height = $Height
+ $dialog.Width = $Width
+ $dialog.Margin = New-Object Windows.Thickness(10) # Add margin to the entire dialog box
+ $dialog.WindowStyle = [Windows.WindowStyle]::None # Remove title bar and window controls
+ $dialog.ResizeMode = [Windows.ResizeMode]::NoResize # Disable resizing
+ $dialog.WindowStartupLocation = [Windows.WindowStartupLocation]::CenterScreen # Center the window
+ $dialog.Foreground = $foregroundColor
+ $dialog.Background = $backgroundColor
+ $dialog.FontFamily = $font
+
+ # Create a Border for the green edge with rounded corners
+ $border = New-Object Windows.Controls.Border
+ $border.BorderBrush = $borderColor
+ $border.BorderThickness = New-Object Windows.Thickness(1) # Adjust border thickness as needed
+ $border.CornerRadius = New-Object Windows.CornerRadius(10) # Adjust the radius for rounded corners
+
+ # Create a drop shadow effect
+ $dropShadow = New-Object Windows.Media.Effects.DropShadowEffect
+ $dropShadow.Color = $shadowColor
+ $dropShadow.Direction = 270
+ $dropShadow.ShadowDepth = 5
+ $dropShadow.BlurRadius = 10
+
+ # Apply drop shadow effect to the border
+ $dialog.Effect = $dropShadow
+
+ $dialog.Content = $border
+
+ # Create a grid for layout inside the Border
+ $grid = New-Object Windows.Controls.Grid
+ $border.Child = $grid
+
+ # Add the following line to show gridlines
+ #$grid.ShowGridLines = $true
+
+ # Add the following line to set the background color of the grid
+ $grid.Background = [Windows.Media.Brushes]::Transparent
+ # Add the following line to make the Grid stretch
+ $grid.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch
+ $grid.VerticalAlignment = [Windows.VerticalAlignment]::Stretch
+
+ # Add the following line to make the Border stretch
+ $border.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch
+ $border.VerticalAlignment = [Windows.VerticalAlignment]::Stretch
+
+
+ # Set up Row Definitions
+ $row0 = New-Object Windows.Controls.RowDefinition
+ $row0.Height = [Windows.GridLength]::Auto
+
+ $row1 = New-Object Windows.Controls.RowDefinition
+ $row1.Height = [Windows.GridLength]::new(1, [Windows.GridUnitType]::Star)
+
+ $row2 = New-Object Windows.Controls.RowDefinition
+ $row2.Height = [Windows.GridLength]::Auto
+
+ # Add Row Definitions to Grid
+ $grid.RowDefinitions.Add($row0)
+ $grid.RowDefinitions.Add($row1)
+ $grid.RowDefinitions.Add($row2)
+
+ # Add StackPanel for horizontal layout with margins
+ $stackPanel = New-Object Windows.Controls.StackPanel
+ $stackPanel.Margin = New-Object Windows.Thickness(10) # Add margins around the stack panel
+ $stackPanel.Orientation = [Windows.Controls.Orientation]::Horizontal
+ $stackPanel.HorizontalAlignment = [Windows.HorizontalAlignment]::Left # Align to the left
+ $stackPanel.VerticalAlignment = [Windows.VerticalAlignment]::Top # Align to the top
+
+ $grid.Children.Add($stackPanel)
+ [Windows.Controls.Grid]::SetRow($stackPanel, 0) # Set the row to the second row (0-based index)
+
+ $viewbox = New-Object Windows.Controls.Viewbox
+ $viewbox.Width = 25
+ $viewbox.Height = 25
+
+ # Combine the paths into a single string
+# $cttLogoPath = @"
+# M174 1094 c-4 -14 -4 -55 -2 -92 3 -57 9 -75 41 -122 41 -60 45 -75 22 -84 -25 -9 -17 -21 30 -44 l45 -22 0 -103 c0 -91 3 -109 26 -155 30 -60 65 -87 204 -157 l95 -48 110 58 c184 96 205 127 205 293 l0 108 45 22 c47 23 55 36 30 46 -22 8 -18 30 9 63 13 16 34 48 46 71 20 37 21 52 15 116 l-6 73 -69 -23 c-38 -12 -137 -59 -220 -103 -82 -45 -160 -81 -171 -81 -12 0 -47 15 -78 34 -85 51 -239 127 -309 151 l-62 22 -6 -23z m500 -689 c20 -8 36 -19 36 -24 0 -18 -53 -51 -80 -51 -28 0 -80 33 -80 51 0 10 55 38 76 39 6 0 28 -7 48 -15z
+# M177 711 c-19 -88 4 -242 49 -318 43 -74 107 -127 232 -191 176 -90 199 -84 28 7 -169 91 -214 129 -258 220 -29 58 -32 74 -37 190 -4 90 -8 116 -14 92z
+# M1069 610 c-4 -131 -5 -137 -38 -198 -43 -79 -89 -119 -210 -181 -53 -27 -116 -61 -141 -76 -74 -43 -6 -20 115 40 221 109 296 217 294 425 -1 144 -16 137 -20 -10z
+# "@
+$cttLogoPath = @"
+ M 18.00,14.00
+ C 18.00,14.00 45.00,27.74 45.00,27.74
+ 45.00,27.74 57.40,34.63 57.40,34.63
+ 57.40,34.63 59.00,43.00 59.00,43.00
+ 59.00,43.00 59.00,83.00 59.00,83.00
+ 55.35,81.66 46.99,77.79 44.72,74.79
+ 41.17,70.10 42.01,59.80 42.00,54.00
+ 42.00,51.62 42.20,48.29 40.98,46.21
+ 38.34,41.74 25.78,38.60 21.28,33.79
+ 16.81,29.02 18.00,20.20 18.00,14.00 Z
+ M 107.00,14.00
+ C 109.01,19.06 108.93,30.37 104.66,34.21
+ 100.47,37.98 86.38,43.10 84.60,47.21
+ 83.94,48.74 84.01,51.32 84.00,53.00
+ 83.97,57.04 84.46,68.90 83.26,72.00
+ 81.06,77.70 72.54,81.42 67.00,83.00
+ 67.00,83.00 67.00,43.00 67.00,43.00
+ 67.00,43.00 67.99,35.63 67.99,35.63
+ 67.99,35.63 80.00,28.26 80.00,28.26
+ 80.00,28.26 107.00,14.00 107.00,14.00 Z
+ M 19.00,46.00
+ C 21.36,47.14 28.67,50.71 30.01,52.63
+ 31.17,54.30 30.99,57.04 31.00,59.00
+ 31.04,65.41 30.35,72.16 33.56,78.00
+ 38.19,86.45 46.10,89.04 54.00,93.31
+ 56.55,94.69 60.10,97.20 63.00,97.22
+ 65.50,97.24 68.77,95.36 71.00,94.25
+ 76.42,91.55 84.51,87.78 88.82,83.68
+ 94.56,78.20 95.96,70.59 96.00,63.00
+ 96.01,60.24 95.59,54.63 97.02,52.39
+ 98.80,49.60 103.95,47.87 107.00,47.00
+ 107.00,47.00 107.00,67.00 107.00,67.00
+ 106.90,87.69 96.10,93.85 80.00,103.00
+ 76.51,104.98 66.66,110.67 63.00,110.52
+ 60.33,110.41 55.55,107.53 53.00,106.25
+ 46.21,102.83 36.63,98.57 31.04,93.68
+ 16.88,81.28 19.00,62.88 19.00,46.00 Z
+"@
+
+ # Add SVG path
+ $svgPath = New-Object Windows.Shapes.Path
+ $svgPath.Data = [Windows.Media.Geometry]::Parse($cttLogoPath)
+ $svgPath.Fill = $foregroundColor # Set fill color to white
+
+ # Add SVG path to Viewbox
+ $viewbox.Child = $svgPath
+
+ # Add SVG path to the stack panel
+ $stackPanel.Children.Add($viewbox)
+
+ # Add "Winutil" text
+ $winutilTextBlock = New-Object Windows.Controls.TextBlock
+ $winutilTextBlock.Text = "Winutil"
+ $winutilTextBlock.FontSize = 18 # Adjust font size as needed
+ $winutilTextBlock.Foreground = $foregroundColor
+ $winutilTextBlock.Margin = New-Object Windows.Thickness(10, 5, 10, 5) # Add margins around the text block
+ $stackPanel.Children.Add($winutilTextBlock)
+
+ # Add TextBlock for information with text wrapping and margins
+ $messageTextBlock = New-Object Windows.Controls.TextBlock
+ $messageTextBlock.Text = $Message
+ $messageTextBlock.TextWrapping = [Windows.TextWrapping]::Wrap # Enable text wrapping
+ $messageTextBlock.HorizontalAlignment = [Windows.HorizontalAlignment]::Left
+ $messageTextBlock.VerticalAlignment = [Windows.VerticalAlignment]::Top
+ $messageTextBlock.Margin = New-Object Windows.Thickness(10) # Add margins around the text block
+ $grid.Children.Add($messageTextBlock)
+ [Windows.Controls.Grid]::SetRow($messageTextBlock, 1) # Set the row to the second row (0-based index)
+
+ # Add OK button
+ $okButton = New-Object Windows.Controls.Button
+ $okButton.Content = "OK"
+ $okButton.Width = 80
+ $okButton.Height = 30
+ $okButton.HorizontalAlignment = [Windows.HorizontalAlignment]::Center
+ $okButton.VerticalAlignment = [Windows.VerticalAlignment]::Bottom
+ $okButton.Margin = New-Object Windows.Thickness(0, 0, 0, 10)
+ $okButton.Background = $buttonBackgroundColor
+ $okButton.Foreground = $buttonForegroundColor
+ $okButton.BorderBrush = $borderColor
+ $okButton.Add_Click({
+ $dialog.Close()
+ })
+ $grid.Children.Add($okButton)
+ [Windows.Controls.Grid]::SetRow($okButton, 2) # Set the row to the third row (0-based index)
+
+ # Handle Escape key press to close the dialog
+ $dialog.Add_KeyDown({
+ if ($_.Key -eq 'Escape') {
+ $dialog.Close()
+ }
+ })
+
+ # Set the OK button as the default button (activated on Enter)
+ $okButton.IsDefault = $true
+
+ # Show the custom dialog
+ $dialog.ShowDialog()
+}
diff --git a/functions/private/Update-WinUtilProgramWinget.ps1 b/functions/private/Update-WinUtilProgramWinget.ps1
index 5deac59c..1fc0c2df 100644
--- a/functions/private/Update-WinUtilProgramWinget.ps1
+++ b/functions/private/Update-WinUtilProgramWinget.ps1
@@ -14,7 +14,6 @@ Function Update-WinUtilProgramWinget {
Start-Transcript $ENV:TEMP\winget-update.log -Append
winget upgrade --all
- Pause
}
$global:WinGetInstall = Start-Process -Verb runas powershell -ArgumentList "-command invoke-command -scriptblock {$wingetinstall} -argumentlist '$($ProgramsToInstall -join ",")'" -PassThru
diff --git a/functions/public/Invoke-WPFButton.ps1 b/functions/public/Invoke-WPFButton.ps1
index a0f1ab21..1460a6be 100644
--- a/functions/public/Invoke-WPFButton.ps1
+++ b/functions/public/Invoke-WPFButton.ps1
@@ -24,10 +24,6 @@ function Invoke-WPFButton {
"WPFdesktop" {Invoke-WPFPresets "Desktop"}
"WPFlaptop" {Invoke-WPFPresets "laptop"}
"WPFminimal" {Invoke-WPFPresets "minimal"}
- "WPFexport" {Invoke-WPFImpex -type "export" -CheckBox "WPFTweaks"}
- "WPFimport" {Invoke-WPFImpex -type "import" -CheckBox "WPFTweaks"}
- "WPFexportWinget" {Invoke-WPFImpex -type "export" -CheckBox "WPFInstall"}
- "WPFimportWinget" {Invoke-WPFImpex -type "import" -CheckBox "WPFInstall"}
"WPFclear" {Invoke-WPFPresets -preset $null -imported $true}
"WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"}
"WPFtweaksbutton" {Invoke-WPFtweaksbutton}
diff --git a/functions/public/Invoke-WPFFeatureInstall.ps1 b/functions/public/Invoke-WPFFeatureInstall.ps1
index 2277b753..a8bc995a 100644
--- a/functions/public/Invoke-WPFFeatureInstall.ps1
+++ b/functions/public/Invoke-WPFFeatureInstall.ps1
@@ -7,15 +7,15 @@ function Invoke-WPFFeatureInstall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFFeatureInstall] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $Features = Get-WinUtilCheckBoxes -Group "WPFFeature"
+ $Features = (Get-WinUtilCheckBoxes)["WPFFeatures"]
- Invoke-WPFRunspace -ArgumentList $Features -ScriptBlock {
- param($Features)
+ Invoke-WPFRunspace -ArgumentList $Features,$DebugPreference -ScriptBlock {
+ param($Features, $DebugPreference)
$sync.ProcessRunning = $true
@@ -26,12 +26,5 @@ function Invoke-WPFFeatureInstall {
Write-Host "--- Features are Installed ---"
Write-Host "--- A Reboot may be required ---"
Write-Host "==================================="
-
- $ButtonType = [System.Windows.MessageBoxButton]::OK
- $MessageboxTitle = "All features are now installed "
- $Messageboxbody = ("Done")
- $MessageIcon = [System.Windows.MessageBoxImage]::Information
-
- [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
}
}
\ No newline at end of file
diff --git a/functions/public/Invoke-WPFGetInstalled.ps1 b/functions/public/Invoke-WPFGetInstalled.ps1
index 001cce2b..b4b33307 100644
--- a/functions/public/Invoke-WPFGetInstalled.ps1
+++ b/functions/public/Invoke-WPFGetInstalled.ps1
@@ -11,7 +11,7 @@ function Invoke-WPFGetInstalled {
param($checkbox)
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFGetInstalled] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
@@ -23,8 +23,8 @@ function Invoke-WPFGetInstalled {
return
}
- Invoke-WPFRunspace -ArgumentList $checkbox -ScriptBlock {
- param($checkbox)
+ Invoke-WPFRunspace -ArgumentList $checkbox,$DebugPreference -ScriptBlock {
+ param($checkbox, $DebugPreference)
$sync.ProcessRunning = $true
diff --git a/functions/public/Invoke-WPFImpex.ps1 b/functions/public/Invoke-WPFImpex.ps1
index f02de2ed..f40ac515 100644
--- a/functions/public/Invoke-WPFImpex.ps1
+++ b/functions/public/Invoke-WPFImpex.ps1
@@ -16,7 +16,7 @@ function Invoke-WPFImpex {
#>
param(
$type,
- $checkbox
+ $Config = $null
)
if ($type -eq "export"){
@@ -26,20 +26,36 @@ function Invoke-WPFImpex {
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog
}
- $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
- $FileBrowser.Filter = "JSON Files (*.json)|*.json"
- $FileBrowser.ShowDialog() | Out-Null
+ if (-not $Config){
+ $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
+ $FileBrowser.Filter = "JSON Files (*.json)|*.json"
+ $FileBrowser.ShowDialog() | Out-Null
- if($FileBrowser.FileName -eq ""){
- return
+ if($FileBrowser.FileName -eq ""){
+ return
+ }
+ else{
+ $Config = $FileBrowser.FileName
+ }
}
-
+
if ($type -eq "export"){
- $jsonFile = Get-WinUtilCheckBoxes $checkbox -unCheck $false
+ $jsonFile = Get-WinUtilCheckBoxes -unCheck $false
$jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force
}
if ($type -eq "import"){
- $jsonFile = Get-Content $FileBrowser.FileName | ConvertFrom-Json
- Invoke-WPFPresets -preset $jsonFile -imported $true -CheckBox $checkbox
+ $jsonFile = Get-Content $Config | ConvertFrom-Json
+
+ $flattenedJson = @()
+ $jsonFile.PSObject.Properties | ForEach-Object {
+ $category = $_.Name
+ foreach ($checkboxName in $_.Value) {
+ if ($category -ne "Install") {
+ $flattenedJson += $checkboxName
+ }
+ }
+ }
+
+ Invoke-WPFPresets -preset $flattenedJson -imported $true
}
}
diff --git a/functions/public/Invoke-WPFInstall.ps1 b/functions/public/Invoke-WPFInstall.ps1
index 89dd0b49..12362b12 100644
--- a/functions/public/Invoke-WPFInstall.ps1
+++ b/functions/public/Invoke-WPFInstall.ps1
@@ -7,12 +7,12 @@ function Invoke-WPFInstall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFInstall] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall"
+ $WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
if ($wingetinstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install"
@@ -20,24 +20,15 @@ function Invoke-WPFInstall {
return
}
- Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock {
- param($WingetInstall)
+ Invoke-WPFRunspace -ArgumentList $WingetInstall,$DebugPreference -ScriptBlock {
+ param($WingetInstall, $DebugPreference)
+
try{
$sync.ProcessRunning = $true
- # Ensure winget is installed
Install-WinUtilWinget
-
- # Install all selected programs in new window
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall
- $ButtonType = [System.Windows.MessageBoxButton]::OK
- $MessageboxTitle = "Installs are Finished "
- $Messageboxbody = ("Done")
- $MessageIcon = [System.Windows.MessageBoxImage]::Information
-
- [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
-
Write-Host "==========================================="
Write-Host "-- Installs have finished ---"
Write-Host "==========================================="
@@ -47,6 +38,7 @@ function Invoke-WPFInstall {
Write-Host "-- Winget failed to install ---"
Write-Host "==========================================="
}
+ Start-Sleep -Seconds 5
$sync.ProcessRunning = $False
}
}
\ No newline at end of file
diff --git a/functions/public/Invoke-WPFInstallUpgrade.ps1 b/functions/public/Invoke-WPFInstallUpgrade.ps1
index c2fb9df1..8cf026a7 100644
--- a/functions/public/Invoke-WPFInstallUpgrade.ps1
+++ b/functions/public/Invoke-WPFInstallUpgrade.ps1
@@ -13,7 +13,7 @@ function Invoke-WPFInstallUpgrade {
}
if(Get-WinUtilInstallerProcess -Process $global:WinGetInstall){
- $msg = "Install process is currently running. Please check for a powershell window labeled 'Winget Install'"
+ $msg = "[Invoke-WPFInstallUpgrade] Install process is currently running. Please check for a powershell window labeled 'Winget Install'"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
diff --git a/functions/public/Invoke-WPFPresets.ps1 b/functions/public/Invoke-WPFPresets.ps1
index 4b61e40b..a513776b 100644
--- a/functions/public/Invoke-WPFPresets.ps1
+++ b/functions/public/Invoke-WPFPresets.ps1
@@ -17,8 +17,7 @@ function Invoke-WPFPresets {
param(
$preset,
- [bool]$imported = $false,
- $checkbox = "WPFTweaks"
+ [bool]$imported = $false
)
if($imported -eq $true){
@@ -28,23 +27,33 @@ function Invoke-WPFPresets {
$CheckBoxesToCheck = $sync.configs.preset.$preset
}
- if($checkbox -eq "WPFTweaks"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "*tweaks*"}
- $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
- if ($CheckBoxesToCheck -contains $PSItem.name){
- $sync.$($PSItem.name).ischecked = $true
- }
- else{$sync.$($PSItem.name).ischecked = $false}
+ $CheckBoxes = $sync.GetEnumerator() | Where-Object { $_.Value -is [System.Windows.Controls.CheckBox] }
+ Write-Debug "Getting checkboxes to set $($CheckBoxes.Count)"
+
+ $CheckBoxesToCheck | ForEach-Object {
+ if ($_ -ne $null) {
+ Write-Debug $_
}
}
- if($checkbox -eq "WPFInstall"){
+
+ foreach ($CheckBox in $CheckBoxes) {
+ $checkboxName = $CheckBox.Key
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
- $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
- if($($sync.configs.applications.$($psitem.name).winget) -in $CheckBoxesToCheck){
- $sync.$($PSItem.name).ischecked = $true
- }
- else{$sync.$($PSItem.name).ischecked = $false}
+ if (-not $CheckBoxesToCheck)
+ {
+ $sync.$checkboxName.IsChecked = $false
+ continue
+ }
+
+ # Check if the checkbox name exists in the flattened JSON hashtable
+ if ($CheckBoxesToCheck.Contains($checkboxName)) {
+ # If it exists, set IsChecked to true
+ $sync.$checkboxName.IsChecked = $true
+ Write-Debug "$checkboxName is checked"
+ } else {
+ # If it doesn't exist, set IsChecked to false
+ $sync.$checkboxName.IsChecked = $false
+ Write-Debug "$checkboxName is not checked"
}
}
}
\ No newline at end of file
diff --git a/functions/public/Invoke-WPFRunspace.ps1 b/functions/public/Invoke-WPFRunspace.ps1
index 975f44a7..cb624ef3 100644
--- a/functions/public/Invoke-WPFRunspace.ps1
+++ b/functions/public/Invoke-WPFRunspace.ps1
@@ -21,7 +21,8 @@ function Invoke-WPFRunspace {
[CmdletBinding()]
Param (
$ScriptBlock,
- $ArgumentList
+ $ArgumentList,
+ $DebugPreference
)
# Create a PowerShell instance
@@ -30,6 +31,7 @@ function Invoke-WPFRunspace {
# Add Scriptblock and Arguments to runspace
$script:powershell.AddScript($ScriptBlock)
$script:powershell.AddArgument($ArgumentList)
+ $script:powershell.AddArgument($DebugPreference) # Pass DebugPreference to the script block
$script:powershell.RunspacePool = $sync.runspace
# Execute the RunspacePool
diff --git a/functions/public/Invoke-WPFShortcut.ps1 b/functions/public/Invoke-WPFShortcut.ps1
index 80aacf8b..0f819086 100644
--- a/functions/public/Invoke-WPFShortcut.ps1
+++ b/functions/public/Invoke-WPFShortcut.ps1
@@ -13,19 +13,19 @@ function Invoke-WPFShortcut {
$iconPath = $null
Switch ($ShortcutToAdd) {
- "WinUtil" {
- $SourceExe = "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe"
- $IRM = 'irm https://christitus.com/win | iex'
- $Powershell = '-ExecutionPolicy Bypass -Command "Start-Process powershell.exe -verb runas -ArgumentList'
- $ArgumentsToSourceExe = "$powershell '$IRM'"
- $DestinationName = "WinUtil.lnk"
+ "WinUtil" {
+ $SourceExe = "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe"
+ $IRM = 'irm https://christitus.com/win | iex'
+ $Powershell = '-ExecutionPolicy Bypass -Command "Start-Process powershell.exe -verb runas -ArgumentList'
+ $ArgumentsToSourceExe = "$powershell '$IRM'"
+ $DestinationName = "WinUtil.lnk"
- if (Test-Path -Path "$env:TEMP\cttlogo.png") {
- $iconPath = "$env:SystempRoot\cttlogo.ico"
- ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath $iconPath
+ if (Test-Path -Path "$env:TEMP\cttlogo.png") {
+ $iconPath = "$env:SystempRoot\cttlogo.ico"
+ ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath $iconPath
+ }
}
}
- }
$FileBrowser = New-Object System.Windows.Forms.SaveFileDialog
$FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
diff --git a/functions/public/Invoke-WPFUnInstall.ps1 b/functions/public/Invoke-WPFUnInstall.ps1
index 81cfc57c..af69a964 100644
--- a/functions/public/Invoke-WPFUnInstall.ps1
+++ b/functions/public/Invoke-WPFUnInstall.ps1
@@ -7,12 +7,12 @@ function Invoke-WPFUnInstall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running"
+ $msg = "[Invoke-WPFUnInstall] Install process is currently running"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall"
+ $WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
if ($wingetinstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install"
@@ -29,8 +29,9 @@ function Invoke-WPFUnInstall {
if($confirm -eq "No"){return}
- Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock {
- param($WingetInstall)
+ Invoke-WPFRunspace -ArgumentList $WingetInstall,$DebugPreference -ScriptBlock {
+ param($WingetInstall, $DebugPreference)
+
try{
$sync.ProcessRunning = $true
diff --git a/functions/public/Invoke-WPFtweaksbutton.ps1 b/functions/public/Invoke-WPFtweaksbutton.ps1
index 90d7b00d..47012b66 100644
--- a/functions/public/Invoke-WPFtweaksbutton.ps1
+++ b/functions/public/Invoke-WPFtweaksbutton.ps1
@@ -7,13 +7,13 @@ function Invoke-WPFtweaksbutton {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFtweaksbutton] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $Tweaks = Get-WinUtilCheckBoxes -Group "WPFTweaks"
-
+ $Tweaks = (Get-WinUtilCheckBoxes)["WPFTweaks"]
+
Set-WinUtilDNS -DNSProvider $sync["WPFchangedns"].text
if ($tweaks.count -eq 0 -and $sync["WPFchangedns"].text -eq "Default"){
@@ -22,21 +22,20 @@ function Invoke-WPFtweaksbutton {
return
}
- Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock {
- param($Tweaks)
+ Write-Debug "Number of tweaks to process: $($Tweaks.Count)"
+
+ Invoke-WPFRunspace -ArgumentList $Tweaks -DebugPreference $DebugPreference -ScriptBlock {
+ param($Tweaks, $DebugPreference)
+ Write-Debug "Inside Number of tweaks to process: $($Tweaks.Count)"
$sync.ProcessRunning = $true
- # Executes first if selected
- if ("WPFEssTweaksRestorePoint" -in $Tweaks) {
- Invoke-WinUtilTweaks "WPFEssTweaksRestorePoint"
- }
-
+ $cnt = 0
# Execute other selected tweaks
- foreach ($tweak in $tweaks) {
- if ($tweak -ne "WPFEssTweaksRestorePoint") {
- Invoke-WinUtilTweaks $tweak
- }
+ foreach ($tweak in $Tweaks) {
+ Write-Debug "This is a tweak to run $tweak count: $cnt"
+ Invoke-WinUtilTweaks $tweak
+ $cnt += 1
}
$sync.ProcessRunning = $false
@@ -44,11 +43,10 @@ function Invoke-WPFtweaksbutton {
Write-Host "-- Tweaks are Finished ---"
Write-Host "================================="
- $ButtonType = [System.Windows.MessageBoxButton]::OK
- $MessageboxTitle = "Tweaks are Finished "
- $Messageboxbody = ("Done")
- $MessageIcon = [System.Windows.MessageBoxImage]::Information
-
- [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
+ # $ButtonType = [System.Windows.MessageBoxButton]::OK
+ # $MessageboxTitle = "Tweaks are Finished "
+ # $Messageboxbody = ("Done")
+ # $MessageIcon = [System.Windows.MessageBoxImage]::Information
+ # [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
}
}
\ No newline at end of file
diff --git a/functions/public/Invoke-WPFundoall.ps1 b/functions/public/Invoke-WPFundoall.ps1
index 76eff6cc..8f2a6590 100644
--- a/functions/public/Invoke-WPFundoall.ps1
+++ b/functions/public/Invoke-WPFundoall.ps1
@@ -7,12 +7,12 @@ function Invoke-WPFundoall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFundoall] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $Tweaks = Get-WinUtilCheckBoxes -Group "WPFTweaks"
+ $Tweaks = (Get-WinUtilCheckBoxes)["WPFTweaks"]
if ($tweaks.count -eq 0){
$msg = "Please check the tweaks you wish to undo."
@@ -20,8 +20,8 @@ function Invoke-WPFundoall {
return
}
- Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock {
- param($Tweaks)
+ Invoke-WPFRunspace -ArgumentList $Tweaks,$DebugPreference -ScriptBlock {
+ param($Tweaks, $DebugPreference)
$sync.ProcessRunning = $true
diff --git a/scripts/main.ps1 b/scripts/main.ps1
index 5a91b2df..85bf37b8 100644
--- a/scripts/main.ps1
+++ b/scripts/main.ps1
@@ -1,5 +1,4 @@
# SPDX-License-Identifier: MIT
-
# Set the maximum number of threads for the RunspacePool to the number of threads on the machine
$maxthreads = [int]$env:NUMBER_OF_PROCESSORS
@@ -129,8 +128,6 @@ catch {
Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
}
-
-
#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================
@@ -168,7 +165,7 @@ $sync.keys | ForEach-Object {
$sync["$psitem"].Add_MouseUp({
[System.Object]$Sender = $args[0]
Start-Process $Sender.ToolTip -ErrorAction Stop
- Write-Host "Let's go: $($Sender.ToolTip)"
+ Write-Debug "Opening: $($Sender.ToolTip)"
})
}
@@ -206,7 +203,6 @@ $sync["Form"].Add_Closing({
[System.GC]::Collect()
})
-
# Attach the event handler to the Click event
$sync.CheckboxFilterClear.Add_Click({
$sync.CheckboxFilter.Text = ""
@@ -264,8 +260,10 @@ $commonKeyEvents = {
$sync["Form"].Add_PreViewKeyDown($commonKeyEvents)
-# adding some left mouse window move on drag capability
$sync["Form"].Add_MouseLeftButtonDown({
+ if ($sync["SettingsPopup"].IsOpen) {
+ $sync["SettingsPopup"].IsOpen = $false
+ }
$sync["Form"].DragMove()
})
@@ -280,31 +278,36 @@ $sync["Form"].Add_MouseDoubleClick({
}
})
-$sync["Form"].Add_ContentRendered({
-
- foreach ($proc in (Get-Process | Where-Object { $_.MainWindowTitle -and $_.MainWindowTitle -like "*tit*" })) {
- if ($proc.Id -ne [System.IntPtr]::Zero) {
- Write-Debug "MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle) $($proc.MainWindowHandle)"
- $windowHandle = $proc.MainWindowHandle
- }
+$sync["Form"].Add_Deactivated({
+ Write-Debug "WinUtil lost focus"
+ if ($sync["SettingsPopup"].IsOpen) {
+ $sync["SettingsPopup"].IsOpen = $false
}
+})
+
+$sync["Form"].Add_ContentRendered({
try {
[void][Window]
} catch {
- Add-Type @"
+Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Window {
+ [DllImport("user32.dll")]
+ public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
+
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
+
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
+
[DllImport("user32.dll")]
public static extern int GetSystemMetrics(int nIndex);
- }
+ };
public struct RECT {
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
@@ -314,8 +317,29 @@ $sync["Form"].Add_ContentRendered({
"@
}
+ foreach ($proc in (Get-Process | Where-Object { $_.MainWindowTitle -and $_.MainWindowTitle -like "*titus*" })) {
+ if ($proc.Id -ne [System.IntPtr]::Zero) {
+ Write-Debug "MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle) $($proc.MainWindowHandle)"
+ $windowHandle = $proc.MainWindowHandle
+ }
+ }
+
+ # need to experiemnt more
+ # setting icon for the windows is still not working
+ # $pngUrl = "https://christitus.com/images/logo-full.png"
+ # $pngPath = "$env:TEMP\cttlogo.png"
+ # $iconPath = "$env:TEMP\cttlogo.ico"
+ # # Download the PNG file
+ # Invoke-WebRequest -Uri $pngUrl -OutFile $pngPath
+ # if (Test-Path -Path $pngPath) {
+ # ConvertTo-Icon -bitmapPath $pngPath -iconPath $iconPath
+ # }
+ # $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($iconPath)
+ # Write-Host $icon.Handle
+ # [Window]::SendMessage($windowHandle, 0x80, [IntPtr]::Zero, $icon.Handle)
+
$rect = New-Object RECT
- [void][Window]::GetWindowRect($windowHandle, [ref]$rect)
+ [Window]::GetWindowRect($windowHandle, [ref]$rect)
$width = $rect.Right - $rect.Left
$height = $rect.Bottom - $rect.Top
@@ -347,6 +371,42 @@ $sync["Form"].Add_ContentRendered({
Invoke-WPFTab "WPFTab1BT"
$sync["Form"].Focus()
+
+ # maybe this is not the best place to load and execute config file?
+ # maybe community can help?
+ if ($PARAM_CONFIG){
+ Invoke-WPFImpex -type "import" -Config $PARAM_CONFIG
+ if ($PARAM_RUN){
+ while ($sync.ProcessRunning) {
+ Start-Sleep -Seconds 5
+ }
+ Start-Sleep -Seconds 5
+
+ Write-Host "Applying tweaks..."
+ Invoke-WPFtweaksbutton
+ while ($sync.ProcessRunning) {
+ Start-Sleep -Seconds 5
+ }
+ Start-Sleep -Seconds 5
+
+ Write-Host "Installing features..."
+ Invoke-WPFFeatureInstall
+ while ($sync.ProcessRunning) {
+ Start-Sleep -Seconds 5
+ }
+
+ Start-Sleep -Seconds 5
+ Write-Host "Installing applications..."
+ while ($sync.ProcessRunning) {
+ Start-Sleep -Seconds 1
+ }
+ Invoke-WPFInstall
+ Start-Sleep -Seconds 5
+
+ Write-Host "Done."
+ }
+ }
+
})
$sync["CheckboxFilter"].Add_TextChanged({
@@ -392,5 +452,50 @@ $sync["CheckboxFilter"].Add_TextChanged({
})
+# Define event handler for button click
+$sync["SettingsButton"].Add_Click({
+ Write-Debug "SettingsButton clicked"
+ if ($sync["SettingsPopup"].IsOpen) {
+ $sync["SettingsPopup"].IsOpen = $false
+ }
+ else {
+ $sync["SettingsPopup"].IsOpen = $true
+ }
+ $_.Handled = $false
+})
+
+# Define event handlers for menu items
+$sync["ImportMenuItem"].Add_Click({
+ # Handle Import menu item click
+ Write-Debug "Import clicked"
+ $sync["SettingsPopup"].IsOpen = $false
+ Invoke-WPFImpex -type "import"
+ $_.Handled = $false
+})
+
+$sync["ExportMenuItem"].Add_Click({
+ # Handle Export menu item click
+ Write-Debug "Export clicked"
+ $sync["SettingsPopup"].IsOpen = $false
+ Invoke-WPFImpex -type "export"
+ $_.Handled = $false
+})
+
+$sync["AboutMenuItem"].Add_Click({
+ # Handle Export menu item click
+ Write-Debug "About clicked"
+ $sync["SettingsPopup"].IsOpen = $false
+ # Example usage
+ $authorInfo = @"
+Author : @christitustech
+Runspace : @DeveloperDurp
+GUI : @KonTy
+MicroWin : @KonTy
+GitHub : https://github.com/ChrisTitusTech/winutil
+Version : $($sync.version)
+"@
+ Show-CustomDialog -Message $authorInfo -Width 400
+})
+
$sync["Form"].ShowDialog() | out-null
Stop-Transcript
\ No newline at end of file
diff --git a/scripts/start.ps1 b/scripts/start.ps1
index 948591ed..5f216172 100644
--- a/scripts/start.ps1
+++ b/scripts/start.ps1
@@ -5,6 +5,27 @@
GitHub : https://github.com/ChrisTitusTech
Version : #{replaceme}
#>
+param (
+ [switch]$Debug,
+ [string]$Config,
+ [switch]$Run
+)
+
+# Set DebugPreference based on the -Debug switch
+if ($Debug) {
+ $DebugPreference = "Continue"
+}
+
+if ($Config) {
+ $PARAM_CONFIG = $Config
+}
+
+$PARAM_RUN = $false
+# Handle the -Run switch
+if ($Run) {
+ Write-Host "Running config file tasks..."
+ $PARAM_RUN = $true
+}
if (!(Test-Path -Path $ENV:TEMP)) {
New-Item -ItemType Directory -Force -Path $ENV:TEMP
@@ -27,6 +48,7 @@ $currentPid = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal = new-object System.Security.Principal.WindowsPrincipal($currentPid)
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
+
if ($principal.IsInRole($adminRole))
{
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
diff --git a/winutil.ps1 b/winutil.ps1
index d961feed..f29d2d26 100644
--- a/winutil.ps1
+++ b/winutil.ps1
@@ -10,8 +10,29 @@
Author : Chris Titus @christitustech
Runspace Author: @DeveloperDurp
GitHub : https://github.com/ChrisTitusTech
- Version : 24.01.12
+ Version : 24.01.15
#>
+param (
+ [switch]$Debug,
+ [string]$Config,
+ [switch]$Run
+)
+
+# Set DebugPreference based on the -Debug switch
+if ($Debug) {
+ $DebugPreference = "Continue"
+}
+
+if ($Config) {
+ $PARAM_CONFIG = $Config
+}
+
+$PARAM_RUN = $false
+# Handle the -Run switch
+if ($Run) {
+ Write-Host "Running config file tasks..."
+ $PARAM_RUN = $true
+}
if (!(Test-Path -Path $ENV:TEMP)) {
New-Item -ItemType Directory -Force -Path $ENV:TEMP
@@ -26,7 +47,7 @@ Add-Type -AssemblyName System.Windows.Forms
# Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $PSScriptRoot
-$sync.version = "24.01.12"
+$sync.version = "24.01.15"
$sync.configs = @{}
$sync.ProcessRunning = $false
@@ -34,6 +55,7 @@ $currentPid = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal = new-object System.Security.Principal.WindowsPrincipal($currentPid)
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
+
if ($principal.IsInRole($adminRole))
{
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
@@ -258,58 +280,60 @@ Function Get-WinUtilCheckBoxes {
#>
Param(
- $Group,
- [boolean]$unCheck = $true
+ [boolean]$unCheck = $false
)
-
- $Output = New-Object System.Collections.Generic.List[System.Object]
-
- if($Group -eq "WPFInstall"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
- $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
- Foreach ($CheckBox in $CheckBoxes){
- if($CheckBox.value.ischecked -eq $true){
- $sync.configs.applications.$($CheckBox.Name).winget -split ";" | ForEach-Object {
- $Output.Add($psitem)
- }
- if ($uncheck -eq $true){
- $CheckBox.value.ischecked = $false
- }
-
- }
- }
+ $Output = @{
+ Install = @()
+ WPFTweaks = @()
+ WPFFeature = @()
+ WPFInstall = @()
}
- if($Group -eq "WPFTweaks"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Tweaks*"}
- $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
- Foreach ($CheckBox in $CheckBoxes){
- if($CheckBox.value.ischecked -eq $true){
- $Output.Add($Checkbox.Name)
+ $CheckBoxes = $sync.GetEnumerator() | Where-Object { $_.Value -is [System.Windows.Controls.CheckBox] }
- if ($uncheck -eq $true){
- $CheckBox.value.ischecked = $false
+ foreach ($CheckBox in $CheckBoxes) {
+ $group = if ($CheckBox.Key.StartsWith("WPFInstall")) { "Install" }
+ elseif ($CheckBox.Key.StartsWith("WPFTweaks")) { "WPFTweaks" }
+ elseif ($CheckBox.Key.StartsWith("WPFFeature")) { "WPFFeature" }
+
+ if ($group) {
+ if ($CheckBox.Value.IsChecked -eq $true) {
+ $feature = switch ($group) {
+ "Install" {
+ # Get the winget value
+ $wingetValue = $sync.configs.applications.$($CheckBox.Name).winget
+
+ if (-not [string]::IsNullOrWhiteSpace($wingetValue) -and $wingetValue -ne "na") {
+ $wingetValue -split ";"
+ } else {
+ $sync.configs.applications.$($CheckBox.Name).choco
+ }
+ }
+ default {
+ $CheckBox.Name
+ }
+ }
+
+ if (-not $Output.ContainsKey($group)) {
+ $Output[$group] = @()
+ }
+ if ($group -eq "Install") {
+ $Output["WPFInstall"] += $CheckBox.Name
+ Write-Debug "Adding: $($CheckBox.Name) under: WPFInstall"
+ }
+
+ Write-Debug "Adding: $($feature) under: $($group)"
+ $Output[$group] += $feature
+
+ if ($uncheck -eq $true) {
+ $CheckBox.Value.IsChecked = $false
}
}
}
}
- if($Group -eq "WPFFeature"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Feature*"}
- $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
- Foreach ($CheckBox in $CheckBoxes){
- if($CheckBox.value.ischecked -eq $true){
- $Output.Add($Checkbox.Name)
-
- if ($uncheck -eq $true){
- $CheckBox.value.ischecked = $false
- }
- }
- }
- }
-
- Write-Output $($Output | Select-Object -Unique)
+ return $Output
}
function Get-WinUtilInstallerProcess {
<#
@@ -874,19 +898,22 @@ function New-Unattend {
# net user administrator /active:yes
#
+ # this section doesn't work in win10/????
+#
+#
+# 0
+#
+#
+# false
+#
+#
+
$unattend = @'
-
-
- 0
-
-
- false
-
-
+
@@ -1590,6 +1617,8 @@ function Invoke-WinUtilTweaks {
$CheckBox,
$undo = $false
)
+
+ Write-Debug "Tweaks: $($CheckBox)"
if($undo){
$Values = @{
Registry = "OriginalValue"
@@ -1609,21 +1638,25 @@ function Invoke-WinUtilTweaks {
}
if($sync.configs.tweaks.$CheckBox.ScheduledTask){
$sync.configs.tweaks.$CheckBox.ScheduledTask | ForEach-Object {
+ Write-Debug "$($psitem.Name) and state is $($psitem.$($values.ScheduledTask))"
Set-WinUtilScheduledTask -Name $psitem.Name -State $psitem.$($values.ScheduledTask)
}
}
if($sync.configs.tweaks.$CheckBox.service){
$sync.configs.tweaks.$CheckBox.service | ForEach-Object {
+ Write-Debug "$($psitem.Name) and state is $($psitem.$($values.service))"
Set-WinUtilService -Name $psitem.Name -StartupType $psitem.$($values.Service)
}
}
if($sync.configs.tweaks.$CheckBox.registry){
$sync.configs.tweaks.$CheckBox.registry | ForEach-Object {
+ Write-Debug "$($psitem.Name) and state is $($psitem.$($values.registry))"
Set-WinUtilRegistry -Name $psitem.Name -Path $psitem.Path -Type $psitem.Type -Value $psitem.$($values.registry)
}
}
if($sync.configs.tweaks.$CheckBox.$($values.ScriptType)){
$sync.configs.tweaks.$CheckBox.$($values.ScriptType) | ForEach-Object {
+ Write-Debug "$($psitem) and state is $($psitem.$($values.ScriptType))"
$Scriptblock = [scriptblock]::Create($psitem)
Invoke-WinUtilScript -ScriptBlock $scriptblock -Name $CheckBox
}
@@ -1632,6 +1665,7 @@ function Invoke-WinUtilTweaks {
if(!$undo){
if($sync.configs.tweaks.$CheckBox.appx){
$sync.configs.tweaks.$CheckBox.appx | ForEach-Object {
+ Write-Debug "UNDO $($psitem.Name)"
Remove-WinUtilAPPX -Name $psitem
}
}
@@ -1926,6 +1960,227 @@ function Set-WinUtilUITheme {
return $inputXML;
}
+function Show-CustomDialog {
+ <#
+ .SYNOPSIS
+ Displays a custom dialog box with an image, heading, message, and an OK button.
+
+ .DESCRIPTION
+ This function creates a custom dialog box with the specified message and additional elements such as an image, heading, and an OK button. The dialog box is designed with a green border, rounded corners, and a black background.
+
+ .PARAMETER Message
+ The message to be displayed in the dialog box.
+
+ .PARAMETER Width
+ The width of the custom dialog window.
+
+ .PARAMETER Height
+ The height of the custom dialog window.
+
+ .EXAMPLE
+ Show-CustomDialog -Message "This is a custom dialog with a message and an image above." -Width 300 -Height 200
+
+ #>
+ param(
+ [string]$Message,
+ [int]$Width = 300,
+ [int]$Height = 200
+ )
+
+ Add-Type -AssemblyName PresentationFramework
+
+ # Define theme colors
+ $foregroundColor = [Windows.Media.Brushes]::White
+ $backgroundColor = [Windows.Media.Brushes]::Black
+ $font = New-Object Windows.Media.FontFamily("Consolas")
+ $borderColor = [Windows.Media.Brushes]::Green
+ $buttonBackgroundColor = [Windows.Media.Brushes]::Black
+ $buttonForegroundColor = [Windows.Media.Brushes]::White
+ $shadowColor = [Windows.Media.ColorConverter]::ConvertFromString("#AAAAAAAA")
+
+ # Create a custom dialog window
+ $dialog = New-Object Windows.Window
+ $dialog.Title = "About"
+ $dialog.Height = $Height
+ $dialog.Width = $Width
+ $dialog.Margin = New-Object Windows.Thickness(10) # Add margin to the entire dialog box
+ $dialog.WindowStyle = [Windows.WindowStyle]::None # Remove title bar and window controls
+ $dialog.ResizeMode = [Windows.ResizeMode]::NoResize # Disable resizing
+ $dialog.WindowStartupLocation = [Windows.WindowStartupLocation]::CenterScreen # Center the window
+ $dialog.Foreground = $foregroundColor
+ $dialog.Background = $backgroundColor
+ $dialog.FontFamily = $font
+
+ # Create a Border for the green edge with rounded corners
+ $border = New-Object Windows.Controls.Border
+ $border.BorderBrush = $borderColor
+ $border.BorderThickness = New-Object Windows.Thickness(1) # Adjust border thickness as needed
+ $border.CornerRadius = New-Object Windows.CornerRadius(10) # Adjust the radius for rounded corners
+
+ # Create a drop shadow effect
+ $dropShadow = New-Object Windows.Media.Effects.DropShadowEffect
+ $dropShadow.Color = $shadowColor
+ $dropShadow.Direction = 270
+ $dropShadow.ShadowDepth = 5
+ $dropShadow.BlurRadius = 10
+
+ # Apply drop shadow effect to the border
+ $dialog.Effect = $dropShadow
+
+ $dialog.Content = $border
+
+ # Create a grid for layout inside the Border
+ $grid = New-Object Windows.Controls.Grid
+ $border.Child = $grid
+
+ # Add the following line to show gridlines
+ #$grid.ShowGridLines = $true
+
+ # Add the following line to set the background color of the grid
+ $grid.Background = [Windows.Media.Brushes]::Transparent
+ # Add the following line to make the Grid stretch
+ $grid.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch
+ $grid.VerticalAlignment = [Windows.VerticalAlignment]::Stretch
+
+ # Add the following line to make the Border stretch
+ $border.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch
+ $border.VerticalAlignment = [Windows.VerticalAlignment]::Stretch
+
+
+ # Set up Row Definitions
+ $row0 = New-Object Windows.Controls.RowDefinition
+ $row0.Height = [Windows.GridLength]::Auto
+
+ $row1 = New-Object Windows.Controls.RowDefinition
+ $row1.Height = [Windows.GridLength]::new(1, [Windows.GridUnitType]::Star)
+
+ $row2 = New-Object Windows.Controls.RowDefinition
+ $row2.Height = [Windows.GridLength]::Auto
+
+ # Add Row Definitions to Grid
+ $grid.RowDefinitions.Add($row0)
+ $grid.RowDefinitions.Add($row1)
+ $grid.RowDefinitions.Add($row2)
+
+ # Add StackPanel for horizontal layout with margins
+ $stackPanel = New-Object Windows.Controls.StackPanel
+ $stackPanel.Margin = New-Object Windows.Thickness(10) # Add margins around the stack panel
+ $stackPanel.Orientation = [Windows.Controls.Orientation]::Horizontal
+ $stackPanel.HorizontalAlignment = [Windows.HorizontalAlignment]::Left # Align to the left
+ $stackPanel.VerticalAlignment = [Windows.VerticalAlignment]::Top # Align to the top
+
+ $grid.Children.Add($stackPanel)
+ [Windows.Controls.Grid]::SetRow($stackPanel, 0) # Set the row to the second row (0-based index)
+
+ $viewbox = New-Object Windows.Controls.Viewbox
+ $viewbox.Width = 25
+ $viewbox.Height = 25
+
+ # Combine the paths into a single string
+# $cttLogoPath = @"
+# M174 1094 c-4 -14 -4 -55 -2 -92 3 -57 9 -75 41 -122 41 -60 45 -75 22 -84 -25 -9 -17 -21 30 -44 l45 -22 0 -103 c0 -91 3 -109 26 -155 30 -60 65 -87 204 -157 l95 -48 110 58 c184 96 205 127 205 293 l0 108 45 22 c47 23 55 36 30 46 -22 8 -18 30 9 63 13 16 34 48 46 71 20 37 21 52 15 116 l-6 73 -69 -23 c-38 -12 -137 -59 -220 -103 -82 -45 -160 -81 -171 -81 -12 0 -47 15 -78 34 -85 51 -239 127 -309 151 l-62 22 -6 -23z m500 -689 c20 -8 36 -19 36 -24 0 -18 -53 -51 -80 -51 -28 0 -80 33 -80 51 0 10 55 38 76 39 6 0 28 -7 48 -15z
+# M177 711 c-19 -88 4 -242 49 -318 43 -74 107 -127 232 -191 176 -90 199 -84 28 7 -169 91 -214 129 -258 220 -29 58 -32 74 -37 190 -4 90 -8 116 -14 92z
+# M1069 610 c-4 -131 -5 -137 -38 -198 -43 -79 -89 -119 -210 -181 -53 -27 -116 -61 -141 -76 -74 -43 -6 -20 115 40 221 109 296 217 294 425 -1 144 -16 137 -20 -10z
+# "@
+$cttLogoPath = @"
+ M 18.00,14.00
+ C 18.00,14.00 45.00,27.74 45.00,27.74
+ 45.00,27.74 57.40,34.63 57.40,34.63
+ 57.40,34.63 59.00,43.00 59.00,43.00
+ 59.00,43.00 59.00,83.00 59.00,83.00
+ 55.35,81.66 46.99,77.79 44.72,74.79
+ 41.17,70.10 42.01,59.80 42.00,54.00
+ 42.00,51.62 42.20,48.29 40.98,46.21
+ 38.34,41.74 25.78,38.60 21.28,33.79
+ 16.81,29.02 18.00,20.20 18.00,14.00 Z
+ M 107.00,14.00
+ C 109.01,19.06 108.93,30.37 104.66,34.21
+ 100.47,37.98 86.38,43.10 84.60,47.21
+ 83.94,48.74 84.01,51.32 84.00,53.00
+ 83.97,57.04 84.46,68.90 83.26,72.00
+ 81.06,77.70 72.54,81.42 67.00,83.00
+ 67.00,83.00 67.00,43.00 67.00,43.00
+ 67.00,43.00 67.99,35.63 67.99,35.63
+ 67.99,35.63 80.00,28.26 80.00,28.26
+ 80.00,28.26 107.00,14.00 107.00,14.00 Z
+ M 19.00,46.00
+ C 21.36,47.14 28.67,50.71 30.01,52.63
+ 31.17,54.30 30.99,57.04 31.00,59.00
+ 31.04,65.41 30.35,72.16 33.56,78.00
+ 38.19,86.45 46.10,89.04 54.00,93.31
+ 56.55,94.69 60.10,97.20 63.00,97.22
+ 65.50,97.24 68.77,95.36 71.00,94.25
+ 76.42,91.55 84.51,87.78 88.82,83.68
+ 94.56,78.20 95.96,70.59 96.00,63.00
+ 96.01,60.24 95.59,54.63 97.02,52.39
+ 98.80,49.60 103.95,47.87 107.00,47.00
+ 107.00,47.00 107.00,67.00 107.00,67.00
+ 106.90,87.69 96.10,93.85 80.00,103.00
+ 76.51,104.98 66.66,110.67 63.00,110.52
+ 60.33,110.41 55.55,107.53 53.00,106.25
+ 46.21,102.83 36.63,98.57 31.04,93.68
+ 16.88,81.28 19.00,62.88 19.00,46.00 Z
+"@
+
+ # Add SVG path
+ $svgPath = New-Object Windows.Shapes.Path
+ $svgPath.Data = [Windows.Media.Geometry]::Parse($cttLogoPath)
+ $svgPath.Fill = $foregroundColor # Set fill color to white
+
+ # Add SVG path to Viewbox
+ $viewbox.Child = $svgPath
+
+ # Add SVG path to the stack panel
+ $stackPanel.Children.Add($viewbox)
+
+ # Add "Winutil" text
+ $winutilTextBlock = New-Object Windows.Controls.TextBlock
+ $winutilTextBlock.Text = "Winutil"
+ $winutilTextBlock.FontSize = 18 # Adjust font size as needed
+ $winutilTextBlock.Foreground = $foregroundColor
+ $winutilTextBlock.Margin = New-Object Windows.Thickness(10, 5, 10, 5) # Add margins around the text block
+ $stackPanel.Children.Add($winutilTextBlock)
+
+ # Add TextBlock for information with text wrapping and margins
+ $messageTextBlock = New-Object Windows.Controls.TextBlock
+ $messageTextBlock.Text = $Message
+ $messageTextBlock.TextWrapping = [Windows.TextWrapping]::Wrap # Enable text wrapping
+ $messageTextBlock.HorizontalAlignment = [Windows.HorizontalAlignment]::Left
+ $messageTextBlock.VerticalAlignment = [Windows.VerticalAlignment]::Top
+ $messageTextBlock.Margin = New-Object Windows.Thickness(10) # Add margins around the text block
+ $grid.Children.Add($messageTextBlock)
+ [Windows.Controls.Grid]::SetRow($messageTextBlock, 1) # Set the row to the second row (0-based index)
+
+ # Add OK button
+ $okButton = New-Object Windows.Controls.Button
+ $okButton.Content = "OK"
+ $okButton.Width = 80
+ $okButton.Height = 30
+ $okButton.HorizontalAlignment = [Windows.HorizontalAlignment]::Center
+ $okButton.VerticalAlignment = [Windows.VerticalAlignment]::Bottom
+ $okButton.Margin = New-Object Windows.Thickness(0, 0, 0, 10)
+ $okButton.Background = $buttonBackgroundColor
+ $okButton.Foreground = $buttonForegroundColor
+ $okButton.BorderBrush = $borderColor
+ $okButton.Add_Click({
+ $dialog.Close()
+ })
+ $grid.Children.Add($okButton)
+ [Windows.Controls.Grid]::SetRow($okButton, 2) # Set the row to the third row (0-based index)
+
+ # Handle Escape key press to close the dialog
+ $dialog.Add_KeyDown({
+ if ($_.Key -eq 'Escape') {
+ $dialog.Close()
+ }
+ })
+
+ # Set the OK button as the default button (activated on Enter)
+ $okButton.IsDefault = $true
+
+ # Show the custom dialog
+ $dialog.ShowDialog()
+}
function Test-WinUtilPackageManager {
<#
@@ -1975,7 +2230,6 @@ Function Update-WinUtilProgramWinget {
Start-Transcript $ENV:TEMP\winget-update.log -Append
winget upgrade --all
- Pause
}
$global:WinGetInstall = Start-Process -Verb runas powershell -ArgumentList "-command invoke-command -scriptblock {$wingetinstall} -argumentlist '$($ProgramsToInstall -join ",")'" -PassThru
@@ -2007,10 +2261,6 @@ function Invoke-WPFButton {
"WPFdesktop" {Invoke-WPFPresets "Desktop"}
"WPFlaptop" {Invoke-WPFPresets "laptop"}
"WPFminimal" {Invoke-WPFPresets "minimal"}
- "WPFexport" {Invoke-WPFImpex -type "export" -CheckBox "WPFTweaks"}
- "WPFimport" {Invoke-WPFImpex -type "import" -CheckBox "WPFTweaks"}
- "WPFexportWinget" {Invoke-WPFImpex -type "export" -CheckBox "WPFInstall"}
- "WPFimportWinget" {Invoke-WPFImpex -type "import" -CheckBox "WPFInstall"}
"WPFclear" {Invoke-WPFPresets -preset $null -imported $true}
"WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"}
"WPFtweaksbutton" {Invoke-WPFtweaksbutton}
@@ -2084,15 +2334,15 @@ function Invoke-WPFFeatureInstall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFFeatureInstall] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $Features = Get-WinUtilCheckBoxes -Group "WPFFeature"
+ $Features = (Get-WinUtilCheckBoxes)["WPFFeatures"]
- Invoke-WPFRunspace -ArgumentList $Features -ScriptBlock {
- param($Features)
+ Invoke-WPFRunspace -ArgumentList $Features,$DebugPreference -ScriptBlock {
+ param($Features, $DebugPreference)
$sync.ProcessRunning = $true
@@ -2103,13 +2353,6 @@ function Invoke-WPFFeatureInstall {
Write-Host "--- Features are Installed ---"
Write-Host "--- A Reboot may be required ---"
Write-Host "==================================="
-
- $ButtonType = [System.Windows.MessageBoxButton]::OK
- $MessageboxTitle = "All features are now installed "
- $Messageboxbody = ("Done")
- $MessageIcon = [System.Windows.MessageBoxImage]::Information
-
- [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
}
}
function Invoke-WPFFixesNetwork {
@@ -2292,7 +2535,7 @@ function Invoke-WPFGetInstalled {
param($checkbox)
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFGetInstalled] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
@@ -2304,8 +2547,8 @@ function Invoke-WPFGetInstalled {
return
}
- Invoke-WPFRunspace -ArgumentList $checkbox -ScriptBlock {
- param($checkbox)
+ Invoke-WPFRunspace -ArgumentList $checkbox,$DebugPreference -ScriptBlock {
+ param($checkbox, $DebugPreference)
$sync.ProcessRunning = $true
@@ -2506,7 +2749,7 @@ function Invoke-WPFImpex {
#>
param(
$type,
- $checkbox
+ $Config = $null
)
if ($type -eq "export"){
@@ -2516,21 +2759,37 @@ function Invoke-WPFImpex {
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog
}
- $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
- $FileBrowser.Filter = "JSON Files (*.json)|*.json"
- $FileBrowser.ShowDialog() | Out-Null
+ if (-not $Config){
+ $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
+ $FileBrowser.Filter = "JSON Files (*.json)|*.json"
+ $FileBrowser.ShowDialog() | Out-Null
- if($FileBrowser.FileName -eq ""){
- return
+ if($FileBrowser.FileName -eq ""){
+ return
+ }
+ else{
+ $Config = $FileBrowser.FileName
+ }
}
-
+
if ($type -eq "export"){
- $jsonFile = Get-WinUtilCheckBoxes $checkbox -unCheck $false
+ $jsonFile = Get-WinUtilCheckBoxes -unCheck $false
$jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force
}
if ($type -eq "import"){
- $jsonFile = Get-Content $FileBrowser.FileName | ConvertFrom-Json
- Invoke-WPFPresets -preset $jsonFile -imported $true -CheckBox $checkbox
+ $jsonFile = Get-Content $Config | ConvertFrom-Json
+
+ $flattenedJson = @()
+ $jsonFile.PSObject.Properties | ForEach-Object {
+ $category = $_.Name
+ foreach ($checkboxName in $_.Value) {
+ if ($category -ne "Install") {
+ $flattenedJson += $checkboxName
+ }
+ }
+ }
+
+ Invoke-WPFPresets -preset $flattenedJson -imported $true
}
}
function Invoke-WPFInstall {
@@ -2542,12 +2801,12 @@ function Invoke-WPFInstall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFInstall] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall"
+ $WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
if ($wingetinstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install"
@@ -2555,24 +2814,15 @@ function Invoke-WPFInstall {
return
}
- Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock {
- param($WingetInstall)
+ Invoke-WPFRunspace -ArgumentList $WingetInstall,$DebugPreference -ScriptBlock {
+ param($WingetInstall, $DebugPreference)
+
try{
$sync.ProcessRunning = $true
- # Ensure winget is installed
Install-WinUtilWinget
-
- # Install all selected programs in new window
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall
- $ButtonType = [System.Windows.MessageBoxButton]::OK
- $MessageboxTitle = "Installs are Finished "
- $Messageboxbody = ("Done")
- $MessageIcon = [System.Windows.MessageBoxImage]::Information
-
- [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
-
Write-Host "==========================================="
Write-Host "-- Installs have finished ---"
Write-Host "==========================================="
@@ -2582,6 +2832,7 @@ function Invoke-WPFInstall {
Write-Host "-- Winget failed to install ---"
Write-Host "==========================================="
}
+ Start-Sleep -Seconds 5
$sync.ProcessRunning = $False
}
}
@@ -2600,7 +2851,7 @@ function Invoke-WPFInstallUpgrade {
}
if(Get-WinUtilInstallerProcess -Process $global:WinGetInstall){
- $msg = "Install process is currently running. Please check for a powershell window labeled 'Winget Install'"
+ $msg = "[Invoke-WPFInstallUpgrade] Install process is currently running. Please check for a powershell window labeled 'Winget Install'"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
@@ -3069,8 +3320,7 @@ function Invoke-WPFPresets {
param(
$preset,
- [bool]$imported = $false,
- $checkbox = "WPFTweaks"
+ [bool]$imported = $false
)
if($imported -eq $true){
@@ -3080,23 +3330,33 @@ function Invoke-WPFPresets {
$CheckBoxesToCheck = $sync.configs.preset.$preset
}
- if($checkbox -eq "WPFTweaks"){
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "*tweaks*"}
- $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
- if ($CheckBoxesToCheck -contains $PSItem.name){
- $sync.$($PSItem.name).ischecked = $true
- }
- else{$sync.$($PSItem.name).ischecked = $false}
+ $CheckBoxes = $sync.GetEnumerator() | Where-Object { $_.Value -is [System.Windows.Controls.CheckBox] }
+ Write-Debug "Getting checkboxes to set $($CheckBoxes.Count)"
+
+ $CheckBoxesToCheck | ForEach-Object {
+ if ($_ -ne $null) {
+ Write-Debug $_
}
}
- if($checkbox -eq "WPFInstall"){
+
+ foreach ($CheckBox in $CheckBoxes) {
+ $checkboxName = $CheckBox.Key
- $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
- $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
- if($($sync.configs.applications.$($psitem.name).winget) -in $CheckBoxesToCheck){
- $sync.$($PSItem.name).ischecked = $true
- }
- else{$sync.$($PSItem.name).ischecked = $false}
+ if (-not $CheckBoxesToCheck)
+ {
+ $sync.$checkboxName.IsChecked = $false
+ continue
+ }
+
+ # Check if the checkbox name exists in the flattened JSON hashtable
+ if ($CheckBoxesToCheck.Contains($checkboxName)) {
+ # If it exists, set IsChecked to true
+ $sync.$checkboxName.IsChecked = $true
+ Write-Debug "$checkboxName is checked"
+ } else {
+ # If it doesn't exist, set IsChecked to false
+ $sync.$checkboxName.IsChecked = $false
+ Write-Debug "$checkboxName is not checked"
}
}
}
@@ -3123,7 +3383,8 @@ function Invoke-WPFRunspace {
[CmdletBinding()]
Param (
$ScriptBlock,
- $ArgumentList
+ $ArgumentList,
+ $DebugPreference
)
# Create a PowerShell instance
@@ -3132,6 +3393,7 @@ function Invoke-WPFRunspace {
# Add Scriptblock and Arguments to runspace
$script:powershell.AddScript($ScriptBlock)
$script:powershell.AddArgument($ArgumentList)
+ $script:powershell.AddArgument($DebugPreference) # Pass DebugPreference to the script block
$script:powershell.RunspacePool = $sync.runspace
# Execute the RunspacePool
@@ -3162,19 +3424,19 @@ function Invoke-WPFShortcut {
$iconPath = $null
Switch ($ShortcutToAdd) {
- "WinUtil" {
- $SourceExe = "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe"
- $IRM = 'irm https://christitus.com/win | iex'
- $Powershell = '-ExecutionPolicy Bypass -Command "Start-Process powershell.exe -verb runas -ArgumentList'
- $ArgumentsToSourceExe = "$powershell '$IRM'"
- $DestinationName = "WinUtil.lnk"
+ "WinUtil" {
+ $SourceExe = "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe"
+ $IRM = 'irm https://christitus.com/win | iex'
+ $Powershell = '-ExecutionPolicy Bypass -Command "Start-Process powershell.exe -verb runas -ArgumentList'
+ $ArgumentsToSourceExe = "$powershell '$IRM'"
+ $DestinationName = "WinUtil.lnk"
- if (Test-Path -Path "$env:TEMP\cttlogo.png") {
- $iconPath = "$env:SystempRoot\cttlogo.ico"
- ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath $iconPath
+ if (Test-Path -Path "$env:TEMP\cttlogo.png") {
+ $iconPath = "$env:SystempRoot\cttlogo.ico"
+ ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath $iconPath
+ }
}
}
- }
$FileBrowser = New-Object System.Windows.Forms.SaveFileDialog
$FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
@@ -3260,13 +3522,13 @@ function Invoke-WPFtweaksbutton {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFtweaksbutton] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $Tweaks = Get-WinUtilCheckBoxes -Group "WPFTweaks"
-
+ $Tweaks = (Get-WinUtilCheckBoxes)["WPFTweaks"]
+
Set-WinUtilDNS -DNSProvider $sync["WPFchangedns"].text
if ($tweaks.count -eq 0 -and $sync["WPFchangedns"].text -eq "Default"){
@@ -3275,21 +3537,20 @@ function Invoke-WPFtweaksbutton {
return
}
- Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock {
- param($Tweaks)
+ Write-Debug "Number of tweaks to process: $($Tweaks.Count)"
+
+ Invoke-WPFRunspace -ArgumentList $Tweaks -DebugPreference $DebugPreference -ScriptBlock {
+ param($Tweaks, $DebugPreference)
+ Write-Debug "Inside Number of tweaks to process: $($Tweaks.Count)"
$sync.ProcessRunning = $true
- # Executes first if selected
- if ("WPFEssTweaksRestorePoint" -in $Tweaks) {
- Invoke-WinUtilTweaks "WPFEssTweaksRestorePoint"
- }
-
+ $cnt = 0
# Execute other selected tweaks
- foreach ($tweak in $tweaks) {
- if ($tweak -ne "WPFEssTweaksRestorePoint") {
- Invoke-WinUtilTweaks $tweak
- }
+ foreach ($tweak in $Tweaks) {
+ Write-Debug "This is a tweak to run $tweak count: $cnt"
+ Invoke-WinUtilTweaks $tweak
+ $cnt += 1
}
$sync.ProcessRunning = $false
@@ -3297,12 +3558,11 @@ function Invoke-WPFtweaksbutton {
Write-Host "-- Tweaks are Finished ---"
Write-Host "================================="
- $ButtonType = [System.Windows.MessageBoxButton]::OK
- $MessageboxTitle = "Tweaks are Finished "
- $Messageboxbody = ("Done")
- $MessageIcon = [System.Windows.MessageBoxImage]::Information
-
- [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
+ # $ButtonType = [System.Windows.MessageBoxButton]::OK
+ # $MessageboxTitle = "Tweaks are Finished "
+ # $Messageboxbody = ("Done")
+ # $MessageIcon = [System.Windows.MessageBoxImage]::Information
+ # [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
}
}
Function Invoke-WPFUltimatePerformance {
@@ -3392,12 +3652,12 @@ function Invoke-WPFundoall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running."
+ $msg = "[Invoke-WPFundoall] Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $Tweaks = Get-WinUtilCheckBoxes -Group "WPFTweaks"
+ $Tweaks = (Get-WinUtilCheckBoxes)["WPFTweaks"]
if ($tweaks.count -eq 0){
$msg = "Please check the tweaks you wish to undo."
@@ -3405,8 +3665,8 @@ function Invoke-WPFundoall {
return
}
- Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock {
- param($Tweaks)
+ Invoke-WPFRunspace -ArgumentList $Tweaks,$DebugPreference -ScriptBlock {
+ param($Tweaks, $DebugPreference)
$sync.ProcessRunning = $true
@@ -3588,12 +3848,12 @@ function Invoke-WPFUnInstall {
#>
if($sync.ProcessRunning){
- $msg = "Install process is currently running"
+ $msg = "[Invoke-WPFUnInstall] Install process is currently running"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
- $WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall"
+ $WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
if ($wingetinstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install"
@@ -3610,8 +3870,9 @@ function Invoke-WPFUnInstall {
if($confirm -eq "No"){return}
- Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock {
- param($WingetInstall)
+ Invoke-WPFRunspace -ArgumentList $WingetInstall,$DebugPreference -ScriptBlock {
+ param($WingetInstall, $DebugPreference)
+
try{
$sync.ProcessRunning = $true
@@ -3785,15 +4046,6 @@ $inputXML = '
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+