Compare commits

..

128 Commits

Author SHA1 Message Date
a5fbff142b Compile Winutil 2024-06-29 11:45:03 +00:00
e830894819 updated KnownIssues.md (#2216)
* Update README.md

* Update KnownIssues.md

* i didnt mean to push this update
2024-06-29 06:44:28 -05:00
d4dc9aec9b Attempt to simplify the launch command (#2214) 2024-06-28 18:29:28 -05:00
e4d0e16b26 Compile Winutil 2024-06-28 23:29:10 +00:00
d6102e8954 Add 'OFGB (Oh Frick Go Back)' App into 'applications.json' File (#2213) 2024-06-28 18:28:46 -05:00
227cb21c24 Compile Winutil 2024-06-28 22:16:05 +00:00
1891ea7966 Remove trailing whitespace characters (#2149)
* Remove All Trailing Whitespace Characters in '.ps1' Files

* Remove All Trailing Whitespace Characters in '.json' Files

* Remove All Trailing Whitespace Characters in '.yaml' Files

* Remove All Trailing Whitespace Characters in Different Files

* Remove Even More Trailing Whitespace Characters
2024-06-28 17:15:39 -05:00
6c49a8f2c9 Compile Winutil 2024-06-28 22:02:55 +00:00
ab384029f1 Replace Where-Object with .where Method (#2212)
* initialize Windev branch

* Formatting

* more Formatting

* fix applications

* init

* remove timer

* Compile Winutil

* revert winutil.ps1

* revert winutil.ps1

* update Get Winutilvariables to use .where method

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
2024-06-28 17:02:32 -05:00
0c32d016b4 Compiler simple improvements and remove app prefix from app list (#2117)
* Re-formate Comments to be a bit Clear-er

* Add New Helper Function to be an Interface for writing Progress Bar when Compiling

* Remove the Need to add 'WPFInstall' for every App Entry Name in 'applications.json' File

* Add 'ValidateRange' to 'Percent' Parameter for 'Update-Progress' Helper Function

This will insure that the passed value is neither below zero nor higher than 100

Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>

* Remove the 'WPFInstall' prefix for several newly added apps

---------

Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>
2024-06-28 16:59:38 -05:00
45818fd80c Compile Winutil 2024-06-28 21:27:55 +00:00
d08954945c Add 'voicemeeter potato' and 'windowgrid' to 'applications.json' (#2190)
* Add Voicemeeter Potato

* add WindowGrid

---------

Co-authored-by: Roshan Studley <OnyxAbove@users.noreply.github.com>
2024-06-28 16:27:34 -05:00
a7ab24e3c9 Compile Winutil 2024-06-28 21:24:06 +00:00
a924d91d65 Fix New Line Character for 'winutil.ps1' File (#2150)
* Change New Line Character from LF to CRLF in 'Get-TabXaml.ps1' Private Function

* Update '.gitattributes' File

Provide stricter rules to be used for multiple file types in the repo.
2024-06-28 16:23:41 -05:00
676e46f59f Add New Escape Character 'Em Dash' to 'Compile.ps1' File (#2153)
This will Insure that an App Entry can use the '—' Character (aka. the 'Em Dash' Character) in their Content (Title) and Description Fields without any worries.
2024-06-28 16:23:21 -05:00
37b9c552df Rework OneDrive removal Tweak (#2155)
* Revamp Onedrive Tweak

* fixes Description

* Add Reg key to Cleanup and Errorhandling
2024-06-28 16:23:05 -05:00
2e12176b2d Create Windev.ps1 loader (#2210)
* initialize Windev branch

* Formatting

* more Formatting
2024-06-28 16:13:12 -05:00
7d1e4a8d82 Update README.md (#2209)
Added automated release number.
2024-06-28 16:09:05 -05:00
4f8e7a8ea7 Compile Winutil 2024-06-28 21:08:42 +00:00
6c4c24b26d Change WinGet ID for 'Fastfetch' to be 'Fastfetch-cli.Fastfetch' instead of 'fastfetch' (#2204)
This will insure no ambiguity would happen in the near future for this App Entry.
2024-06-28 16:08:08 -05:00
d205e75030 docs: update README.md (#2203)
avaliable -> available
2024-06-28 16:07:42 -05:00
12561aba2c Compile Winutil 2024-06-28 21:06:13 +00:00
84fd1bc71c Update applications.json 2024-06-28 16:05:52 -05:00
b9cd563915 Fixed tweak not running and typo (#2201)
Tweak was not executing due to this
2024-06-28 10:25:33 -05:00
58df438b92 Fix 'close old issues' workflow (#2139)
* Remove un-necessary permissions in 'Close Old Issues' GitHub Workflow

* Update 'Close Old Issues' GitHub Workflow

* Re-add permissions in 'Close Old Issues' GitHub Workflow

Didn't know this was needed, reverting commit 8fe062421d
2024-06-28 10:15:16 -05:00
9086b30a75 Added Task View Tweak (#2141)
Co-authored-by: hubster-bot <hubsterbotbuisness@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2024-06-28 10:14:05 -05:00
b268f98b91 Add 'Code With Mu (Mu Editor)' App into 'applications.json' File (#2142) 2024-06-28 10:12:45 -05:00
25a4ebe062 Add 'TagScanner (Tag Scanner)' App into 'applications.json' File (#2143) 2024-06-28 10:12:10 -05:00
60f5ef1f8e Remove Enable IPv6 because it is redundant with undo Disable IPv6 (#2147) 2024-06-28 10:11:06 -05:00
491b0b534c add fastfetch application (#2159) 2024-06-28 10:06:15 -05:00
a59a30f905 Modify Release Workflow (#2160)
* Add pre-release functionality

* Change Pre-Release Action Name

* commit set prerelease to false on release
2024-06-28 10:05:25 -05:00
227babe0e8 Toggle Search Button in the taskbar (#2162) 2024-06-28 10:02:32 -05:00
a0c4b33483 Add 'Advanced Ranamer' & 'Transmission' Apps into 'applications.json' File (#2163) 2024-06-28 10:01:02 -05:00
b831901967 Purging applications (#2169)
* Removed duplicate 'Ditto' entry

* Removed WinDirStat
WinDirStat is outdated and bloating app list. Wiztree should be used instead

* Removed BitCommet
BitCommet is adware and has a history of unethical practices

* Removed Bluestacks
Bluestack 5's installation proccess forceably install Bluestacks X and a crypto wallet alongside it

* Revert "Removed Bluestacks"

This reverts commit 9bd8ffa82d.

* Removed Bluestacks
Bluestack 5's installation proccess forceably install Bluestacks X and a crypto wallet alongside it

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2024-06-28 09:59:15 -05:00
d0427403f1 Compile Winutil 2024-06-28 14:57:07 +00:00
312f42f39a Applications.json tweaks (#2172)
* Changed Go details

* Changed the details of go

* Removed winget trying to install multiple packages at once

* Update DevToys wniget package ID
2024-06-28 09:56:42 -05:00
f68c9bf213 Compile Winutil 2024-06-28 14:55:59 +00:00
7b6a624ec6 fix spelling mistake (#2173) 2024-06-28 09:55:35 -05:00
43304808a9 Add a Chocolatey package for Borderless Gaming (#2175)
Co-authored-by: Roshan Studley <OnyxAbove@users.noreply.github.com>
2024-06-28 09:55:14 -05:00
ad0ed09940 Compile Winutil 2024-06-28 14:54:54 +00:00
b9813f86b9 Moved OrcaSlicer to same category as PrusaSlicer (#2176) 2024-06-28 09:54:30 -05:00
2c5707e18f Update README.md so it gives people latest release. (#2177) 2024-06-28 09:53:52 -05:00
b646b139b8 Compile Winutil 2024-06-28 14:52:48 +00:00
5b369250b6 Update GPU Whitelist System (#2178)
* Compile Winutil

* Update Invoke-WinUtilGPU.ps1

* Re-Formate 'Invoke-WinUtilGPU.ps1' Private Function to be Shorter

* Refactor @blueswills changes

* Change Date to allow for easy merge

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>
2024-06-28 09:52:25 -05:00
9274c683a2 Compile Winutil 2024-06-28 14:50:24 +00:00
f559de3a8c Addition of Format Factory (#2183)
* Added formatfactory

* Remove Proton Drive from this PR

* Removes random space

---------

Co-authored-by: hubster-bot <hubsterbotbuisness@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2024-06-28 09:49:57 -05:00
1e71020757 Compile Winutil 2024-06-28 14:48:21 +00:00
83ef15ccaf Fix 'Invoke-WPFPanelAutologin.ps1' Public Function (#2184) 2024-06-28 09:47:59 -05:00
c2938f9339 Compile Winutil 2024-06-28 14:46:59 +00:00
b2be290be2 DisableConsumerFeatures Tweak (#2187)
* Compile Winutil

* Remove ConsumerFeatures from Disable Telemetry and move it to seperate tweak

* Update winutil.ps1

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
2024-06-28 09:46:35 -05:00
b6723bebf0 Compile Winutil 2024-06-28 14:45:35 +00:00
42c1ef434c remove about redundancy (#2188) 2024-06-28 09:45:10 -05:00
a6ad919f16 remove duplicate of ditto (#2191)
* remove duplicate of ditto

* Update applications.json

---------

Co-authored-by: Roshan Studley <OnyxAbove@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2024-06-28 09:44:48 -05:00
52fd667ef9 Compile Winutil 2024-06-28 14:43:13 +00:00
04130231ff Update Invoke-MicroWin-Helper.ps1 (#2192)
Added Try-Catch block for AppX package removal
2024-06-28 09:42:48 -05:00
a510b52acb Compile Winutil 2024-06-28 14:42:25 +00:00
48581d6aad Add Gitify to applications.json (#2193)
* add Gitify to applications.json

* changed link to website
2024-06-28 09:41:58 -05:00
c3a77e71ad Adobe Network Block Credit (#2194)
add credit in description
2024-06-28 09:41:38 -05:00
3d7b232248 Compile Winutil 2024-06-28 14:41:30 +00:00
b6d1dc50cb Add Mullvad VPN to applications.json (#2195) 2024-06-28 09:40:55 -05:00
f6af93afbd Add Overlay to Taskbaritem (#2196)
* Add taskbaritemoverlay

* remove old commented code
2024-06-28 09:40:38 -05:00
0c841f98e8 Compile Winutil 2024-06-28 14:40:12 +00:00
e4c44e4878 spell fix (#2197) 2024-06-28 09:39:47 -05:00
8a78c960ea Addition of Dropbox (#2200)
Co-authored-by: hubster-bot <hubsterbotbuisness@gmail.com>
2024-06-28 09:39:23 -05:00
cb3b64e195 Compile Winutil 2024-06-25 21:10:43 +00:00
83f93ceba4 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2024-06-25 16:10:07 -05:00
9ac93fd2dc aveyo credit 2024-06-25 16:10:02 -05:00
13712b4c77 Compile Winutil 2024-06-25 20:55:56 +00:00
8d65f3bcf8 Added kicad (#2138)
Co-authored-by: hubster-bot <hubsterbotbuisness@gmail.com>
2024-06-25 15:55:33 -05:00
5c937efa9b Compile Winutil 2024-06-25 20:35:41 +00:00
ade1c3b830 Fixes Edge Removal (#2136)
* Fixes Edge Removal

* Update tweaks.json

add credit for edge removal

* Update tweaks.json

* Update tweaks.json

---------

Co-authored-by: hubster-bot <hubsterbotbuisness@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2024-06-25 15:35:17 -05:00
8ded42a3ce Delete Un-used 'logs' Folder (#2135) 2024-06-25 15:25:46 -05:00
65b91330ed Compile Winutil 2024-06-25 20:15:43 +00:00
98f8b07951 Add rectangle & trigger to xaml (#2120)
- added rectangle with backgroundcolor
- added xName for Application ScrollViewer for identification
- added style to rectangle to show itself if horizontal & vertical scrollviewers are shown
2024-06-25 15:15:20 -05:00
acaad991a7 fix compile run always starting ps5 (#2165) 2024-06-25 15:05:19 -05:00
e00bc5f723 Remove Extra Tabs in 'applications.json' File (#2113) 2024-06-25 14:59:43 -05:00
a5fd8e355d Compile Winutil 2024-06-25 19:52:25 +00:00
8a2e1391e0 Remove unused Functions (#2102) 2024-06-25 14:51:49 -05:00
81c3722881 Compile Winutil 2024-06-25 19:49:16 +00:00
279e707a7a Removed Free File Sync because of Malware warning on choco repo (#2101) 2024-06-25 14:48:50 -05:00
e894613f68 Compile Winutil 2024-06-25 19:45:31 +00:00
be08211cdc lms order fix 2024-06-25 14:45:04 -05:00
118c3e3964 Compile Winutil 2024-06-25 19:40:49 +00:00
3f4e353d13 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2024-06-25 14:40:05 -05:00
a09ae3e251 change lms to advanced 2024-06-25 14:39:56 -05:00
f9c09495fc Compile Winutil 2024-06-25 19:37:59 +00:00
de424ce636 Remove oosu essential tweak (#2099)
* Compile Winutil

* Remove the Essential OO Tweak Checkbox, Rename the OO Button and simplify the OO Script

* Remove The Entire 'Adding: Config *.cfg' Compilation Process

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
2024-06-25 14:37:34 -05:00
c28760e11a Compile Winutil 2024-06-25 19:34:53 +00:00
53090a6164 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2024-06-25 14:34:00 -05:00
4661bf31ba update LMS vPro Tweak 2024-06-25 14:33:58 -05:00
5c687c98c6 Compile Winutil 2024-06-25 19:22:02 +00:00
495e08db05 Test (#1) (#2095)
* remove java 20

* remove java 20
2024-06-25 14:21:35 -05:00
a23d63613f Compile Winutil 2024-06-25 19:19:45 +00:00
acbabd4962 Added Plex Desktop along side Plex Media Server (#2091) 2024-06-25 14:19:20 -05:00
45a18b335f Compile Winutil 2024-06-25 19:15:55 +00:00
c23ea45e61 Remove WwanSvc Service From Manual Services Tweak (#2086)
* Compile Winutil

* Remove WwanSvc from manual Services tweak

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
2024-06-25 14:15:30 -05:00
1f01933cc0 Compile Winutil 2024-06-25 19:10:42 +00:00
4958c5efe9 Remove force install of Winget + Small improvements (#2083)
* Compile Winutil

* Add Run switch to Run winutil automatically after compilation

* Remove Winutil ForceInstall and unnecessary loading bar

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
2024-06-25 14:10:16 -05:00
5dd3bb492f Compile Winutil 2024-06-25 18:56:53 +00:00
9d6d21bd40 Rename app: ForceAutoHDR (#2081)
- Rename "GUI That Forces Auto HDR In Unsupported Games" to it's actual name (ForceAutoHDR) making it shorter & removing the horizontal scroll bar appearing from start. to feel cleaner.
2024-06-25 11:56:23 -07:00
ff80ef491a Compile Winutil 2024-06-25 18:54:42 +00:00
4bc54de8cd Hyperlinks to about section (#2080)
* Hyperlink to CustomDialogs

- added ability to add hyperlinks to CustomDialogs
- Added custom Dialog for every item in the About Section
- added custom link to see the commits of the day of the version the script is on
- added hover effect for linked items

* Fix

- change version link to match changes made to release
- removed date formatting as it is not needed anymore
- Renamed Github Link to "ChrisTitusTech/winutil" because you can't select the text but click on it to open the link directly so it is unnecessary

* fix opening link

- switched method to open hyperlinks
old: [System.Diagnostics.Process]::Start
new: Start-Process
2024-06-25 11:54:18 -07:00
864f063878 Compile Winutil 2024-06-20 19:27:25 +00:00
009ab5066c Create winutil.ps1 2024-06-20 12:27:03 -07:00
a735a02257 add manual trigger 2024-06-20 14:15:08 -07:00
360cc15b4b remove winutil tracking 2024-06-20 13:46:24 -07:00
1e906696f5 Compile Winutil 2024-06-20 18:35:38 +00:00
b6902c116a Add 'TeraCopy' and 'Ambie White Noise' Apps into 'applications.json' File (#2071)
* Add 'Ambie White Noise' App into 'applications.json' File

* Add 'TeraCopy' App into 'applications.json' File
2024-06-20 13:35:14 -05:00
8ace1a32bf Compile Winutil 2024-06-20 18:32:13 +00:00
4fcd3f5b2f Add 'croc' App to 'applications.json' File (#2070) 2024-06-20 13:31:47 -05:00
c942287172 Compile Winutil 2024-06-20 18:30:22 +00:00
7c58eb0e78 Add 'JoyToKey' and 'Wise Program Uninstaller' Apps into 'applications.json' File (#2069)
* Add 'Wise Program Uninstaller' App into 'applications.json' File

* Add 'JoyToKey' App into 'applications.json' File
2024-06-20 13:29:50 -05:00
9be030a4e2 Compile Winutil 2024-06-18 03:17:06 +00:00
4348f052c3 Update Invoke-WinUtilNumLock.ps1 (#2104) 2024-06-17 22:16:40 -05:00
ad81bab274 Update README.md 2024-06-10 23:57:44 -05:00
3a83203298 Update release.yaml 2024-06-10 23:52:52 -05:00
09b1e56967 Update release.yaml 2024-06-10 23:48:00 -05:00
af94adbabe Compile Winutil 2024-06-11 04:36:37 +00:00
a609f771c8 Fix the URL of an Example in 'README.md' File (#2063) 2024-06-10 23:36:11 -05:00
2b80e14bf9 Compile Cleanup and Tweak Fixes (#2062)
* Simple improvements to 'applications.json' File (#2043)

* Replace Spaces with Tabs in 'applications.json' File

* Correct 'AFFiNE' App Entry's Winget ID from 'AFFiNE.stable' to 'ToEverything.AFFiNE' in 'applications.json' File

* Compile Winutil

* Tweaks (#2051)

* Fix Numlock toggle (#2044)

* Fix Numlock at login

* Compile Winutil

---------

Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>

* Compile Winutil

* fix typo (#2041)

* Compile Winutil

* Update README.md

* * Fixed .getignore issues, it's it not enough to just add to gitgnore if it was already tracked by git it will be continued to be tracked by git, so you have to 'git rm' it
* Fixed ooshutup, there is no need to download configs, they are
  already compiled into winutil
+ Added a tweak to remove and disable Intel LMS, which have been
  identifed as a potential backdoor into Windows.

* Update winget.ps1

* + Added new release actions, every time we merge into main it will
  create a release by extracting the version fromwinutil.ps1 and setting
  all appropriate tags and versions

* fix merge

* add compile back in

* Update action to latest tools

* Ensure Compile is finished

---------

Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>
Co-authored-by: nikolan <94351312+nikolan123@users.noreply.github.com>
Co-authored-by: KonTy <KonTy@github.com>
Co-authored-by: Chris Titus <dfm.titus@gmail.com>

* Compile Winutil

* Rework Compile (#2061)

* Compile Winutil

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>
Co-authored-by: KonTy <9524513+KonTy@users.noreply.github.com>
Co-authored-by: nikolan <94351312+nikolan123@users.noreply.github.com>
Co-authored-by: KonTy <KonTy@github.com>
Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>
2024-06-10 15:24:12 -05:00
1325ef54b8 Compile Winutil 2024-06-10 20:19:12 +00:00
8a76641d20 Simplify 'Close Old Issues' Workflow by using 'actions/stale' GitHub Action (#2055) 2024-06-10 15:18:45 -05:00
3dca1ee43e Update README.md 2024-06-06 11:39:49 -05:00
7b6decb28a Compile Winutil 2024-06-06 16:35:38 +00:00
774b64b092 fix typo (#2041) 2024-06-06 11:35:12 -05:00
02ea93c80f Compile Winutil 2024-06-06 16:34:06 +00:00
5e10883547 Fix Numlock toggle (#2044)
* Fix Numlock at login

* Compile Winutil

---------

Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>
2024-06-06 11:33:39 -05:00
a8af90a112 Test 2024 04 20 2 (#2030)
* Several Additions to 'applications.json' File (#1865)

* Add 'ditto' App to 'applications.json' File

* Add 'rdcman' App to 'applications.json' File

* Add 'mp3tag' App to 'applications.json' File

* Add 'fan control' App to 'applications.json' File

* Compile Winutil

* Add 'betterbird' App to 'applications.json' File (#1876)

* Compile Winutil

* Added fnm to the install menu (#1879)

* Compile Winutil

* Update applications.json (#1883)

* Compile Winutil

* Simple improvement: make WinUtil's Shortcut Function Do Less (Lazier) (#1903)

* Add Extra Comments to 'Invoke-WPFShortcut' to make the Logic a Bit Clearer

* Make The 'Invoke-WPFShortcut' Function Lazier for Added Efficiency and to not Display False Info whenever the User Cancels the 'Save As' Operation

* Compile Winutil

* Update applications.jsonremove Whatsapp because it is not being maintained and is named "outdated" when installed

* Update applications.json

remove Whatsapp because it is not being maintained and is named "outdated" when installed

* Compile Winutil

* Add option to remove Microsoft Copilot AI

* Add option to remove MS Copilot

* Update tweaks.json

* fix bugs

- remove appx caused a lockup
- also it looks like copilot will be the dependency for some built-in windows searches
Due to this I am changing it from a removal to a disable.

* Compile Winutil

* remove authy authy reached EOLhttps://help.twilio.com/articles/22771146070299-User-guide-End-of-Life-EOL-for-Twilio-Authy-Desktop-app

* remove authy 

authy reached EOL
https://help.twilio.com/articles/22771146070299-User-guide-End-of-Life-EOL-for-Twilio-Authy-Desktop-app

* Compile Winutil

* Update applications.jsonWindhawkThe customization marketplace for Windows programshttps://www.youtube.com/watch?v=ijG0nXnO2gQ

* Update applications.json

Windhawk
The customization marketplace for Windows programs

https://www.youtube.com/watch?v=ijG0nXnO2gQ

* add MSEdgeRedirect to applications.jsonperhaps a good "tweak" that could be added to Tweaks section down the road.  project is foss... could be   a good resource for someone with enough skills.in the meantime, does what it says it will, and does it well.

* add MSEdgeRedirect to applications.json

perhaps a good "tweak" that could be added to Tweaks section down the road.  project is foss... could be   a good resource for someone with enough skills.

in the meantime, does what it says it will, and does it well.

* Fix Winget Detection by doing Proper Error Handling using a Try-Catch

* Fix Winget Detection by doing Proper Error Handling using a Try-Catch

* Remove unnecessary Variable Initialization of 'wingetFullVersion'

Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>

* Add Comments to be make The Logic a Lot More Clear to Follow and Understand

* Add Another Catch Statement with some 'Write-Warning' for Extra Information

* Remove StartAllBack + Adobe Debloater Tweak + Add Netbird

* remove StartAllBack

* Added Adobe Service Debloater

Sets Adobe Services to manual for people that sadly need to work with their apps.

* Add Netbird

https://netbird.io

* Compile Winutil

* Update applications.json

* Compile Winutil

* Added ability to import drivers

* Added ability to import drivers

Added the ability to import drivers from the active installation to the MicroWin image.

* Merge branch 'test-2024-04-20-2' into CW-MicroWin-240420

* Update inputXML.xaml

Removed warning because of a fluke

* Update Invoke-WPFMicrowin.ps1

Use the driver injection directory if it is specified and if the directory exists

* Merge branch 'test-2024-04-20-2' into CW-MicroWin-240420

* Merge branch 'test-2024-04-20-2' into CW-MicroWin-240420

* Compile Winutil

* Test 2024 04 20 2 | 7 additions to applications.json

* 7 additions to applications.json

Adds:

NetLimiter - https://www.netlimiter.com
OneCommander - https://www.onecommander.com
Borderless Gaming - https://github.com/Codeusa/Borderless-Gaming
Equalizer APO - https://sourceforge.net/projects/equalizerapo
FreeFileSync - https://freefilesync.org
Elgato Stream Deck - https://www.elgato.com/uk/en/s/downloads
Stardock Curtains - https://www.stardock.com/products/curtains

* Added Compact GUI support

Link: https://github.com/IridiumIO/CompactGUI

Since I wasn't sure what category to put it in, I chose Utilities.

* Added ExifCleaner support

Link: https://github.com/szTheory/exifcleaner

* Removed trial ware additions

Removed:

Net Limiter
One Commander
Elgato: Stream Deck
Stardock Curtains

* Compile Winutil

* add GlazeWM to applications.js (#1891)

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Remove old Win7 game tweak

* Compile Winutil

* Test 1715290913 fix ugly ifs (#1957)

* fix nested ifs

* Compile Winutil

* fix syntax

* Compile Winutil

* Add Spotify and Choco Fallback

* Compile Winutil

---------

Co-authored-by: ty802 <ty802@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>

* Compile Winutil

* Fix incorrect url for jellyfin-media-player (#1912)

* Compile Winutil

* Update name and description for Element (#1930)

- Fixed the name and description for Element to reflect the name of the client, rather than the underlying technology-Matrix.

* Compile Winutil

* Optimize winget download speed (#1931)

* Optimize Winget Download Speed

* Add Downloading Message

* Compile Winutil

* Include OOSU Config in winutil.ps1 (#1932)

* Compile Winutil

* Only install choco if needed (#1943)

* Compile Winutil

* Install Choco if needed

* Compile Winutil

* Added ForceAutoHDR application to applications.json (#1951)

* Added ForceAutoHDR application to applications.json

Entry added on line 2642

* Update config/applications.json

Yep my bad I though games related tools should be under "Games"

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>

* Compile Winutil

* add Godot Engine to applications.json (#1933)

Added Godot Engine (https://godotengine.org/).

Godot Engine is a free, open-source 2D and 3D game engine with a focus on usability and flexibility.

* Compile Winutil

* Add GitKraken Client (#1927)

Adds development utility client for git repository management

* Compile Winutil

* Simplified Admin Check and Added Code Comments (#1938)

- Simplified the admin check by filtering the "WindowsIdentity" class for owner value and comparing against admin value
- Removed the need for an if admin check by moving its commands under the if not admin check.
- Added code comments

* Compile Winutil

* Main window handle (#1941)

Condition is comparing $proc.Id with [System.IntPtr]::Zero. The Id property is an integer, representing the process ID, and it's not directly related to window handles.
Instead, you should compare the MainWindowHandle property against [System.IntPtr]::Zero

* Compile Winutil

* Add SMPlayer to `applications.json` (#1948)

* Add SMPlayer to `applications.json`

* Fix formatting

---------

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Adobe Network Blocking / Adobe Debloater / Tweak Fixes & more (#1954)

* Added Applications

AFFiNE: Open source Notion alternative with selfhostable option for syncing.

Wazuh Agent: Adgent for open-source security monitoring platform

* Change layout of toggles

Change the layout of the toggles to first show toggles and then the content (text).
- testet, works

* added snap related toggles

- disable snapping entirely (requires relogin of windows user)
- disable suggestion to snap other windows next to the snapped window

-tested

* Layouted Checkboxes, redesigned Toggles & renamed RDCMan

- Removed text inside toggle as it can be confusing because it sais "enable" while enabled and "disable" if disabled. The coloring should be enough to know in what state that setting is.
- without the text i could make it a little bit smaller while still letting it look good.
- Renamed "Remote Desktop Connection Manager (RDCMan)" to "RDCMan" because that name is shorter and also mostly used by the linked site.
- layouted checkboxes so they are not more left than the title and look tidy.

- tested

* Disable Acrobat auto-updates

- added script & undoscript to disable automatic downloads & installation of acrobat reader. The user gets a notified if there is an update available. I put some info to that inside the code

* edited AFFiNE description

* Tweak Adobe Debloater

-disable Adobe Desktop Service by getting ownership and renaming it.
- added AGMService service
- disable AGMService and AGSService entirely

* Block Adobe Network, Debloat Adobe & Compile

- fixes order of tweaks to always run "WPFTweaksRestorePoint" first. Before it was only the case because if was one of the first letter0s of the alphabet
- Fixed some stuff at Debloat Adobe & added Adobe Reader update stopper & "deactivated" Adobe Desktop Service.
- Added Blocking of Adobe Servers (as of your suggestion) to it's own Tweak.
- ran compile for testing & showing

* undo compilation

* added Note to AcrobatUpdates Management in Tweak "Debloat Adobe"

* Fix Right Click Method to use accurate names

* fixed my mistake in README

---------

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Install flow rework (#1961)

* Install flow rework
Sperated Winget and Chocolatey setps when installing software add skip them when not needed

* fix uninstall

---------

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Made disabling Fullscreen optimizations its own tweak (#1934)

* Removed "GameDVR_DXGIHonorFSEWindowsCompatible" modification from "Disable GameDVR" tweak
* Created advanced tweak "Disable fullscreen optimizations"
Disables fullscreen optimizations in all applications. (Which can cause problems with Color Management in Exclusive Fullscreen)

* Compile Winutil

* fix glaze

* Compile Winutil

* Fix Typo in the App Entry 'GlazeWM' in 'applications.json' File (#1958)

* Reorder Tweaks

* Fix ordering of Advanced Tweaks

* Compile Winutil

* Preset Update

* Organize Tweaks

* Compile Winutil

* Add the pixi package manager

* Add the pixi package manager

* Compile Winutil

* Add Arc Browser to the application list.

* Add Arc Browser to the application list.

* Compile Winutil

* Update applications.json - Added NDI toolsNDI, or Network Device Interface, is developed by Newtek. It enables the encoding, transmission, and reception of high-quality, low latency, video and audio over IP.https://ndi.video/Apologies if I'm not doing this right. I have zero experience using Github.

* Update applications.json - Added NDI tools

NDI, or Network Device Interface, is developed by Newtek. It enables the encoding, transmission, and reception of high-quality, low latency, video and audio over IP.

https://ndi.video/

Apologies if I'm not doing this right. I have zero experience using Github.

* Compile Winutil

* docs: minor spellchecking

* docs: minor spellchecking

* Fix scratch textbox bug

* Fix scratch textbox bug

* Fixing Microwin, no more errors and it creats image now without issues

* Compile Winutil

* Tweaks page overhaul:

* Toggle page overhaul:
* Modern toggles
+ Tweak: Disable Copilot
+ Tweak: Set hibernation to default (fix issue
  https://github.com/ChrisTitusTech/winutil/issues/1399)

* Merge branch 'test-2024-04-20-2' into TweaksToggles

* Compile Winutil

* Able to set the Default Terminal to Powershell 7 in Windows Terminal

* Run winget in open powershell window if possible and handle update

* add return code reference

* Seperated Logic for PS7 Profile change

* Add tweak

* Revert changes to last commit in Christitus Repo

* Merge pull request #1 from Marterich/PS7profile

Split Logic in different Script, Re-Add files with to reflect Chris's Repo

* Compile Winutil

* Update tweaks.json

* Compile Winutil

* Update tweaks.json

* Compile Winutil

* disables to disable

* Compile Winutil

* Update applications.json - Files, ditto, spotube, sagethumbs added & file converter choco variable fixed (#1996)

Added Files, ditto, spotube and sagethumbs.

Fixed File Converted by Adrien Allard with proper Choco variable.
"files">"file-conveter"
	"WPFInstallfileconverter": {
		"category": "Utilities",
		"choco": "file-converter",
		"content": "File-Converter",
		"description": "File Converter is a very simple tool which allows you to convert and compress one or several file(s) using the context menu in windows explorer.",
		"link": "https://file-converter.io/",
		"winget": "AdrienAllard.FileConverter"

* Compile Winutil

* Winget install return code handling & Window management (#1992)

* Run winget in open powershell window if possible and handle update

* add return code reference

* Compile Winutil

* Fix typo (#1965)

Co-authored-by: Chris Titus <contact@christitus.com>

* Change voicemeeter URL to their newer site (#1967)

* Compile Winutil

* Change voicemeeter URL to newest site

* Compile Winutil

---------

Co-authored-by: Yuuh15 <Yuuh15@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>

* Removed broken winget from applications.json (#1968)

The winget does not work for vencord. The installer downloads and then fails. (#1515)

* Compile Winutil

* Optimize Display Behaviour of Category Labels  (#1979)

* Hide Category title if empty

* Changed labels to a hashtable for faster access

* Extract WPFNamecreation to function, fix hide all if none match

* Compile Winutil

* ps1 ext add

* Update oosu10 config files and ad missing fileextension (#1980)

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Fix fallback bug and merge choco uninstall rework (#1962)

* Implement Uninstall Command for Chocolatey, and Made a Starting Point on the Automatic Upgrade when a Package is Already Installed, similar to WinGet Install Command

* Add Extra Guards/Checks in 'Install-WinUtilProgramChoco' Private Function

* Fix fallback bug and merge choco uninstall rework

 - fixed return from wrong return from winget install
   Install-WinUtilProgramWinget
 - syntax/wording cleenup in Install-WinUtilProgramWinget

 - fix bugs in ty802/winutil#1 after merge

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Update applications.json (#1976)

added qgis in right format

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* fix sagethumbs error

* Compile Winutil

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>
Co-authored-by: Melloni <66322451+MelloniDev@users.noreply.github.com>
Co-authored-by: Justawildwolf <62820836+blusewill@users.noreply.github.com>
Co-authored-by: MyDrift <personal@mdiana.ch>
Co-authored-by: ModernTTY <165050080+ModernTTY@users.noreply.github.com>
Co-authored-by: Kasim <kasim@rafique.co.uk>
Co-authored-by: trenton4k <trenton4k@gmail.com>
Co-authored-by: Evan Galvin <evan.galvin@blissroms.org>
Co-authored-by: CodingWonders <101426328+CodingWonders@users.noreply.github.com>
Co-authored-by: misspent <78914154+misspent@users.noreply.github.com>
Co-authored-by: Federico Pulcino <78621373+FedeP14@users.noreply.github.com>
Co-authored-by: kian yamamoto <kiany@thatnameisnotavailable.com>
Co-authored-by: ty802 <ty802@users.noreply.github.com>
Co-authored-by: Callum Carmicheal <callumcarmicheal@gmail.com>
Co-authored-by: Rux <jonathan.e.rux@ruxunderscore.com>
Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>
Co-authored-by: Andrew <121936658+7gxycn08@users.noreply.github.com>
Co-authored-by: Jelle <89023848+mrjbongo@users.noreply.github.com>
Co-authored-by: Marc Brooks <IDisposable@gmail.com>
Co-authored-by: Hayden Plumley <mrhaydendp@gmail.com>
Co-authored-by: Berrick Werkman <105836264+BKlaasWerkman@users.noreply.github.com>
Co-authored-by: o-iu <168581616+o-iu@users.noreply.github.com>
Co-authored-by: Luadih <50816896+Luadih@users.noreply.github.com>
Co-authored-by: Morten Enemark Lund <melund@gmail.com>
Co-authored-by: Pleș Alexandru <34649178+plesalex100@users.noreply.github.com>
Co-authored-by: tvrepairguy <170785918+tvrepairguy@users.noreply.github.com>
Co-authored-by: LazyStability <Klysmus@online.de>
Co-authored-by: KonTy <9524513+KonTy@users.noreply.github.com>
Co-authored-by: drabspirit <39843622+drabspirit@users.noreply.github.com>
Co-authored-by: Yuri Gabriel <97139700+Yuuh15@users.noreply.github.com>
Co-authored-by: Yuuh15 <Yuuh15@users.noreply.github.com>
Co-authored-by: Owen <78411938+Owen-3456@users.noreply.github.com>
Co-authored-by: Snoep <128747388+SnoepNFTs@users.noreply.github.com>
2024-06-04 22:27:27 -05:00
67 changed files with 4544 additions and 4191 deletions

9
.gitattributes vendored
View File

@ -1,3 +1,12 @@
* text=auto
*.ps1 text eol=crlf
*.json text eol=crlf
*.cfg text eol=crlf
*.png binary
*.jpg binary
config/* diff config/* diff
config/applications.json diff config/applications.json diff
*.json diff *.json diff

View File

@ -4,91 +4,32 @@ on:
schedule: schedule:
- cron: '0 0 * * *' # Run daily - cron: '0 0 * * *' # Run daily
workflow_dispatch: # This line enables manual triggering workflow_dispatch: # This line enables manual triggering
jobs: jobs:
close-issues: close-issues:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
issues: write # Ensure necessary permissions for issues issues: write # Ensure necessary permissions for issues
pull-requests: none
contents: none
steps: steps:
- name: Close inactive issues - name: Close inactive issues
uses: actions/github-script@v7 uses: actions/stale@v9.0.0
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} # A list of labels to reference when looking through issues,
script: | # and only when one (or even more) of these labels are found..
const octokit = github; # then skip this issue, and never try to stale and/or close it.
exempt-issue-labels: "Keep Issue Open"
// Get the repository owner and name # Split it into two weeks, after one week the issue will be marked as stale,
const { owner, repo } = context.repo; # after another week have pasted without any update.. the issue will then be closed.
days-before-issue-stale: 7
// Define the inactivity period (14 days) days-before-issue-close: 7
const inactivityPeriod = new Date(); # NEVER mark PRs as Stale or Close + this workflow should never have write permissions on PRs, EVER!
inactivityPeriod.setDate(inactivityPeriod.getDate() - 14); days-before-pr-stale: -1
days-before-pr-close: -1
const labelKeepIssue = 'Keep Issue Open'; # Sends a message for both the Stale and Close events of an issue.
stale-issue-message: "This issue was marked as stale because it has been inactive for 7 days"
try { close-issue-message: "This issue was closed because it has been inactive for 7 days since it was marked as stale"
// Get all open issues with pagination # Make this field equal true if you want to test your configuration if it works correctly or not
for await (const response of octokit.paginate.iterator(octokit.rest.issues.listForRepo, { debug-only: false
owner, repo-token: ${{ secrets.GITHUB_TOKEN }}
repo,
state: 'open',
})) {
const issues = response.data;
// Close issues inactive for more than the inactivity period
for (const issue of issues) {
let closeIssue = true;
// Get all Labels of issue, and compared each label with the labelKeepIssue const variable
try {
const respondIssueLabels = await octokit.request("GET /repos/{owner}/{repo}/issues/{issue_number}/labels", {
owner: owner,
repo: repo,
issue_number: issue.number
});
const labels = respondIssueLabels.data;
for (let i = 0; i < labels.length; i++) {
const label = labels[i]
if (label.name === labelKeepIssue) {
console.log(`Issue #${issue.number} will not be closed`);
closeIssue = false;
break; // Break from the loop, no need to check the remaining Labels.
}
}
} catch (error) {
console.error(`Error while Fetching Labels for Issue #${issue.number}, Error: ${error}`);
}
if (!closeIssue) {
continue; // Skip the next bit of code
}
const lastCommentDate = issue.updated_at;
if (new Date(lastCommentDate) < inactivityPeriod) {
try {
// Close the issue
await octokit.rest.issues.update({
owner,
repo,
issue_number: issue.number,
state: 'closed',
});
// Add a comment
await octokit.rest.issues.createComment({
owner,
repo,
issue_number: issue.number,
body: 'Closed due to inactivity',
});
} catch (error) {
console.error(`Error updating or commenting on issue #${issue.number}: ${error}`);
}
}
}
}
} catch (error) {
console.error(`Error fetching issues: ${error}`);
}

25
.github/workflows/compile.yaml vendored Normal file
View File

@ -0,0 +1,25 @@
name: Compile
on:
push:
branches:
- main
- test*
workflow_dispatch: # Manual trigger added
jobs:
build-runspace:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- name: Compile project
shell: pwsh
run: |
Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1
continue-on-error: false # Directly fail the job on error, removing the need for a separate check
- uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: Compile Winutil
if: success()

46
.github/workflows/pre-release.yaml vendored Normal file
View File

@ -0,0 +1,46 @@
name: Pre-Release WinUtil
on:
workflow_run:
workflows: ["Compile"] #Ensure Compile winget.ps1 is done
types:
- completed
workflow_dispatch: # Manual trigger added
jobs:
build-runspace:
runs-on: windows-latest
outputs:
version: ${{ steps.extract_version.outputs.version }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Extract Version from winutil.ps1
id: extract_version
run: |
$version = ''
Get-Content ./winutil.ps1 -TotalCount 30 | ForEach-Object {
if ($_ -match 'Version\s*:\s*(\d{2}\.\d{2}\.\d{2})') {
$version = $matches[1]
echo "version=$version" >> $GITHUB_ENV
echo "::set-output name=version::$version"
break
}
}
if (-not $version) {
Write-Error "Version not found in winutil.ps1"
exit 1
}
shell: pwsh
- name: Create and Upload Release
id: create_release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.extract_version.outputs.version }}
name: Pre-Release ${{ steps.extract_version.outputs.version }}
files: ./winutil.ps1
prerelease: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,24 +1,42 @@
name: Update Branch name: Release WinUtil
on: on:
push: workflow_dispatch: # Manual trigger added
branches:
- main
- test*
jobs: jobs:
build-runspace: build-runspace:
runs-on: windows-latest runs-on: windows-latest
outputs:
version: ${{ steps.extract_version.outputs.version }}
steps: steps:
- uses: actions/checkout@v4 - name: Checkout Repository
with: uses: actions/checkout@v4
ref: ${{ github.head_ref }}
- name: Compile project - name: Extract Version from winutil.ps1
shell: pwsh id: extract_version
run: | run: |
Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1 $version = ''
continue-on-error: false # Directly fail the job on error, removing the need for a separate check Get-Content ./winutil.ps1 -TotalCount 30 | ForEach-Object {
- uses: stefanzweifel/git-auto-commit-action@v5 if ($_ -match 'Version\s*:\s*(\d{2}\.\d{2}\.\d{2})') {
with: $version = $matches[1]
commit_message: Compile Winutil echo "version=$version" >> $GITHUB_ENV
if: success() echo "::set-output name=version::$version"
break
}
}
if (-not $version) {
Write-Error "Version not found in winutil.ps1"
exit 1
}
shell: pwsh
- name: Create and Upload Release
id: create_release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.extract_version.outputs.version }}
name: Release ${{ steps.extract_version.outputs.version }}
files: ./winutil.ps1
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

1
.gitignore vendored
View File

@ -44,3 +44,4 @@ Microsoft.PowerShell.ConsoleHost.dll
microwin.log microwin.log
True True
test.ps1 test.ps1
winutil.ps1

View File

@ -1,30 +1,57 @@
param (
[switch]$Debug,
[switch]$Run
)
$OFS = "`r`n" $OFS = "`r`n"
$scriptname = "winutil.ps1" $scriptname = "winutil.ps1"
# Variable to sync between runspaces # Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{}) $sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $PSScriptRoot $sync.PSScriptRoot = $PSScriptRoot
$sync.configs = @{} $sync.configs = @{}
if (Test-Path -Path "$($scriptname)") function Update-Progress {
{ param (
Remove-Item -Force "$($scriptname)" [Parameter(Mandatory, position=0)]
[string]$StatusMessage,
[Parameter(Mandatory, position=1)]
[ValidateRange(0,100)]
[int]$Percent,
[Parameter(position=2)]
[string]$Activity = "Compiling"
)
Write-Progress -Activity $Activity -Status $StatusMessage -PercentComplete $Percent
} }
Write-output ' $header = @"
################################################################################################################ ################################################################################################################
### ### ### ###
### WARNING: This file is automatically generated DO NOT modify this file directly as it will be overwritten ### ### WARNING: This file is automatically generated DO NOT modify this file directly as it will be overwritten ###
### ### ### ###
################################################################################################################ ################################################################################################################
' | 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
# Create the script in memory.
Update-Progress "Pre-req: Allocating Memory" 0
$script_content = [System.Collections.Generic.List[string]]::new()
Update-Progress "Adding: Header" 5
$script_content.Add($header)
Update-Progress "Adding: Version" 10
$script_content.Add($(Get-Content .\scripts\start.ps1).replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)"))
Update-Progress "Adding: Functions" 20
Get-ChildItem .\functions -Recurse -File | ForEach-Object { Get-ChildItem .\functions -Recurse -File | ForEach-Object {
Get-Content $psitem.FullName | Out-File ./$scriptname -Append -Encoding ascii $script_content.Add($(Get-Content $psitem.FullName))
} }
Update-Progress "Adding: Config *.json" 40
Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object { Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
$json = (Get-Content $psitem.FullName).replace("'","''") $json = (Get-Content $psitem.FullName).replace("'","''")
# Replace every XML Special Character so it'll render correctly in final build # Replace every XML Special Character so it'll render correctly in final build
@ -35,25 +62,39 @@ Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-
$_.Replace('=}','').Replace('@{','').Replace(' ','') $_.Replace('=}','').Replace('@{','').Replace(' ','')
} }
for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) { # Note:
# Avoid using HTML Entity Codes, for example '&rdquo;' (stands for "Right Double Quotation Mark"),
# Use **HTML decimal/hex codes instead**, as using HTML Entity Codes will result in XML parse Error when running the compiled script.
for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) {
$firstLevelName = $firstLevelJsonList[$i] $firstLevelName = $firstLevelJsonList[$i]
# Note: Avoid using HTML Entity Codes (for example '&rdquo;' (stands for "Right Double Quotation Mark")), and use HTML decimal/hex codes instead.
# as using HTML Entity Codes will result in XML parse Error when running the compiled script.
if ($jsonAsObject.$firstLevelName.content -ne $null) { if ($jsonAsObject.$firstLevelName.content -ne $null) {
$jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('&','&#38;').replace('“','&#8220;').replace('”','&#8221;').replace("'",'&#39;').replace('<','&#60;').replace('>','&#62;') $jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('&','&#38;').replace('“','&#8220;').replace('”','&#8221;').replace("'",'&#39;').replace('<','&#60;').replace('>','&#62;').replace('—','&#8212;')
$jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('&#39;&#39;',"&#39;") # resolves the Double Apostrophe caused by the first replace function in the main loop $jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('&#39;&#39;',"&#39;") # resolves the Double Apostrophe caused by the first replace function in the main loop
} }
if ($jsonAsObject.$firstLevelName.description -ne $null) { if ($jsonAsObject.$firstLevelName.description -ne $null) {
$jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('&','&#38;').replace('“','&#8220;').replace('”','&#8221;').replace("'",'&#39;').replace('<','&#60;').replace('>','&#62;') $jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('&','&#38;').replace('“','&#8220;').replace('”','&#8221;').replace("'",'&#39;').replace('<','&#60;').replace('>','&#62;').replace('—','&#8212;')
$jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('&#39;&#39;',"&#39;") # resolves the Double Apostrophe caused by the first replace function in the main loop $jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('&#39;&#39;',"&#39;") # resolves the Double Apostrophe caused by the first replace function in the main loop
} }
} }
# The replace at the end is required, as without it the output of converto-json will be somewhat weird for Multiline String
# Most Notably is the scripts in json files, make=ing it harder for users who want to review these scripts that are found in the final compiled script # Add 'WPFInstall' as a prefix to every entry-name in 'applications.json' file
$json = ($jsonAsObject | convertto-json -Depth 3).replace('\r\n',"`r`n") if ($psitem.Name -eq "applications.json") {
for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) {
$appEntryName = $firstLevelJsonList[$i]
$appEntryContent = $jsonAsObject.$appEntryName
# Remove the entire app entry, so we could add it later with a different name
$jsonAsObject.PSObject.Properties.Remove($appEntryName)
# Add the app entry, but with a different name (WPFInstall + The App Entry Name)
$jsonAsObject | Add-Member -MemberType NoteProperty -Name "WPFInstall$appEntryName" -Value $appEntryContent
}
}
# The replace at the end is required, as without it the output of 'converto-json' will be somewhat weird for Multiline Strings
# Most Notably is the scripts in some json files, making it harder for users who want to review these scripts, which're found in the compiled script
$json = ($jsonAsObject | convertto-json -Depth 3).replace('\r\n',"`r`n")
$sync.configs.$($psitem.BaseName) = $json | convertfrom-json $sync.configs.$($psitem.BaseName) = $json | convertfrom-json
Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" | Out-File ./$scriptname -Append -Encoding ascii $script_content.Add($(Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" ))
} }
$xaml = (Get-Content .\xaml\inputXML.xaml).replace("'","''") $xaml = (Get-Content .\xaml\inputXML.xaml).replace("'","''")
@ -61,29 +102,44 @@ $xaml = (Get-Content .\xaml\inputXML.xaml).replace("'","''")
# Dot-source the Get-TabXaml function # Dot-source the Get-TabXaml function
. .\functions\private\Get-TabXaml.ps1 . .\functions\private\Get-TabXaml.ps1
## Xaml Manipulation Update-Progress "Building: Xaml " 75
$tabColumns = Get-TabXaml "applications" 5 $appXamlContent = Get-TabXaml "applications" 5
$tabColumns | Out-File -FilePath ".\xaml\inputApp.xaml" -Encoding ascii $tweaksXamlContent = Get-TabXaml "tweaks"
$tabColumns = Get-TabXaml "tweaks" $featuresXamlContent = Get-TabXaml "feature"
$tabColumns | Out-File -FilePath ".\xaml\inputTweaks.xaml" -Encoding ascii
$tabColumns = Get-TabXaml "feature"
$tabColumns | Out-File -FilePath ".\xaml\inputFeatures.xaml" -Encoding ascii
# Assuming inputApp.xaml is in the same directory as main.ps1
$appXamlPath = Join-Path -Path $PSScriptRoot -ChildPath "xaml/inputApp.xaml"
$tweaksXamlPath = Join-Path -Path $PSScriptRoot -ChildPath "xaml/inputTweaks.xaml"
$featuresXamlPath = Join-Path -Path $PSScriptRoot -ChildPath "xaml/inputFeatures.xaml"
# Load the XAML content from inputApp.xaml
$appXamlContent = Get-Content -Path $appXamlPath -Raw
$tweaksXamlContent = Get-Content -Path $tweaksXamlPath -Raw
$featuresXamlContent = Get-Content -Path $featuresXamlPath -Raw
Update-Progress "Adding: Xaml " 90
# Replace the placeholder in $inputXML with the content of inputApp.xaml # Replace the placeholder in $inputXML with the content of inputApp.xaml
$xaml = $xaml -replace "{{InstallPanel_applications}}", $appXamlContent $xaml = $xaml -replace "{{InstallPanel_applications}}", $appXamlContent
$xaml = $xaml -replace "{{InstallPanel_tweaks}}", $tweaksXamlContent $xaml = $xaml -replace "{{InstallPanel_tweaks}}", $tweaksXamlContent
$xaml = $xaml -replace "{{InstallPanel_features}}", $featuresXamlContent $xaml = $xaml -replace "{{InstallPanel_features}}", $featuresXamlContent
Write-output "`$inputXML = '$xaml'" | Out-File ./$scriptname -Append -Encoding ascii $script_content.Add($(Write-output "`$inputXML = '$xaml'"))
Get-Content .\scripts\main.ps1 | Out-File ./$scriptname -Append -Encoding ascii $script_content.Add($(Get-Content .\scripts\main.ps1))
if ($Debug){
Update-Progress "Writing debug files" 95
$appXamlContent | Out-File -FilePath ".\xaml\inputApp.xaml" -Encoding ascii
$tweaksXamlContent | Out-File -FilePath ".\xaml\inputTweaks.xaml" -Encoding ascii
$featuresXamlContent | Out-File -FilePath ".\xaml\inputFeatures.xaml" -Encoding ascii
}
else {
Update-Progress "Removing temporary files" 99
Remove-Item ".\xaml\inputApp.xaml" -ErrorAction SilentlyContinue
Remove-Item ".\xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue
Remove-Item ".\xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue
}
Set-Content -Path $scriptname -Value ($script_content -join "`r`n") -Encoding ascii
Write-Progress -Activity "Compiling" -Completed
if ($run){
try {
Start-Process -FilePath "pwsh" -ArgumentList ".\$scriptname"
}
catch {
Start-Process -FilePath "powershell" -ArgumentList ".\$scriptname"
}
}

View File

@ -13,14 +13,9 @@
``` ```
Get-Service -Name "XboxGipSvc" | Set-Service -StartupType Automatic Get-Service -Name "XboxGipSvc" | Set-Service -StartupType Automatic
``` ```
- Windows Insider Builds not installing: Telemetry needs to be enabled
```
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection" -Name "AllowTelemetry" -Type DWord -Value 0
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" -Name "AllowTelemetry" -Type DWord -Value 0
```
- Winget requires interaction on first run: Manually type 'y' and 'enter' into the PowerShell console to continue - Winget requires interaction on first run: Manually type 'y' and 'enter' into the PowerShell console to continue
- (Windows 11) Quick Settings no longer works: Launch the Script and click 'Enable Action Center' - (Windows 11) Quick Settings no longer works: Launch the Script and click 'Enable Action Center'
- Explorer no longer launches: Go to Control Panel, File Explorer Options, Change the 'Open File Explorer to' option to 'This PC'.
- Script doesn't run/PowerShell crashes: - Script doesn't run/PowerShell crashes:
1. Press Windows Key+X and select 'PowerShell (Admin)' (Windows 10) or 'Windows Terminal (Admin)' (Windows 11) 1. Press Windows Key+X and select 'PowerShell (Admin)' (Windows 10) or 'Windows Terminal (Admin)' (Windows 11)
2. Run: 2. Run:

View File

@ -1,5 +1,7 @@
# Chris Titus Tech's Windows Utility # Chris Titus Tech's Windows Utility
[![Version](https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=7a39fb)](https://github.com/ChrisTitusTech/winutil/releases/latest)
This utility is a compilation of Windows tasks I perform on each Windows system I use. It is meant to streamline *installs*, debloat with *tweaks*, troubleshoot with *config*, and fix Windows *updates*. I am extremely picky about any contributions to keep this project clean and efficient. This utility is a compilation of Windows tasks I perform on each Windows system I use. It is meant to streamline *installs*, debloat with *tweaks*, troubleshoot with *config*, and fix Windows *updates*. I am extremely picky about any contributions to keep this project clean and efficient.
![screen-install](screen-install.png) ![screen-install](screen-install.png)
@ -10,7 +12,7 @@ Winutil must be run in Admin mode because it performs system-wide tweaks. To ach
1. **Right-Click Method:** 1. **Right-Click Method:**
- Right-click on the start menu. - Right-click on the start menu.
- Choose "PowerShell As Admin" (for Windows 10) or "Windows Terminal As Admin" (for Windows 11). - Choose "Windows PowerShell (Admin)" (for Windows 10) or "Terminal (Admin)" (for Windows 11).
2. **Search and Launch Method:** 2. **Search and Launch Method:**
- Press the Windows key. - Press the Windows key.
@ -22,25 +24,19 @@ Winutil must be run in Admin mode because it performs system-wide tweaks. To ach
#### Simple way #### Simple way
```ps1
irm "https://christitus.com/win" | iex
``` ```
irm https://christitus.com/win | iex Courtesy of the issue: [#144](/../../issues/144)
```
Courtesy of the issue raised at: [#144](/../../issues/144)
or by executing: If this site is not reachable from your country, please try running it directly from GitHub.
``` ```ps1
iwr -useb https://christitus.com/win | iex irm "https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1" | iex
```
if for some reason this site is not reachable from your country please try running it directly from github
```
irm https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/winutil.ps1 | iex
``` ```
#### Automation #### Automation
Some features are avaliable through automation. This allows you to save your config file pass it to Winutil walk away and come back to a finished system. Here is how you can set it up currently with Winutil >24.01.15 Some features are available through automation. This allows you to save your config file pass it to Winutil walk away and come back to a finished system. Here is how you can set it up currently with Winutil >24.01.15
1. On the Install Tab, click "Get Installed", this will get all installed apps **supported by Winutil** on the system 1. On the Install Tab, click "Get Installed", this will get all installed apps **supported by Winutil** on the system
![GetInstalled](/wiki/Get-Installed.png) ![GetInstalled](/wiki/Get-Installed.png)
@ -128,7 +124,9 @@ If you encounter any challenges or problems with the script, I kindly request th
## Contribute Code ## Contribute Code
To contribute new code, please ensure that it is submitted to the **TEST BRANCH**. Please note that merges will not be performed directly on the MAIN branch. Pull Requests are now handled directly on the MAIN branch. This was done since we can now select specific releases to launch via releases in GitHub.
If doing a code change and you can submit a PR to main branch, but I am very selective about these. Do not use a code formatter, massive amounts of line changes, and make multiple feature changes. EACH FEATURE CHANGE SHOULD BE IT'S OWN Pull Request!
When creating pull requests, it is essential to thoroughly document all changes made. This includes documenting any additions made to the tweaks section and ensuring that corresponding undo measures are in place to remove the newly added tweaks if necessary. Failure to adhere to this format may result in denial of the pull request. Additionally, comprehensive documentation is required for all code changes. Any code lacking sufficient documentation may also be denied. When creating pull requests, it is essential to thoroughly document all changes made. This includes documenting any additions made to the tweaks section and ensuring that corresponding undo measures are in place to remove the newly added tweaks if necessary. Failure to adhere to this format may result in denial of the pull request. Additionally, comprehensive documentation is required for all code changes. Any code lacking sufficient documentation may also be denied.

File diff suppressed because it is too large Load Diff

View File

@ -1,244 +0,0 @@
############################################################################
# This file was created with O&O ShutUp10++ V1.9.1436
# and can be imported onto another computer.
#
# Download the application at https://www.oo-software.com/shutup10
# You can then import the file from within the program.
#
# Alternatively you can import it automatically over a command line.
# Simply use the following parameter:
# OOSU10.exe <path to file>
#
# Selecting the Option /quiet ends the app right after the import and the
# user does not get any feedback about the import.
#
# We are always happy to answer any questions you may have!
# © 2015-2023 O&O Software GmbH, Berlin. All rights reserved.
# https://www.oo-software.com/
############################################################################
P001 -
P002 -
P003 -
P004 -
P005 -
P006 -
P008 -
P026 -
P027 -
P028 -
P064 -
P065 -
P066 -
P067 -
P070 -
P069 -
P009 -
P010 -
P015 -
P068 -
P016 -
A001 -
A002 -
A003 -
A004 -
A006 -
A005 -
P007 -
P036 -
P025 -
P033 -
P023 -
P056 -
P057 -
P012 -
P034 -
P013 -
P035 -
P062 -
P063 -
P081 -
P047 -
P019 -
P048 -
P049 -
P020 -
P037 -
P011 -
P038 -
P050 -
P051 -
P018 -
P039 -
P021 -
P040 -
P022 -
P041 -
P014 -
P042 -
P052 -
P053 -
P054 -
P055 -
P029 -
P043 -
P030 -
P044 -
P031 -
P045 -
P032 -
P046 -
P058 -
P059 -
P060 -
P061 -
P071 -
P072 -
P073 -
P074 -
P075 -
P076 -
P077 -
P078 -
P079 -
P080 -
P024 -
S001 -
S002 -
S003 -
S008 -
E101 -
E201 -
E115 -
E215 -
E118 -
E218 -
E107 -
E207 -
E111 -
E211 -
E112 -
E212 -
E109 -
E209 -
E121 -
E221 -
E103 -
E203 -
E123 -
E223 -
E124 -
E224 -
E128 -
E228 -
E119 -
E219 -
E120 -
E220 -
E122 -
E222 -
E125 -
E225 -
E126 -
E226 -
E106 -
E206 -
E127 -
E227 -
E001 -
E002 -
E003 -
E008 -
E007 -
E010 -
E011 +
E012 +
E009 -
E004 -
E005 -
E013 -
E014 -
E006 -
F002 -
F014 -
F015 -
F016 -
F001 -
F003 -
F004 -
F005 -
F007 -
F008 -
F009 -
F006 -
F010 -
F011 -
F012 -
F013 -
Y001 -
Y002 -
Y003 -
Y004 -
Y005 -
Y006 -
Y007 -
C012 -
C002 -
C013 -
C007 -
C008 -
C009 -
C010 -
C011 -
C014 -
C015 -
C101 -
C201 -
C102 -
L001 -
L003 -
L004 -
L005 -
U001 -
U004 -
U005 -
U006 -
U007 -
W001 -
W011 -
W004 -
W005 -
W010 -
W009 -
P017 -
W006 -
W008 -
M006 -
M011 -
M010 -
O003 -
O001 -
S012 -
S013 -
S014 -
K001 -
K002 -
K005 -
M025 -
M003 -
M015 -
M016 -
M017 -
M018 -
M019 -
M020 -
M021 -
M022 -
M001 -
M004 -
M005 -
M024 -
M012 -
M013 -
M014 -
N001 -

View File

@ -1,244 +0,0 @@
############################################################################
# This file was created with O&O ShutUp10++ V1.9.1436
# and can be imported onto another computer.
#
# Download the application at https://www.oo-software.com/shutup10
# You can then import the file from within the program.
#
# Alternatively you can import it automatically over a command line.
# Simply use the following parameter:
# OOSU10.exe <path to file>
#
# Selecting the Option /quiet ends the app right after the import and the
# user does not get any feedback about the import.
#
# We are always happy to answer any questions you may have!
# © 2015-2023 O&O Software GmbH, Berlin. All rights reserved.
# https://www.oo-software.com/
############################################################################
P001 +
P002 +
P003 +
P004 +
P005 +
P006 +
P008 +
P026 +
P027 +
P028 +
P064 +
P065 +
P066 +
P067 +
P070 +
P069 +
P009 -
P010 -
P015 -
P068 -
P016 -
A001 +
A002 +
A003 +
A004 +
A006 +
A005 +
P007 +
P036 +
P025 +
P033 +
P023 +
P056 -
P057 -
P012 -
P034 -
P013 -
P035 -
P062 -
P063 -
P081 -
P047 -
P019 -
P048 -
P049 -
P020 -
P037 -
P011 -
P038 -
P050 -
P051 -
P018 -
P039 -
P021 -
P040 -
P022 -
P041 -
P014 -
P042 -
P052 -
P053 -
P054 -
P055 -
P029 -
P043 -
P030 -
P044 -
P031 -
P045 -
P032 -
P046 -
P058 -
P059 -
P060 -
P061 -
P071 -
P072 -
P073 -
P074 -
P075 -
P076 -
P077 -
P078 -
P079 -
P080 -
P024 -
S001 +
S002 +
S003 +
S008 -
E101 +
E201 +
E115 +
E215 +
E118 +
E218 +
E107 +
E207 +
E111 +
E211 +
E112 +
E212 +
E109 +
E209 +
E121 +
E221 +
E103 +
E203 +
E123 +
E223 +
E124 +
E224 +
E128 +
E228 +
E119 -
E219 -
E120 -
E220 -
E122 -
E222 -
E125 -
E225 -
E126 -
E226 -
E106 -
E206 -
E127 -
E227 -
E001 +
E002 +
E003 +
E008 +
E007 +
E010 +
E011 +
E012 +
E009 -
E004 -
E005 -
E013 -
E014 -
E006 -
F002 +
F014 +
F015 +
F016 +
F001 +
F003 +
F004 +
F005 +
F007 +
F008 +
F009 +
F006 -
F010 -
F011 -
F012 -
F013 -
Y001 +
Y002 +
Y003 +
Y004 +
Y005 +
Y006 +
Y007 +
C012 +
C002 +
C013 +
C007 +
C008 +
C009 +
C010 +
C011 +
C014 +
C015 +
C101 +
C201 +
C102 +
L001 +
L003 +
L004 -
L005 -
U001 +
U004 +
U005 +
U006 +
U007 +
W001 +
W011 +
W004 -
W005 -
W010 -
W009 -
P017 -
W006 -
W008 -
M006 +
M011 -
M010 -
O003 -
O001 -
S012 -
S013 -
S014 -
K001 +
K002 +
K005 +
M025 +
M003 -
M015 -
M016 -
M017 -
M018 -
M019 -
M020 -
M021 -
M022 +
M001 +
M004 +
M005 +
M024 +
M012 -
M013 -
M014 -
N001 -

View File

@ -1,31 +1,24 @@
{ {
"desktop": [ "Standard": [
"WPFTweaksAH", "WPFTweaksAH",
"WPFTweaksConsumerFeatures",
"WPFTweaksDVR", "WPFTweaksDVR",
"WPFTweaksHiber", "WPFTweaksHiber",
"WPFTweaksHome", "WPFTweaksHome",
"WPFTweaksLoc", "WPFTweaksLoc",
"WPFTweaksOO",
"WPFTweaksServices",
"WPFTweaksStorage",
"WPFTweaksTele",
"WPFTweaksWifi"
],
"laptop": [
"WPFTweaksAH",
"WPFTweaksDVR",
"WPFTweaksHome",
"WPFTweaksLoc",
"WPFTweaksOO",
"WPFTweaksServices", "WPFTweaksServices",
"WPFTweaksStorage", "WPFTweaksStorage",
"WPFTweaksTele", "WPFTweaksTele",
"WPFTweaksWifi", "WPFTweaksWifi",
"WPFMiscTweaksLapPower" "WPFTweaksDiskCleanup",
"WPFTweaksDeleteTempFiles",
"WPFTweaksEndTaskOnTaskbar",
"WPFTweaksRestorePoint",
"WPFTweaksTeredo"
], ],
"minimal": [ "Minimal": [
"WPFTweaksConsumerFeatures",
"WPFTweaksHome", "WPFTweaksHome",
"WPFTweaksOO",
"WPFTweaksServices", "WPFTweaksServices",
"WPFTweaksTele" "WPFTweaksTele"
] ]

View File

@ -23,6 +23,7 @@
"ButtonBackgroundMouseoverColor": "#C2C2C2", "ButtonBackgroundMouseoverColor": "#C2C2C2",
"ButtonBackgroundSelectedColor": "#F0F0F0", "ButtonBackgroundSelectedColor": "#F0F0F0",
"ButtonForegroundColor": "#000000", "ButtonForegroundColor": "#000000",
"ToggleButtonOnColor": "#2e77ff",
"ButtonBorderThickness": "1", "ButtonBorderThickness": "1",
"ButtonMargin": "1", "ButtonMargin": "1",
"ButtonCornerRadius": "2", "ButtonCornerRadius": "2",
@ -53,6 +54,7 @@
"ButtonBackgroundMouseoverColor": "#A55A64", "ButtonBackgroundMouseoverColor": "#A55A64",
"ButtonBackgroundSelectedColor": "#FF5733", "ButtonBackgroundSelectedColor": "#FF5733",
"ButtonForegroundColor": "#9CCC65", "ButtonForegroundColor": "#9CCC65",
"ToggleButtonOnColor": "#2e77ff",
"ButtonBorderThickness": "1", "ButtonBorderThickness": "1",
"ButtonMargin": "1", "ButtonMargin": "1",
"ButtonCornerRadius": "2", "ButtonCornerRadius": "2",
@ -83,6 +85,7 @@
"ButtonBackgroundMouseoverColor": "#FF5733", "ButtonBackgroundMouseoverColor": "#FF5733",
"ButtonBackgroundSelectedColor": "#FF5733", "ButtonBackgroundSelectedColor": "#FF5733",
"ButtonForegroundColor": "#9CCC65", "ButtonForegroundColor": "#9CCC65",
"ToggleButtonOnColor": "#2e77ff",
"ButtonBorderThickness": "1", "ButtonBorderThickness": "1",
"ButtonMargin": "1", "ButtonMargin": "1",
"ButtonCornerRadius": "2", "ButtonCornerRadius": "2",

File diff suppressed because it is too large Load Diff

View File

@ -30,58 +30,5 @@ function Get-LocalizedYesNo {
Write-Debug "According to takeown.exe local Yes is $charactersArray[0]" Write-Debug "According to takeown.exe local Yes is $charactersArray[0]"
# Return the array of characters # Return the array of characters
return $charactersArray return $charactersArray
}
function Get-LocalizedYesNoTakeown {
<#
.SYNOPSIS
This function runs takeown.exe and captures its output to extract yes no in a localized Windows
.DESCRIPTION
The function retrieves lines from the output of takeown.exe until there are at least 2 characters
captured in a specific format, such as "Yes=<first character>, No=<second character>".
.EXAMPLE
$yesNoArray = Get-LocalizedYesNo
Write-Host "Yes=$($yesNoArray[0]), No=$($yesNoArray[1])"
#>
# Run takeown.exe and capture its output
$takeownOutput = & takeown.exe /? | Out-String
# Parse the output and retrieve lines until there are at least 2 characters in the array
$found = $false
$charactersArray = @()
foreach ($line in $takeownOutput -split "`r`n")
{
# skip everything before /D flag help
if ($found)
{
# now that /D is found start looking for a single character in double quotes
# in help text there is another string in double quotes but it is not a single character
$regexPattern = '"([a-zA-Z])"'
$charactersArray = [regex]::Matches($line, $regexPattern) | ForEach-Object { $_.Groups[1].Value }
# if ($charactersArray.Count -gt 0) {
# Write-Output "Extracted symbols: $($matches -join ', ')"
# } else {
# Write-Output "No matches found."
# }
if ($charactersArray.Count -ge 2)
{
break
}
}
elseif ($line -match "/D ")
{
$found = $true
}
}
Write-Debug "According to takeown.exe local Yes is $charactersArray[0]"
# Return the array of characters
return $charactersArray
} }

View File

@ -61,66 +61,71 @@ function Get-TabXaml {
$paneltotal = $columncount $paneltotal = $columncount
} }
# add ColumnDefinitions to evenly draw colums # add ColumnDefinitions to evenly draw colums
$blockXml="<Grid.ColumnDefinitions>`n"+("<ColumnDefinition Width=""*""/>`n"*($paneltotal))+"</Grid.ColumnDefinitions>`n" $blockXml="<Grid.ColumnDefinitions>`r`n"+("<ColumnDefinition Width=""*""/>`r`n"*($paneltotal))+"</Grid.ColumnDefinitions>`r`n"
# Iterate through organizedData by panel, category, and application # Iterate through organizedData by panel, category, and application
$count = 0 $count = 0
foreach ($panel in ($organizedData.Keys | Sort-Object)) { foreach ($panel in ($organizedData.Keys | Sort-Object)) {
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n" $blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`r`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`r`n"
$panelcount++ $panelcount++
foreach ($category in ($organizedData[$panel].Keys | Sort-Object)) { foreach ($category in ($organizedData[$panel].Keys | Sort-Object)) {
$count++ $count++
if ($columncount -gt 0) { if ($columncount -gt 0) {
$panelcount2 = [Int](($count)/$maxcount-0.5) $panelcount2 = [Int](($count)/$maxcount-0.5)
if ($panelcount -eq $panelcount2 ) { if ($panelcount -eq $panelcount2 ) {
$blockXml +="`n</StackPanel>`n</Border>`n" $blockXml +="`r`n</StackPanel>`r`n</Border>`r`n"
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n" $blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`r`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`r`n"
$panelcount++ $panelcount++
} }
} }
$blockXml += "<Label Content=""$($category -replace '^.__', '')"" FontSize=""16""/>`n"
# Dot-source the Get-WPFObjectName function
. .\functions\private\Get-WPFObjectName
$categorycontent = $($category -replace '^.__', '')
$categoryname = Get-WPFObjectName -type "Label" -name $categorycontent
$blockXml += "<Label Name=""$categoryname"" Content=""$categorycontent"" FontSize=""16""/>`r`n"
$sortedApps = $organizedData[$panel][$category].Keys | Sort-Object $sortedApps = $organizedData[$panel][$category].Keys | Sort-Object
foreach ($appName in $sortedApps) { foreach ($appName in $sortedApps) {
$count++ $count++
if ($columncount -gt 0) { if ($columncount -gt 0) {
$panelcount2 = [Int](($count)/$maxcount-0.5) $panelcount2 = [Int](($count)/$maxcount-0.5)
if ($panelcount -eq $panelcount2 ) { if ($panelcount -eq $panelcount2 ) {
$blockXml +="`n</StackPanel>`n</Border>`n" $blockXml +="`r`n</StackPanel>`r`n</Border>`r`n"
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n" $blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`r`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`r`n"
$panelcount++ $panelcount++
} }
} }
$appInfo = $organizedData[$panel][$category][$appName] $appInfo = $organizedData[$panel][$category][$appName]
if ("Toggle" -eq $appInfo.Type) { if ("Toggle" -eq $appInfo.Type) {
$blockXml += "<StackPanel Orientation=`"Horizontal`" Margin=`"0,10,0,0`">`n" $blockXml += "<DockPanel LastChildFill=`"True`">`r`n<Label Content=`"$($appInfo.Content)`" ToolTip=`"$($appInfo.Description)`" HorizontalAlignment=`"Left`"/>`r`n"
$blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Style=`"{StaticResource ColorfulToggleSwitchStyle}`" Margin=`"2.5,0`"/>`n" $blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Style=`"{StaticResource ColorfulToggleSwitchStyle}`" Margin=`"2.5,0`" HorizontalAlignment=`"Right`"/>`r`n</DockPanel>`r`n"
$blockXml += "<Label Content=`"$($appInfo.Content)`" Style=`"{StaticResource labelfortweaks}`" ToolTip=`"$($appInfo.Description)`" />`n</StackPanel>`n"
} elseif ("Combobox" -eq $appInfo.Type) { } elseif ("Combobox" -eq $appInfo.Type) {
$blockXml += "<StackPanel Orientation=`"Horizontal`" Margin=`"0,5,0,0`">`n<Label Content=`"$($appInfo.Content)`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`"/>`n" $blockXml += "<StackPanel Orientation=`"Horizontal`" Margin=`"0,5,0,0`">`r`n<Label Content=`"$($appInfo.Content)`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`"/>`r`n"
$blockXml += "<ComboBox Name=`"$($appInfo.Name)`" Height=`"32`" Width=`"186`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`" Margin=`"5,5`">`n" $blockXml += "<ComboBox Name=`"$($appInfo.Name)`" Height=`"32`" Width=`"186`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`" Margin=`"5,5`">`r`n"
$addfirst="IsSelected=`"True`"" $addfirst="IsSelected=`"True`""
foreach ($comboitem in ($appInfo.ComboItems -split " ")) { foreach ($comboitem in ($appInfo.ComboItems -split " ")) {
$blockXml += "<ComboBoxItem $addfirst Content=`"$comboitem`"/>`n" $blockXml += "<ComboBoxItem $addfirst Content=`"$comboitem`"/>`r`n"
$addfirst="" $addfirst=""
} }
$blockXml += "</ComboBox>`n</StackPanel>" $blockXml += "</ComboBox>`r`n</StackPanel>"
# If it is a digit, type is button and button length is digits # If it is a digit, type is button and button length is digits
} elseif ($appInfo.Type -match "^[\d\.]+$") { } elseif ($appInfo.Type -match "^[\d\.]+$") {
$blockXml += "<Button Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" HorizontalAlignment = `"Left`" Width=`"$($appInfo.Type)`" Margin=`"5`" Padding=`"20,5`" />`n" $blockXml += "<Button Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" HorizontalAlignment = `"Left`" Width=`"$($appInfo.Type)`" Margin=`"5`" Padding=`"20,5`" />`r`n"
# else it is a checkbox # else it is a checkbox
} else { } else {
$checkedStatus = If ($null -eq $appInfo.Checked) {""} Else {"IsChecked=`"$($appInfo.Checked)`" "} $checkedStatus = If ($null -eq $appInfo.Checked) {""} Else {"IsChecked=`"$($appInfo.Checked)`" "}
if ($null -eq $appInfo.Link) if ($null -eq $appInfo.Link)
{ {
$blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" $($checkedStatus)Margin=`"5,0`" ToolTip=`"$($appInfo.Description)`"/>`n" $blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" $($checkedStatus)Margin=`"5,0`" ToolTip=`"$($appInfo.Description)`"/>`r`n"
} }
else else
{ {
$blockXml += "<StackPanel Orientation=""Horizontal"">`n<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)"" $($checkedStatus)ToolTip=""$($appInfo.Description)"" Margin=""0,0,2,0""/><TextBlock Name=""$($appInfo.Name)Link"" Style=""{StaticResource HoverTextBlockStyle}"" Text=""(?)"" ToolTip=""$($appInfo.Link)"" />`n</StackPanel>`n" $blockXml += "<StackPanel Orientation=""Horizontal"">`r`n<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)"" $($checkedStatus)ToolTip=""$($appInfo.Description)"" Margin=""0,0,2,0""/><TextBlock Name=""$($appInfo.Name)Link"" Style=""{StaticResource HoverTextBlockStyle}"" Text=""(?)"" ToolTip=""$($appInfo.Link)"" />`r`n</StackPanel>`r`n"
} }
} }
} }
} }
$blockXml +="`n</StackPanel>`n</Border>`n" $blockXml +="`r`n</StackPanel>`r`n</Border>`r`n"
} }
return ($blockXml) return ($blockXml)
} }

View File

@ -0,0 +1,27 @@
function Get-WPFObjectName {
<#
.SYNOPSIS
This is a helper function that generates an objectname with the prefix WPF that can be used as a Powershell Variable after compilation.
To achieve this, all characters that are not a-z, A-Z or 0-9 are simply removed from the name.
.PARAMETER type
The type of object for which the name should be generated. (e.g. Label, Button, CheckBox...)
.PARAMETER name
The name or description to be used for the object. (invalid characters are removed)
.OUTPUTS
A string that can be used as a object/variable name in powershell.
For example: WPFLabelMicrosoftTools
.EXAMPLE
Get-WPFObjectName -type Label -name "Microsoft Tools"
#>
param( [Parameter(Mandatory=$true)]
$type,
$name
)
$Output = $("WPF"+$type+$name) -replace '[^a-zA-Z0-9]', ''
return $Output
}

View File

@ -46,17 +46,16 @@ Function Get-WinUtilCheckBoxes {
$group = if ($CheckBox.Key.StartsWith("WPFInstall")) { "Install" } $group = if ($CheckBox.Key.StartsWith("WPFInstall")) { "Install" }
elseif ($CheckBox.Key.StartsWith("WPFTweaks")) { "WPFTweaks" } elseif ($CheckBox.Key.StartsWith("WPFTweaks")) { "WPFTweaks" }
elseif ($CheckBox.Key.StartsWith("WPFFeature")) { "WPFFeature" } elseif ($CheckBox.Key.StartsWith("WPFFeature")) { "WPFFeature" }
if ($group) { if ($group) {
if ($CheckBox.Value.IsChecked -eq $true) { if ($CheckBox.Value.IsChecked -eq $true) {
$feature = switch ($group) { $feature = switch ($group) {
"Install" { "Install" {
$wingetValue = $sync.configs.applications.$($CheckBox.Name).winget # Get the winget value
if (-not [string]::IsNullOrWhiteSpace($wingetValue) -and $wingetValue -ne "na") { [PsCustomObject]@{
$wingetValue -split ";" winget="$($sync.configs.applications.$($CheckBox.Name).winget)";
} else { choco="$($sync.configs.applications.$($CheckBox.Name).choco)";
$sync.configs.applications.$($CheckBox.Name).choco
} }
} }
default { default {
$CheckBox.Name $CheckBox.Name
@ -80,6 +79,5 @@ Function Get-WinUtilCheckBoxes {
} }
} }
} }
return $Output
return $Output
} }

View File

@ -98,6 +98,15 @@ Function Get-WinUtilToggleStatus {
return $false return $false
} }
} }
if($ToggleSwitch -eq "WPFToggleTaskbarSearch"){
$SearchButton = (Get-ItemProperty -path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search").SearchboxTaskbarMode
if($SearchButton -eq 0){
return $false
}
else{
return $true
}
}
if ($ToggleSwitch -eq "WPFToggleStickyKeys") { if ($ToggleSwitch -eq "WPFToggleStickyKeys") {
$StickyKeys = (Get-ItemProperty -path 'HKCU:\Control Panel\Accessibility\StickyKeys').Flags $StickyKeys = (Get-ItemProperty -path 'HKCU:\Control Panel\Accessibility\StickyKeys').Flags
if($StickyKeys -eq 58){ if($StickyKeys -eq 58){
@ -107,6 +116,15 @@ Function Get-WinUtilToggleStatus {
return $true return $true
} }
} }
if ($ToggleSwitch -eq "WPFToggleTaskView") {
$TaskView = (Get-ItemProperty -path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced').ShowTaskViewButton
if($TaskView -eq 0){
return $false
}
else{
return $true
}
}
if ($ToggleSwitch -eq "WPFToggleTaskbarWidgets") { if ($ToggleSwitch -eq "WPFToggleTaskbarWidgets") {
$TaskbarWidgets = (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced").TaskBarDa $TaskbarWidgets = (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced").TaskBarDa
if($TaskbarWidgets -eq 0) { if($TaskbarWidgets -eq 0) {

View File

@ -11,9 +11,7 @@ function Get-WinUtilVariables {
[Parameter()] [Parameter()]
[string[]]$Type [string[]]$Type
) )
$keys = ($sync.keys).where{ $_ -like "WPF*" }
$keys = $sync.keys | Where-Object { $_ -like "WPF*" }
if ($Type) { if ($Type) {
$output = $keys | ForEach-Object { $output = $keys | ForEach-Object {
Try { Try {

View File

@ -5,14 +5,17 @@ function Get-WinUtilWingetLatest {
.DESCRIPTION .DESCRIPTION
This function grabs the latest version of Winget and returns the download path to Install-WinUtilWinget for installation. This function grabs the latest version of Winget and returns the download path to Install-WinUtilWinget for installation.
#> #>
# Invoke-WebRequest is notoriously slow when the byte progress is displayed. The following lines disable the progress bar and reset them at the end of the function
$PreviousProgressPreference = $ProgressPreference
$ProgressPreference = "silentlyContinue"
Try{ Try{
# Grabs the latest release of Winget from the Github API for the install process. # Grabs the latest release of Winget from the Github API for the install process.
$response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop $response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop
$latestVersion = $response.tag_name #Stores version number of latest release. $latestVersion = $response.tag_name #Stores version number of latest release.
$licenseWingetUrl = $response.assets.browser_download_url[0] #Index value for License file. $licenseWingetUrl = $response.assets.browser_download_url | Where-Object {$_ -like "*License1.xml"} #Index value for License file.
Write-Host "Latest Version:`t$($latestVersion)`n" Write-Host "Latest Version:`t$($latestVersion)`n"
$assetUrl = $response.assets.browser_download_url[2] #Index value for download URL. Write-Host "Downloading..."
$assetUrl = $response.assets.browser_download_url | Where-Object {$_ -like "*Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"}
Invoke-WebRequest -Uri $licenseWingetUrl -OutFile $ENV:TEMP\License1.xml Invoke-WebRequest -Uri $licenseWingetUrl -OutFile $ENV:TEMP\License1.xml
# The only pain is that the msixbundle for winget-cli is 246MB. In some situations this can take a bit, with slower connections. # The only pain is that the msixbundle for winget-cli is 246MB. In some situations this can take a bit, with slower connections.
Invoke-WebRequest -Uri $assetUrl -OutFile $ENV:TEMP\Microsoft.DesktopAppInstaller.msixbundle Invoke-WebRequest -Uri $assetUrl -OutFile $ENV:TEMP\Microsoft.DesktopAppInstaller.msixbundle
@ -20,4 +23,5 @@ function Get-WinUtilWingetLatest {
Catch{ Catch{
throw [WingetFailedInstall]::new('Failed to get latest Winget release and license') throw [WingetFailedInstall]::new('Failed to get latest Winget release and license')
} }
$ProgressPreference = $PreviousProgressPreference
} }

View File

@ -0,0 +1,91 @@
function Install-WinUtilProgramChoco {
<#
.SYNOPSIS
Manages the provided programs using Chocolatey
.PARAMETER ProgramsToInstall
A list of programs to manage
.PARAMETER manage
The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
.NOTES
The triple quotes are required any time you need a " in a normal script block.
#>
param(
[Parameter(Mandatory, Position=0)]
[PsCustomObject]$ProgramsToInstall,
[Parameter(Position=1)]
[String]$manage = "Installing"
)
$x = 0
$count = $ProgramsToInstall.Count
# This check isn't really necessary, as there's a couple of checks before this Private Function gets called, but just to make sure ;)
if($count -le 0) {
throw "Private Function 'Install-WinUtilProgramChoco' expected Parameter 'ProgramsToInstall' to be of size 1 or greater, instead got $count,`nPlease double check your code and re-compile WinUtil."
}
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
Write-Host "==========================================="
Write-Host "-- Configuring Chocolatey pacakages ---"
Write-Host "==========================================="
Foreach ($Program in $ProgramsToInstall){
Write-Progress -Activity "$manage Applications" -Status "$manage $($Program.choco) $($x + 1) of $count" -PercentComplete $($x/$count*100)
if($manage -eq "Installing"){
write-host "Starting install of $($Program.choco) with Chocolatey."
try{
$tryUpgrade = $false
$installOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.install-command.output.txt"
New-Item -ItemType File -Path $installOutputFilePath
$chocoInstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "install $($Program.choco) -y" -Wait -PassThru -RedirectStandardOutput $installOutputFilePath).ExitCode
if(($chocoInstallStatus -eq 0) -AND (Test-Path -Path $installOutputFilePath)) {
$keywordsFound = Get-Content -Path $installOutputFilePath | Where-Object {$_ -match "reinstall" -OR $_ -match "already installed"}
if ($keywordsFound) {
$tryUpgrade = $true
}
}
# TODO: Implement the Upgrade part using 'choco upgrade' command, this will make choco consistent with WinGet, as WinGet tries to Upgrade when you use the install command.
if ($tryUpgrade) {
throw "Automatic Upgrade for Choco isn't implemented yet, a feature to make it consistent with WinGet, the install command using choco simply failed because $($Program.choco) is already installed."
}
if(($chocoInstallStatus -eq 0) -AND ($tryUpgrade -eq $false)){
Write-Host "$($Program.choco) installed successfully using Chocolatey."
continue
} else {
Write-Host "Failed to install $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $installOutputFilePath)."
}
} catch {
Write-Host "Failed to install $($Program.choco) due to an error: $_"
}
}
if($manage -eq "Uninstalling"){
write-host "Starting uninstall of $($Program.choco) with Chocolatey."
try{
$uninstallOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.uninstall-command.output.txt"
New-Item -ItemType File -Path $uninstallOutputFilePath
$chocoUninstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "uninstall $($Program.choco) -y" -Wait -PassThru).ExitCode
if($chocoUninstallStatus -eq 0){
Write-Host "$($Program.choco) uninstalled successfully using Chocolatey."
continue
} else {
Write-Host "Failed to uninstall $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $uninstallOutputFilePath)."
}
} catch {
Write-Host "Failed to uninstall $($Program.choco) due to an error: $_"
}
}
$x++
}
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
# Cleanup leftovers files
if(Test-Path -Path $installOutputFilePath){ Remove-Item -Path $installOutputFilePath }
if(Test-Path -Path $installOutputFilePath){ Remove-Item -Path $uninstallOutputFilePath }
return;
}

View File

@ -2,74 +2,102 @@ Function Install-WinUtilProgramWinget {
<# <#
.SYNOPSIS .SYNOPSIS
Manages the provided programs using Winget Manages the provided programs using Winget
.PARAMETER ProgramsToInstall .PARAMETER ProgramsToInstall
A list of programs to manage A list of programs to manage
.PARAMETER manage .PARAMETER manage
The action to perform on the programs, can be either 'Installing' or 'Uninstalling' The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
.NOTES .NOTES
The triple quotes are required any time you need a " in a normal script block. The triple quotes are required any time you need a " in a normal script block.
The winget Return codes are documented here: https://github.com/microsoft/winget-cli/blob/master/doc/windows/package-manager/winget/returnCodes.md
#> #>
param( param(
$ProgramsToInstall, [Parameter(Mandatory, Position=0)]
$manage = "Installing" [PsCustomObject]$ProgramsToInstall,
)
[Parameter(Position=1)]
[String]$manage = "Installing"
)
$x = 0 $x = 0
$count = $($ProgramsToInstall -split ",").Count $count = $ProgramsToInstall.Count
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0 Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
Write-Host "==========================================="
Foreach ($Program in $($ProgramsToInstall -split ",")){ Write-Host "-- Configuring winget packages ---"
Write-Host "==========================================="
Write-Progress -Activity "$manage Applications" -Status "$manage $Program $($x + 1) of $count" -PercentComplete $($x/$count*100) Foreach ($Program in $ProgramsToInstall){
$failedPackages = @()
Write-Progress -Activity "$manage Applications" -Status "$manage $($Program.winget) $($x + 1) of $count" -PercentComplete $($x/$count*100)
if($manage -eq "Installing"){ if($manage -eq "Installing"){
# Install package via ID, if it fails try again with different scope and then with an unelevated prompt. # Install package via ID, if it fails try again with different scope and then with an unelevated prompt.
# Since Install-WinGetPackage might not be directly available, we use winget install command as a workaround. # Since Install-WinGetPackage might not be directly available, we use winget install command as a workaround.
# Winget, not all installers honor any of the following: System-wide, User Installs, or Unelevated Prompt OR Silent Install Mode. # Winget, not all installers honor any of the following: System-wide, User Installs, or Unelevated Prompt OR Silent Install Mode.
# This is up to the individual package maintainers to enable these options. Aka. not as clean as Linux Package Managers. # This is up to the individual package maintainers to enable these options. Aka. not as clean as Linux Package Managers.
Write-Host "Starting install of $($Program.winget) with winget."
try { try {
$status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $Program --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru).ExitCode $status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru -NoNewWindow).ExitCode
if($status -ne 0){ if($status -eq 0){
Write-Host "Attempt with User scope" Write-Host "$($Program.winget) installed successfully."
$status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $Program --scope user --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru).ExitCode continue
if($status -ne 0){ }
Write-Host "Attempt with Unelevated prompt" if ($status -eq -1978335189){
$status = $(Start-Process -FilePath "powershell" -ArgumentList "-Command Start-Process winget -ArgumentList 'install --id $Program --silent --accept-source-agreements --accept-package-agreements' -Verb runAsUser" -Wait -PassThru).ExitCode Write-Host "$($Program.winget) No applicable update found"
if($status -ne 0){ continue
Write-Host "Failed to install $Program." }
} else { Write-Host "Attempt with User scope"
Write-Host "$Program installed successfully with Unelevated prompt." $status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --scope user --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru -NoNewWindow).ExitCode
} if($status -eq 0){
} else { Write-Host "$($Program.winget) installed successfully with User scope."
Write-Host "$Program installed successfully with User scope." continue
} }
if ($status -eq -1978335189){
Write-Host "$($Program.winget) No applicable update found"
continue
}
Write-Host "Attempt with User prompt"
$userChoice = [System.Windows.MessageBox]::Show("Do you want to attempt $($Program.winget) installation with specific user credentials? Select 'Yes' to proceed or 'No' to skip.", "User Credential Prompt", [System.Windows.MessageBoxButton]::YesNo)
if ($userChoice -eq 'Yes') {
$getcreds = Get-Credential
$process = Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --silent --accept-source-agreements --accept-package-agreements" -Credential $getcreds -PassThru -NoNewWindow
Wait-Process -Id $process.Id
$status = $process.ExitCode
} else { } else {
Write-Host "$Program installed successfully." Write-Host "Skipping installation with specific user credentials."
}
if($status -eq 0){
Write-Host "$($Program.winget) installed successfully with User prompt."
continue
}
if ($status -eq -1978335189){
Write-Host "$($Program.winget) No applicable update found"
continue
} }
} catch { } catch {
Write-Host "Failed to install $Program due to an error: $_" Write-Host "Failed to install $($Program.winget). With winget"
$failedPackages += $Program
} }
} }
if($manage -eq "Uninstalling"){ if($manage -eq "Uninstalling"){
# Uninstall package via ID using winget directly. # Uninstall package via ID using winget directly.
try { try {
$status = $(Start-Process -FilePath "winget" -ArgumentList "uninstall --id $Program --silent" -Wait -PassThru).ExitCode $status = $(Start-Process -FilePath "winget" -ArgumentList "uninstall --id $($Program.winget) --silent" -Wait -PassThru -NoNewWindow).ExitCode
if($status -ne 0){ if($status -ne 0){
Write-Host "Failed to uninstall $Program." Write-Host "Failed to uninstall $($Program.winget)."
} else { } else {
Write-Host "$Program uninstalled successfully." Write-Host "$($Program.winget) uninstalled successfully."
$failedPackages += $Program
} }
} catch { } catch {
Write-Host "Failed to uninstall $Program due to an error: $_" Write-Host "Failed to uninstall $($Program.winget) due to an error: $_"
$failedPackages += $Program
} }
} }
$X++ $X++
} }
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
return $failedPackages;
} }

View File

@ -53,6 +53,8 @@ function Install-WinUtilWinget {
Write-Host "Failure detected while installing via GitHub method. Continuing with Chocolatey method as fallback." -ForegroundColor Red Write-Host "Failure detected while installing via GitHub method. Continuing with Chocolatey method as fallback." -ForegroundColor Red
# In case install fails via GitHub method. # In case install fails via GitHub method.
Try { Try {
# Install Choco if not already present
Install-WinUtilChoco
Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "choco install winget-cli" Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "choco install winget-cli"
Write-Host "Winget Installed" -ForegroundColor Green Write-Host "Winget Installed" -ForegroundColor Green
Write-Output "Refreshing Environment Variables...`n" Write-Output "Refreshing Environment Variables...`n"

View File

@ -1,19 +1,3 @@
function Invoke-MicroWin-Helper {
<#
.SYNOPSIS
checking unit tests
.PARAMETER Name
no parameters
.EXAMPLE
placeholder
#>
}
function Test-CompatibleImage() { function Test-CompatibleImage() {
<# <#
@ -175,7 +159,13 @@ function Remove-ProvisionedPackages([switch] $keepSecurity = $false)
{ {
$status = "Removing Provisioned $($appx.PackageName)" $status = "Removing Provisioned $($appx.PackageName)"
Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100) Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100)
Remove-AppxProvisionedPackage -Path $scratchDir -PackageName $appx.PackageName -ErrorAction SilentlyContinue try {
Remove-AppxProvisionedPackage -Path $scratchDir -PackageName $appx.PackageName -ErrorAction SilentlyContinue
}
catch {
Write-Host "Application $($appx.PackageName) could not be removed"
continue
}
} }
Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed
} }

View File

@ -1,29 +1,21 @@
function Invoke-WinUtilGPU { function Invoke-WinUtilGPU {
$gpuInfo = Get-CimInstance Win32_VideoController $gpuInfo = Get-CimInstance Win32_VideoController
foreach ($gpu in $gpuInfo) { # GPUs to blacklist from using Demanding Theming
$gpuName = $gpu.Name $lowPowerGPUs = (
if ($gpuName -like "*NVIDIA*") { "*NVIDIA GeForce*M*",
return $true # NVIDIA GPU found "*NVIDIA GeForce*Laptop*",
} "*NVIDIA GeForce*GT*",
} "*AMD Radeon(TM)*",
"*UHD*"
)
foreach ($gpu in $gpuInfo) { foreach ($gpu in $gpuInfo) {
$gpuName = $gpu.Name foreach ($gpuPattern in $lowPowerGPUs){
if ($gpuName -like "*AMD Radeon RX*") { if ($gpu.Name -like $gpuPattern) {
return $true # AMD GPU Found return $false
} }
}
foreach ($gpu in $gpuInfo) {
$gpuName = $gpu.Name
if ($gpuName -like "*UHD*") {
return $false # Intel Intergrated GPU Found
}
}
foreach ($gpu in $gpuInfo) {
$gpuName = $gpu.Name
if ($gpuName -like "*AMD Radeon(TM)*") {
return $false # AMD Intergrated GPU Found
} }
} }
return $true
} }

View File

@ -15,7 +15,8 @@ function Invoke-WinUtilNumLock {
Write-Host "Disabling Numlock on startup" Write-Host "Disabling Numlock on startup"
$value = 0 $value = 0
} }
$Path = "HKCU:\Control Panel\Keyboard" New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS
$Path = "HKU:\.Default\Control Panel\Keyboard"
Set-ItemProperty -Path $Path -Name InitialKeyboardIndicators -Value $value Set-ItemProperty -Path $Path -Name InitialKeyboardIndicators -Value $value
} }
Catch [System.Security.SecurityException] { Catch [System.Security.SecurityException] {

View File

@ -0,0 +1,34 @@
function Invoke-WinUtilTaskView {
<#
.SYNOPSIS
Enable/Disable Task View
.PARAMETER Enabled
Indicates whether to enable or disable Task View
#>
Param($Enabled)
Try{
if ($Enabled -eq $false){
Write-Host "Enabling Task View"
$value = 1
}
else {
Write-Host "Disabling Task View"
$value = 0
}
$Path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
Set-ItemProperty -Path $Path -Name ShowTaskViewButton -Value $value
}
Catch [System.Security.SecurityException] {
Write-Warning "Unable to set $Path\$Name to $Value due to a Security Exception"
}
Catch [System.Management.Automation.ItemNotFoundException] {
Write-Warning $psitem.Exception.ErrorRecord
}
Catch{
Write-Warning "Unable to set $Name due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace
}
}

View File

@ -0,0 +1,34 @@
function Invoke-WinUtilTaskbarSearch {
<#
.SYNOPSIS
Enable/Disable Taskbar Widgets
.PARAMETER Enabled
Indicates whether to enable or disable Taskbar Widgets
#>
Param($Enabled)
Try{
if ($Enabled -eq $false){
Write-Host "Enabling Search Button"
$value = 1
}
else {
Write-Host "Disabling Search Button"
$value = 0
}
$Path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search\"
Set-ItemProperty -Path $Path -Name SearchboxTaskbarMode -Value $value
}
Catch [System.Security.SecurityException] {
Write-Warning "Unable to set $Path\$Name to $Value due to a Security Exception"
}
Catch [System.Management.Automation.ItemNotFoundException] {
Write-Warning $psitem.Exception.ErrorRecord
}
Catch{
Write-Warning "Unable to set $Name due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace
}
}

View File

@ -178,17 +178,67 @@ $cttLogoPath = @"
$winutilTextBlock.Foreground = $foregroundColor $winutilTextBlock.Foreground = $foregroundColor
$winutilTextBlock.Margin = New-Object Windows.Thickness(10, 5, 10, 5) # Add margins around the text block $winutilTextBlock.Margin = New-Object Windows.Thickness(10, 5, 10, 5) # Add margins around the text block
$stackPanel.Children.Add($winutilTextBlock) $stackPanel.Children.Add($winutilTextBlock)
# Add TextBlock for information with text wrapping and margins # Add TextBlock for information with text wrapping and margins
$messageTextBlock = New-Object Windows.Controls.TextBlock $messageTextBlock = New-Object Windows.Controls.TextBlock
$messageTextBlock.Text = $Message
$messageTextBlock.TextWrapping = [Windows.TextWrapping]::Wrap # Enable text wrapping $messageTextBlock.TextWrapping = [Windows.TextWrapping]::Wrap # Enable text wrapping
$messageTextBlock.HorizontalAlignment = [Windows.HorizontalAlignment]::Left $messageTextBlock.HorizontalAlignment = [Windows.HorizontalAlignment]::Left
$messageTextBlock.VerticalAlignment = [Windows.VerticalAlignment]::Top $messageTextBlock.VerticalAlignment = [Windows.VerticalAlignment]::Top
$messageTextBlock.Margin = New-Object Windows.Thickness(10) # Add margins around the text block $messageTextBlock.Margin = New-Object Windows.Thickness(10) # Add margins around the text block
# Define the Regex to find hyperlinks formatted as HTML <a> tags
$regex = [regex]::new('<a href="([^"]+)">([^<]+)</a>')
$lastPos = 0
# Iterate through each match and add regular text and hyperlinks
foreach ($match in $regex.Matches($Message)) {
# Add the text before the hyperlink, if any
$textBefore = $Message.Substring($lastPos, $match.Index - $lastPos)
if ($textBefore.Length -gt 0) {
$messageTextBlock.Inlines.Add((New-Object Windows.Documents.Run($textBefore)))
}
# Create and add the hyperlink
$hyperlink = New-Object Windows.Documents.Hyperlink
$hyperlink.NavigateUri = New-Object System.Uri($match.Groups[1].Value)
$hyperlink.Inlines.Add($match.Groups[2].Value)
$hyperlink.TextDecorations = [Windows.TextDecorations]::None # Remove underline
$hyperlink.Foreground = $foregroundColor
$hyperlink.Add_Click({
param($sender, $args)
Start-Process $sender.NavigateUri.AbsoluteUri
})
$hyperlink.Add_MouseEnter({
param($sender, $args)
$sender.Foreground = [Windows.Media.Brushes]::LightGray
})
$hyperlink.Add_MouseLeave({
param($sender, $args)
$sender.Foreground = $foregroundColor
})
$messageTextBlock.Inlines.Add($hyperlink)
# Update the last position
$lastPos = $match.Index + $match.Length
}
# Add any remaining text after the last hyperlink
if ($lastPos -lt $Message.Length) {
$textAfter = $Message.Substring($lastPos)
$messageTextBlock.Inlines.Add((New-Object Windows.Documents.Run($textAfter)))
}
# If no matches, add the entire message as a run
if ($regex.Matches($Message).Count -eq 0) {
$messageTextBlock.Inlines.Add((New-Object Windows.Documents.Run($Message)))
}
# Add the TextBlock to the Grid
$grid.Children.Add($messageTextBlock) $grid.Children.Add($messageTextBlock)
[Windows.Controls.Grid]::SetRow($messageTextBlock, 1) # Set the row to the second row (0-based index) [Windows.Controls.Grid]::SetRow($messageTextBlock, 1) # Set the row to the second row (0-based index)
# Add OK button # Add OK button
$okButton = New-Object Windows.Controls.Button $okButton = New-Object Windows.Controls.Button
$okButton.Content = "OK" $okButton.Content = "OK"

View File

@ -21,13 +21,12 @@ function Invoke-WPFButton {
"WPFinstall" {Invoke-WPFInstall} "WPFinstall" {Invoke-WPFInstall}
"WPFuninstall" {Invoke-WPFUnInstall} "WPFuninstall" {Invoke-WPFUnInstall}
"WPFInstallUpgrade" {Invoke-WPFInstallUpgrade} "WPFInstallUpgrade" {Invoke-WPFInstallUpgrade}
"WPFdesktop" {Invoke-WPFPresets "Desktop"} "WPFstandard" {Invoke-WPFPresets "Standard"}
"WPFlaptop" {Invoke-WPFPresets "laptop"} "WPFminimal" {Invoke-WPFPresets "Minimal"}
"WPFminimal" {Invoke-WPFPresets "minimal"}
"WPFclear" {Invoke-WPFPresets -preset $null -imported $true} "WPFclear" {Invoke-WPFPresets -preset $null -imported $true}
"WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"} "WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"}
"WPFtweaksbutton" {Invoke-WPFtweaksbutton} "WPFtweaksbutton" {Invoke-WPFtweaksbutton}
"WPFOOSUbutton" {Invoke-WPFOOSU -action "customize"} "WPFOOSUbutton" {Invoke-WPFOOSU}
"WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enabled"} "WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enabled"}
"WPFRemoveUltPerf" {Invoke-WPFUltimatePerformance -State "Disabled"} "WPFRemoveUltPerf" {Invoke-WPFUltimatePerformance -State "Disabled"}
"WPFundoall" {Invoke-WPFundoall} "WPFundoall" {Invoke-WPFundoall}

View File

@ -7,7 +7,8 @@ function Invoke-WPFFixesWinget {
.DESCRIPTION .DESCRIPTION
BravoNorris for the fantastic idea of a button to reinstall winget BravoNorris for the fantastic idea of a button to reinstall winget
#> #>
# Install Choco if not already present
Install-WinUtilChoco
Start-Process -FilePath "choco" -ArgumentList "install winget -y --force" -NoNewWindow -Wait Start-Process -FilePath "choco" -ArgumentList "install winget -y --force" -NoNewWindow -Wait
} }

View File

@ -12,7 +12,7 @@ function Invoke-WPFGetIso {
return return
} }
$sync.BusyMessage.Visibility="Visible" $sync.BusyMessage.Visibility="Visible"
$sync.BusyText.Text="N Busy" $sync.BusyText.Text="N Busy"
@ -23,10 +23,6 @@ function Invoke-WPFGetIso {
Write-Host "\/ \/|_| \___||_| \___/ \/ \/ |_||_| |_| " Write-Host "\/ \/|_| \___||_| \___/ \/ \/ |_||_| |_| "
$oscdimgPath = Join-Path $env:TEMP 'oscdimg.exe' $oscdimgPath = Join-Path $env:TEMP 'oscdimg.exe'
if( ! (Test-Path $oscdimgPath -PathType Leaf) ) {
$oscdimgPath = Join-Path '.\releases\' 'oscdimg.exe'
}
$oscdImgFound = [bool] (Get-Command -ErrorAction Ignore -Type Application oscdimg.exe) -or (Test-Path $oscdimgPath -PathType Leaf) $oscdImgFound = [bool] (Get-Command -ErrorAction Ignore -Type Application oscdimg.exe) -or (Test-Path $oscdimgPath -PathType Leaf)
Write-Host "oscdimg.exe on system: $oscdImgFound" Write-Host "oscdimg.exe on system: $oscdImgFound"
@ -41,6 +37,8 @@ function Invoke-WPFGetIso {
# you consent to downloading it, no need to show extra dialogs # you consent to downloading it, no need to show extra dialogs
[System.Windows.MessageBox]::Show("oscdimge.exe is not found on the system, winutil will now attempt do download and install it using choco. This might take a long time.") [System.Windows.MessageBox]::Show("oscdimge.exe is not found on the system, winutil will now attempt do download and install it using choco. This might take a long time.")
# the step below needs choco to download oscdimg # the step below needs choco to download oscdimg
# Install Choco if not already present
Install-WinUtilChoco
$chocoFound = [bool] (Get-Command -ErrorAction Ignore -Type Application choco) $chocoFound = [bool] (Get-Command -ErrorAction Ignore -Type Application choco)
Write-Host "choco on system: $chocoFound" Write-Host "choco on system: $chocoFound"
if (!$chocoFound) if (!$chocoFound)

View File

@ -12,23 +12,43 @@ function Invoke-WPFInstall {
return return
} }
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"] $PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
Write-Host $PackagesToInstall
if ($wingetinstall.Count -eq 0) { if ($PackagesToInstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install or upgrade" $WarningMsg = "Please select the program(s) to install or upgrade"
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return return
} }
Invoke-WPFRunspace -ArgumentList $WingetInstall -DebugPreference $DebugPreference -ScriptBlock { Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
param($WingetInstall, $DebugPreference) param($PackagesToInstall, $DebugPreference)
$packagesWinget, $packagesChoco = {
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
foreach ($package in $PackagesToInstall) {
if ($package.winget -eq "na") {
$packagesChoco.add($package)
Write-Host "Queueing $($package.choco) for Chocolatey install"
} else {
$packagesWinget.add($package)
Write-Host "Queueing $($package.winget) for Winget install"
}
}
return $packagesWinget, $packagesChoco
}.Invoke($PackagesToInstall)
try{ try{
$sync.ProcessRunning = $true $sync.ProcessRunning = $true
$errorPackages = @()
Install-WinUtilWinget if($packagesWinget.Count -gt 0){
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall Install-WinUtilWinget
$errorPackages += Install-WinUtilProgramWinget -ProgramsToInstall $packagesWinget
$errorPackages| ForEach-Object {if($_.choco -ne "na") {$packagesChoco += $_}}
}
if($packagesChoco.Count -gt 0){
Install-WinUtilChoco
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco
}
Write-Host "===========================================" Write-Host "==========================================="
Write-Host "-- Installs have finished ---" Write-Host "-- Installs have finished ---"
Write-Host "===========================================" Write-Host "==========================================="

View File

@ -53,6 +53,7 @@ public class PowerManagement {
$keepEdge = $sync.WPFMicrowinKeepEdge.IsChecked $keepEdge = $sync.WPFMicrowinKeepEdge.IsChecked
$copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked $copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked $injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
$mountDir = $sync.MicrowinMountDir.Text $mountDir = $sync.MicrowinMountDir.Text
$scratchDir = $sync.MicrowinScratchDir.Text $scratchDir = $sync.MicrowinScratchDir.Text
@ -111,13 +112,54 @@ public class PowerManagement {
return return
} }
if ($importDrivers)
{
Write-Host "Exporting drivers from active installation..."
if (Test-Path "$env:TEMP\DRV_EXPORT")
{
Remove-Item "$env:TEMP\DRV_EXPORT" -Recurse -Force
}
if (($injectDrivers -and (Test-Path $sync.MicrowinDriverLocation.Text)))
{
Write-Host "Using specified driver source..."
dism /english /online /export-driver /destination="$($sync.MicrowinDriverLocation.Text)" | Out-Host
if ($?)
{
# Don't add exported drivers yet, that is run later
Write-Host "Drivers have been exported successfully."
}
else
{
Write-Host "Failed to export drivers."
}
}
else
{
New-Item -Path "$env:TEMP\DRV_EXPORT" -ItemType Directory -Force
dism /english /online /export-driver /destination="$env:TEMP\DRV_EXPORT" | Out-Host
if ($?)
{
Write-Host "Adding exported drivers..."
dism /english /image="$scratchDir" /add-driver /driver="$env:TEMP\DRV_EXPORT" /recurse | Out-Host
}
else
{
Write-Host "Failed to export drivers. Continuing without importing them..."
}
if (Test-Path "$env:TEMP\DRV_EXPORT")
{
Remove-Item "$env:TEMP\DRV_EXPORT" -Recurse -Force
}
}
}
if ($injectDrivers) if ($injectDrivers)
{ {
$driverPath = $sync.MicrowinDriverLocation.Text $driverPath = $sync.MicrowinDriverLocation.Text
if (Test-Path $driverPath) if (Test-Path $driverPath)
{ {
Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) " Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) "
Add-WindowsDriver -Path "$scratchDir" -Recurse -Driver "$driverPath" dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host
} }
else else
{ {
@ -202,26 +244,27 @@ public class PowerManagement {
$desktopDir = "$($scratchDir)\Windows\Users\Default\Desktop" $desktopDir = "$($scratchDir)\Windows\Users\Default\Desktop"
New-Item -ItemType Directory -Force -Path "$desktopDir" New-Item -ItemType Directory -Force -Path "$desktopDir"
dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default" dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default"
$command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'"
$shortcutPath = "$desktopDir\WinUtil.lnk"
$shell = New-Object -ComObject WScript.Shell
$shortcut = $shell.CreateShortcut($shortcutPath)
if (Test-Path -Path "$env:TEMP\cttlogo.png") # $command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'"
{ # $shortcutPath = "$desktopDir\WinUtil.lnk"
$pngPath = "$env:TEMP\cttlogo.png" # $shell = New-Object -ComObject WScript.Shell
$icoPath = "$env:TEMP\cttlogo.ico" # $shortcut = $shell.CreateShortcut($shortcutPath)
ConvertTo-Icon -bitmapPath $pngPath -iconPath $icoPath
Write-Host "ICO file created at: $icoPath"
Copy-Item "$env:TEMP\cttlogo.png" "$($scratchDir)\Windows\cttlogo.png" -force
Copy-Item "$env:TEMP\cttlogo.ico" "$($scratchDir)\Windows\cttlogo.ico" -force
$shortcut.IconLocation = "c:\Windows\cttlogo.ico"
}
$shortcut.TargetPath = "powershell.exe" # if (Test-Path -Path "$env:TEMP\cttlogo.png")
$shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`"" # {
$shortcut.Save() # $pngPath = "$env:TEMP\cttlogo.png"
Write-Host "Shortcut to winutil created at: $shortcutPath" # $icoPath = "$env:TEMP\cttlogo.ico"
# ConvertTo-Icon -bitmapPath $pngPath -iconPath $icoPath
# Write-Host "ICO file created at: $icoPath"
# Copy-Item "$env:TEMP\cttlogo.png" "$($scratchDir)\Windows\cttlogo.png" -force
# Copy-Item "$env:TEMP\cttlogo.ico" "$($scratchDir)\Windows\cttlogo.ico" -force
# $shortcut.IconLocation = "c:\Windows\cttlogo.ico"
# }
# $shortcut.TargetPath = "powershell.exe"
# $shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`""
# $shortcut.Save()
# Write-Host "Shortcut to winutil created at: $shortcutPath"
# *************************** Automation black *************************** # *************************** Automation black ***************************
Write-Host "Copy checkinstall.cmd into the ISO" Write-Host "Copy checkinstall.cmd into the ISO"
@ -335,7 +378,7 @@ public class PowerManagement {
if (Test-Path $driverPath) if (Test-Path $driverPath)
{ {
Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) " Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) "
Add-WindowsDriver -Path "$scratchDir" -Driver "$driverPath" -Recurse dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host
} }
else else
{ {

View File

@ -1,43 +0,0 @@
function Invoke-WPFOOSU {
<#
.SYNOPSIS
Downloads and runs OO Shutup 10 with or without config files
.PARAMETER action
Specifies how OOSU should be started
customize: Opens the OOSU GUI
recommended: Loads and applies the recommended OOSU policies silently
undo: Resets all policies to factory silently
#>
param (
[ValidateSet("customize", "recommended", "undo")]
[string]$action
)
$OOSU_filepath = "$ENV:temp\OOSU10.exe"
$Initial_ProgressPreference = $ProgressPreference
$ProgressPreference = "SilentlyContinue" # Disables the Progress Bar to drasticly speed up Invoke-WebRequest
Invoke-WebRequest -Uri "https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe" -OutFile $OOSU_filepath
switch ($action)
{
"customize"{
Write-Host "Starting OO Shutup 10 ..."
Start-Process $OOSU_filepath
}
"recommended"{
$oosu_config = "$ENV:temp\ooshutup10_recommended.cfg"
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/config/ooshutup10_recommended.cfg" -OutFile $oosu_config
Write-Host "Applying recommended OO Shutup 10 Policies"
Start-Process $OOSU_filepath -ArgumentList "$oosu_config /quiet" -Wait
}
"undo"{
$oosu_config = "$ENV:temp\ooshutup10_factory.cfg"
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/config/ooshutup10_factory.cfg" -OutFile $oosu_config
Write-Host "Resetting all OO Shutup 10 Policies"
Start-Process $OOSU_filepath -ArgumentList "$oosu_config /quiet" -Wait
}
}
$ProgressPreference = $Initial_ProgressPreference
}

View File

@ -0,0 +1,20 @@
function Invoke-WPFOOSU {
<#
.SYNOPSIS
Downloads and runs OO Shutup 10
#>
try {
$OOSU_filepath = "$ENV:temp\OOSU10.exe"
$Initial_ProgressPreference = $ProgressPreference
$ProgressPreference = "SilentlyContinue" # Disables the Progress Bar to drasticly speed up Invoke-WebRequest
Invoke-WebRequest -Uri "https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe" -OutFile $OOSU_filepath
Write-Host "Starting OO Shutup 10 ..."
Start-Process $OOSU_filepath
}
catch {
Write-Host "Error Downloading and Running OO Shutup 10" -ForegroundColor Red
}
finally {
$ProgressPreference = $Initial_ProgressPreference
}
}

View File

@ -5,6 +5,8 @@ function Invoke-WPFPanelAutologin {
Enables autologin using Sysinternals Autologon.exe Enables autologin using Sysinternals Autologon.exe
#> #>
curl.exe -ss "https://live.sysinternals.com/Autologon.exe" -o $env:temp\autologin.exe # Official Microsoft recommendation https://learn.microsoft.com/en-us/sysinternals/downloads/autologon
cmd /c $env:temp\autologin.exe /accepteula # Official Microsoft recommendation: https://learn.microsoft.com/en-us/sysinternals/downloads/autologon
Invoke-WebRequest -Uri "https://live.sysinternals.com/Autologon.exe" -OutFile "$env:temp\autologin.exe"
cmd /c "$env:temp\autologin.exe" /accepteula
} }

View File

@ -28,5 +28,7 @@ function Invoke-WPFToggle {
"WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $(Get-WinUtilToggleStatus WPFToggleMouseAcceleration)} "WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $(Get-WinUtilToggleStatus WPFToggleMouseAcceleration)}
"WPFToggleStickyKeys" {Invoke-WinUtilStickyKeys $(Get-WinUtilToggleStatus WPFToggleStickyKeys)} "WPFToggleStickyKeys" {Invoke-WinUtilStickyKeys $(Get-WinUtilToggleStatus WPFToggleStickyKeys)}
"WPFToggleTaskbarWidgets" {Invoke-WinUtilTaskbarWidgets $(Get-WinUtilToggleStatus WPFToggleTaskbarWidgets)} "WPFToggleTaskbarWidgets" {Invoke-WinUtilTaskbarWidgets $(Get-WinUtilToggleStatus WPFToggleTaskbarWidgets)}
"WPFToggleTaskbarSearch" {Invoke-WinUtilTaskbarSearch $(Get-WinUtilToggleStatus WPFToggleTaskbarSearch)}
"WPFToggleTaskView" {Invoke-WinUtilTaskView $(Get-WinUtilToggleStatus WPFToggleTaskView)}
} }
} }

View File

@ -0,0 +1,46 @@
function Invoke-WPFTweakPS7{
<#
.SYNOPSIS
This will edit the config file of the Windows Terminal Replacing the Powershell 5 to Powershell 7 and install Powershell 7 if necessary
.PARAMETER action
PS7: Configures Powershell 7 to be the default Terminal
PS5: Configures Powershell 5 to be the default Terminal
#>
param (
[ValidateSet("PS7", "PS5")]
[string]$action
)
switch ($action) {
"PS7"{
if (Test-Path -Path "$env:ProgramFiles\PowerShell\7") {
Write-Host "Powershell 7 is already installed."
} else {
Write-Host "Installing Powershell 7..."
Install-WinUtilProgramWinget -ProgramsToInstall @(@{"winget"="Microsoft.PowerShell"})
}
$targetTerminalName = "PowerShell"
}
"PS5"{
$targetTerminalName = "Windows PowerShell"
}
}
$settingsPath = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
if (Test-Path -Path $settingsPath) {
Write-Host "Settings file found."
$settingsContent = Get-Content -Path $settingsPath | ConvertFrom-Json
$ps7Profile = $settingsContent.profiles.list | Where-Object { $_.name -eq $targetTerminalName }
if ($ps7Profile) {
$settingsContent.defaultProfile = $ps7Profile.guid
$updatedSettings = $settingsContent | ConvertTo-Json -Depth 100
Set-Content -Path $settingsPath -Value $updatedSettings
Write-Host "Default profile updated to $targetTerminalName using the name attribute."
} else {
Write-Host "No PowerShell 7 profile found in Windows Terminal settings using the name attribute."
}
} else {
Write-Host "Settings file not found at $settingsPath"
}
}

View File

@ -12,31 +12,49 @@ function Invoke-WPFUnInstall {
return return
} }
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"] $PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
if ($wingetinstall.Count -eq 0) { if ($PackagesToInstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install" $WarningMsg = "Please select the program(s) to uninstall"
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return return
} }
$ButtonType = [System.Windows.MessageBoxButton]::YesNo $ButtonType = [System.Windows.MessageBoxButton]::YesNo
$MessageboxTitle = "Are you sure?" $MessageboxTitle = "Are you sure?"
$Messageboxbody = ("This will uninstall the following applications: `n $WingetInstall") $Messageboxbody = ("This will uninstall the following applications: `n $($PackagesToInstall | Format-Table | Out-String)")
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
$confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) $confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
if($confirm -eq "No"){return} if($confirm -eq "No"){return}
Invoke-WPFRunspace -ArgumentList $WingetInstall -DebugPreference $DebugPreference -ScriptBlock { Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
param($WingetInstall, $DebugPreference) param($PackagesToInstall, $DebugPreference)
$packagesWinget, $packagesChoco = {
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
foreach ($package in $PackagesToInstall) {
if ($package.winget -eq "na") {
$packagesChoco.add($package)
Write-Host "Queueing $($package.choco) for Chocolatey Uninstall"
} else {
$packagesWinget.add($package)
Write-Host "Queueing $($package.winget) for Winget Uninstall"
}
}
return $packagesWinget, $packagesChoco
}.Invoke($PackagesToInstall)
try{ try{
$sync.ProcessRunning = $true $sync.ProcessRunning = $true
# Install all selected programs in new window # Install all selected programs in new window
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall -Manage "Uninstalling" if($packagesWinget.Count -gt 0){
Install-WinUtilProgramWinget -ProgramsToInstall $packagesWinget -Manage "Uninstalling"
}
if($packagesChoco.Count -gt 0){
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco -Manage "Uninstalling"
}
$ButtonType = [System.Windows.MessageBoxButton]::OK $ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Uninstalls are Finished " $MessageboxTitle = "Uninstalls are Finished "
@ -51,7 +69,7 @@ function Invoke-WPFUnInstall {
} }
Catch { Catch {
Write-Host "===========================================" Write-Host "==========================================="
Write-Host "-- Winget failed to install ---" Write-Host "Error: $_"
Write-Host "===========================================" Write-Host "==========================================="
} }
$sync.ProcessRunning = $False $sync.ProcessRunning = $False

View File

View File

@ -10,7 +10,7 @@ $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionSta
$InitialSessionState.Variables.Add($hashVars) $InitialSessionState.Variables.Add($hashVars)
# Get every private function and add them to the session state # Get every private function and add them to the session state
$functions = Get-ChildItem function:\ | Where-Object {$_.name -like "*winutil*" -or $_.name -like "*WPF*"} $functions = (Get-ChildItem function:\).where{$_.name -like "*winutil*" -or $_.name -like "*WPF*"}
foreach ($function in $functions){ foreach ($function in $functions){
$functionDefinition = Get-Content function:\$($function.name) $functionDefinition = Get-Content function:\$($function.name)
$functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition $functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition
@ -133,9 +133,17 @@ $sync.keys | ForEach-Object {
# Load computer information in the background # Load computer information in the background
Invoke-WPFRunspace -ScriptBlock { Invoke-WPFRunspace -ScriptBlock {
$sync.ConfigLoaded = $False try{
$sync.ComputerInfo = Get-ComputerInfo $oldProgressPreference = $ProgressPreference
$sync.ConfigLoaded = $True $ProgressPreference = "SilentlyContinue"
$sync.ConfigLoaded = $False
$sync.ComputerInfo = Get-ComputerInfo
$sync.ConfigLoaded = $True
}
finally{
$ProgressPreference = "Continue"
}
} | Out-Null } | Out-Null
#=========================================================================== #===========================================================================
@ -145,9 +153,6 @@ Invoke-WPFRunspace -ScriptBlock {
# Print the logo # Print the logo
Invoke-WPFFormVariables Invoke-WPFFormVariables
# Check if Chocolatey is installed
Install-WinUtilChoco
# Set the titlebar # Set the titlebar
$sync["Form"].title = $sync["Form"].title + " " + $sync.version $sync["Form"].title = $sync["Form"].title + " " + $sync.version
# Set the commands that will run when the form is closed # Set the commands that will run when the form is closed
@ -271,26 +276,48 @@ Add-Type @"
"@ "@
} }
foreach ($proc in (Get-Process | Where-Object { $_.MainWindowTitle -and $_.MainWindowTitle -like "*titus*" })) { foreach ($proc in (Get-Process).where{ $_.MainWindowTitle -and $_.MainWindowTitle -like "*titus*" }) {
if ($proc.Id -ne [System.IntPtr]::Zero) { # Check if the process's MainWindowHandle is valid
if ($proc.MainWindowHandle -ne [System.IntPtr]::Zero) {
Write-Debug "MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle) $($proc.MainWindowHandle)" Write-Debug "MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle) $($proc.MainWindowHandle)"
$windowHandle = $proc.MainWindowHandle $windowHandle = $proc.MainWindowHandle
} else {
Write-Warning "Process found, but no MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle)"
} }
} }
# need to experiemnt more
# setting icon for the windows is still not working # Using a TaskbarItem Overlay until someone figures out how to replace the icon correctly
# $pngUrl = "https://christitus.com/images/logo-full.png"
# $pngPath = "$env:TEMP\cttlogo.png" # URL of the image
# $iconPath = "$env:TEMP\cttlogo.ico" $imageUrl = "https://christitus.com/images/logo-full.png"
# # Download the PNG file
# Invoke-WebRequest -Uri $pngUrl -OutFile $pngPath # Download the image
# if (Test-Path -Path $pngPath) { $imagePath = "$env:TEMP\logo-full.png"
# ConvertTo-Icon -bitmapPath $pngPath -iconPath $iconPath Invoke-WebRequest -Uri $imageUrl -OutFile $imagePath
# }
# $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($iconPath) # Read the image file as a byte array
# Write-Host $icon.Handle $imageBytes = [System.IO.File]::ReadAllBytes($imagePath)
# [Window]::SendMessage($windowHandle, 0x80, [IntPtr]::Zero, $icon.Handle)
# Convert the byte array to a Base64 string
$base64String = [System.Convert]::ToBase64String($imageBytes)
# Create a streaming image by streaming the base64 string to a bitmap streamsource
$bitmap = New-Object System.Windows.Media.Imaging.BitmapImage
$bitmap.BeginInit()
$bitmap.StreamSource = [System.IO.MemoryStream][System.Convert]::FromBase64String($base64String)
$bitmap.EndInit()
$bitmap.Freeze()
# Ensure TaskbarItemInfo is created if not already
if (-not $sync["Form"].TaskbarItemInfo) {
$sync["Form"].TaskbarItemInfo = New-Object System.Windows.Shell.TaskbarItemInfo
}
# Set the overlay icon for the taskbar
$sync["Form"].TaskbarItemInfo.Overlay = $bitmap
$rect = New-Object RECT $rect = New-Object RECT
[Window]::GetWindowRect($windowHandle, [ref]$rect) [Window]::GetWindowRect($windowHandle, [ref]$rect)
@ -363,6 +390,16 @@ Add-Type @"
}) })
# Load Checkboxes and Labels outside of the Filter fuction only once on startup for performance reasons
$filter = Get-WinUtilVariables -Type CheckBox
$CheckBoxes = ($sync.GetEnumerator()).where{ $psitem.Key -in $filter }
$filter = Get-WinUtilVariables -Type Label
$labels = @{}
($sync.GetEnumerator()).where{$PSItem.Key -in $filter} | ForEach-Object {$labels[$_.Key] = $_.Value}
$allCategories = $checkBoxes.Name | ForEach-Object {$sync.configs.applications.$_} | Select-Object -Unique -ExpandProperty category
$sync["CheckboxFilter"].Add_TextChanged({ $sync["CheckboxFilter"].Add_TextChanged({
if ($sync.CheckboxFilter.Text -ne "") { if ($sync.CheckboxFilter.Text -ne "") {
@ -372,8 +409,7 @@ $sync["CheckboxFilter"].Add_TextChanged({
$sync.CheckboxFilterClear.Visibility = "Collapsed" $sync.CheckboxFilterClear.Visibility = "Collapsed"
} }
$filter = Get-WinUtilVariables -Type CheckBox $activeApplications = @()
$CheckBoxes = $sync.GetEnumerator() | Where-Object { $psitem.Key -in $filter }
foreach ($CheckBox in $CheckBoxes) { foreach ($CheckBox in $CheckBoxes) {
# Check if the checkbox is null or if it doesn't have content # Check if the checkbox is null or if it doesn't have content
@ -390,6 +426,7 @@ $sync["CheckboxFilter"].Add_TextChanged({
if ($CheckBox.Value.Content.ToLower().Contains($textToSearch)) { if ($CheckBox.Value.Content.ToLower().Contains($textToSearch)) {
$CheckBox.Value.Visibility = "Visible" $CheckBox.Value.Visibility = "Visible"
$activeApplications += $sync.configs.applications.$checkboxName
# Set the corresponding text block visibility # Set the corresponding text block visibility
if ($textBlock -ne $null) { if ($textBlock -ne $null) {
$textBlock.Visibility = "Visible" $textBlock.Visibility = "Visible"
@ -403,7 +440,21 @@ $sync["CheckboxFilter"].Add_TextChanged({
} }
} }
} }
$activeCategories = $activeApplications | Select-Object -ExpandProperty category -Unique
foreach ($category in $activeCategories){
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
$label.Visibility = "Visible"
}
if ($activeCategories){
$inactiveCategories = Compare-Object -ReferenceObject $allCategories -DifferenceObject $activeCategories -PassThru
}
else{
$inactiveCategories = $allCategories
}
foreach ($category in $inactiveCategories){
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
$label.Visibility = "Collapsed"}
}) })
# Define event handler for button click # Define event handler for button click
@ -439,17 +490,14 @@ $sync["AboutMenuItem"].Add_Click({
# Handle Export menu item click # Handle Export menu item click
Write-Debug "About clicked" Write-Debug "About clicked"
$sync["SettingsPopup"].IsOpen = $false $sync["SettingsPopup"].IsOpen = $false
# Example usage
$authorInfo = @" $authorInfo = @"
Author : @christitustech Author : <a href="https://github.com/ChrisTitusTech">@christitustech</a>
Runspace : @DeveloperDurp Runspace : <a href="https://github.com/DeveloperDurp">@DeveloperDurp</a>
GUI : @KonTy MicroWin : <a href="https://github.com/KonTy">@KonTy</a>
MicroWin : @KonTy GitHub : <a href="https://github.com/ChrisTitusTech/winutil">ChrisTitusTech/winutil</a>
GitHub : https://github.com/ChrisTitusTech/winutil Version : <a href="https://github.com/ChrisTitusTech/winutil/releases/tag/$($sync.version)">$($sync.version)</a>
Version : $($sync.version)
"@ "@
Show-CustomDialog -Message $authorInfo -Width 400 Show-CustomDialog -Message $authorInfo -Width 400
}) })
$sync["Form"].ShowDialog() | out-null $sync["Form"].ShowDialog() | out-null
Stop-Transcript Stop-Transcript

View File

@ -44,17 +44,8 @@ $sync.version = "#{replaceme}"
$sync.configs = @{} $sync.configs = @{}
$sync.ProcessRunning = $false $sync.ProcessRunning = $false
$currentPid = [System.Security.Principal.WindowsIdentity]::GetCurrent() # If script isn't running as admin, show error message and quit
$principal = new-object System.Security.Principal.WindowsPrincipal($currentPid) If (([Security.Principal.WindowsIdentity]::GetCurrent()).Owner.Value -ne "S-1-5-32-544")
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
if ($principal.IsInRole($adminRole))
{
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
clear-host
}
else
{ {
Write-Host "===========================================" -Foregroundcolor Red Write-Host "===========================================" -Foregroundcolor Red
Write-Host "-- Scripts must be run as Administrator ---" -Foregroundcolor Red Write-Host "-- Scripts must be run as Administrator ---" -Foregroundcolor Red
@ -62,3 +53,7 @@ else
Write-Host "===========================================" -Foregroundcolor Red Write-Host "===========================================" -Foregroundcolor Red
break break
} }
# Set PowerShell window title
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
clear-host

View File

@ -1,5 +1,5 @@
# Battery drains too fast. # Battery drains too fast.
When your battery on teh laptop drains too fast please perform these steps and report the results back to Winutil community. When your battery on the laptop drains too fast, please perform these steps and report the results back to the Winutil community.
1. **Check Battery Health:** 1. **Check Battery Health:**
- Open a Command Prompt as an administrator. - Open a Command Prompt as an administrator.

View File

@ -21,7 +21,7 @@ This error code typically indicates an issue related to Windows Management Instr
- Press `Win + R` to open the Run dialog. - Press `Win + R` to open the Run dialog.
- Type `services.msc` and press Enter. - Type `services.msc` and press Enter.
- Locate "Windows Management Instrumentation" in the list. - Locate "Windows Management Instrumentation" in the list.
- Make sure its status is set to "Running" and the startup type is set to "Automatic." - Make sure to set its status to "Running" and the startup type to "Automatic."
5. **Check for Security Software Interference:** 5. **Check for Security Software Interference:**
Security software can sometimes interfere with WMI operations. Temporarily disable your antivirus or security software and check if the issue persists. Security software can sometimes interfere with WMI operations. Temporarily disable your antivirus or security software and check if the issue persists.
@ -31,9 +31,9 @@ This error code typically indicates an issue related to Windows Management Instr
- Press `Win + X` and select "Event Viewer." - Press `Win + X` and select "Event Viewer."
- Navigate to "Windows Logs" -> "Application" or "System." - Navigate to "Windows Logs" -> "Application" or "System."
- Look for entries with the source related to WMI or the application you're using to mount the ISO. - Look for entries with the source related to WMI or the application use to mount the ISO.
7. **ISO File Integrity:** 7. **ISO File Integrity:**
Ensure that the ISO file you are trying to mount is not corrupted. Try mounting a different ISO file to see if the issue persists. Ensure that the ISO file you are trying to mount is uncorrupted. Try mounting a different ISO file to see if the issue persists.
If the problem persists after trying these steps, additional troubleshooting may be required. Consider seeking assistance from Microsoft support or community forums for more specific guidance based on your system configuration and the software you are using to mount the ISO. If the problem persists after trying these steps, additional troubleshooting is required. Consider seeking assistance from Microsoft support or community forums for more specific guidance based on your system configuration and the software you use to mount the ISO.

40
windev.ps1 Normal file
View File

@ -0,0 +1,40 @@
<#
.SYNOPSIS
This Script is used as a target for the https://christitus.com/windev alias.
It queries the latest winget release (no matter if Pre-Release, Draft or Full Release) and invokes It
.DESCRIPTION
This Script provides a simple way to always start the bleeding edge release even if it's not yet a full release.
This function should be run with administrative privileges.
Because this way of recursively invoking scripts via Invoke-Expression it might very well happen that AV Programs flag this because it's a common way of mulitstage exploits to run
.EXAMPLE
irm https://christitus.com/windev | iex
OR
Run in Admin Powershell > ./windev.ps1
#>
# Function to fetch the latest release tag from the GitHub API
function Get-LatestRelease {
try {
$releases = Invoke-RestMethod -Uri 'https://api.github.com/repos/ChrisTitusTech/winutil/releases'
$latestRelease = $releases | Select-Object -First 1
return $latestRelease.tag_name
} catch {
Write-Host "Error fetching release data: $_" -ForegroundColor Red
return $null
}
}
# Function to redirect to the latest pre-release version
function RedirectToLatestPreRelease {
$latestRelease = Get-LatestRelease
if ($latestRelease) {
$url = "https://raw.githubusercontent.com/ChrisTitusTech/winutil/$latestRelease/winutil.ps1"
Invoke-RestMethod $url | Invoke-Expression
} else {
Write-Host 'Unable to determine latest pre-release version.' -ForegroundColor Red
}
}
# Call the redirect function
RedirectToLatestPreRelease

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,43 +0,0 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Row="1" Grid.Column="0">
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
<Label Content="Features" FontSize="16"/>
<CheckBox Name="WPFFeaturesdotnet" Content="All .Net Framework (2,3,4)" Margin="5,0" ToolTip=".NET and .NET Framework is a developer platform made up of tools, programming languages, and libraries for building many different types of applications."/>
<CheckBox Name="WPFFeatureshyperv" Content="HyperV Virtualization" Margin="5,0" ToolTip="Hyper-V is a hardware virtualization product developed by Microsoft that allows users to create and manage virtual machines."/>
<CheckBox Name="WPFFeatureslegacymedia" Content="Legacy Media (WMP, DirectPlay)" Margin="5,0" ToolTip="Enables legacy programs from previous versions of windows"/>
<CheckBox Name="WPFFeaturenfs" Content="NFS - Network File System" Margin="5,0" ToolTip="Network File System (NFS) is a mechanism for storing files on a network."/>
<CheckBox Name="WPFFeatureEnableSearchSuggestions" Content="Enable Search Box Web Suggestions in Registry(explorer restart)" Margin="5,0" ToolTip="Enables web suggestions when searching using Windows Search."/>
<CheckBox Name="WPFFeatureDisableSearchSuggestions" Content="Disable Search Box Web Suggestions in Registry(explorer restart)" Margin="5,0" ToolTip="Disables web suggestions when searching using Windows Search."/>
<CheckBox Name="WPFFeatureRegBackup" Content="Enable Daily Registry Backup Task 12.30am" Margin="5,0" ToolTip="Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803."/>
<CheckBox Name="WPFFeatureEnableLegacyRecovery" Content="Enable Legacy F8 Boot Recovery" Margin="5,0" ToolTip="Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes."/>
<CheckBox Name="WPFFeatureDisableLegacyRecovery" Content="Disable Legacy F8 Boot Recovery" Margin="5,0" ToolTip="Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes."/>
<CheckBox Name="WPFFeaturewsl" Content="Windows Subsystem for Linux" Margin="5,0" ToolTip="Windows Subsystem for Linux is an optional feature of Windows that allows Linux programs to run natively on Windows without the need for a separate virtual machine or dual booting."/>
<CheckBox Name="WPFFeaturesandbox" Content="Windows Sandbox" Margin="5,0" ToolTip="Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation."/>
<Button Name="WPFFeatureInstall" Content="Install Features" HorizontalAlignment = "Left" Width="150" Margin="5" Padding="20,5" />
<Label Content="Fixes" FontSize="16"/>
<Button Name="WPFPanelAutologin" Content="Set Up Autologin" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
<Button Name="WPFFixesUpdate" Content="Reset Windows Update" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
<Button Name="WPFFixesNetwork" Content="Reset Network" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
<Button Name="WPFPanelDISM" Content="System Corruption Scan" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
<Button Name="WPFFixesWinget" Content="WinGet Reinstall" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
<Button Name="WPFRunAdobeCCCleanerTool" Content="Remove Adobe Creative Cloud" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
</StackPanel>
</Border>
<Border Grid.Row="1" Grid.Column="1">
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
<Label Content="Legacy Windows Panels" FontSize="16"/>
<Button Name="WPFPanelcontrol" Content="Control Panel" HorizontalAlignment = "Left" Width="200" Margin="5" Padding="20,5" />
<Button Name="WPFPanelnetwork" Content="Network Connections" HorizontalAlignment = "Left" Width="200" Margin="5" Padding="20,5" />
<Button Name="WPFPanelpower" Content="Power Panel" HorizontalAlignment = "Left" Width="200" Margin="5" Padding="20,5" />
<Button Name="WPFPanelregion" Content="Region" HorizontalAlignment = "Left" Width="200" Margin="5" Padding="20,5" />
<Button Name="WPFPanelsound" Content="Sound Settings" HorizontalAlignment = "Left" Width="200" Margin="5" Padding="20,5" />
<Button Name="WPFPanelsystem" Content="System Properties" HorizontalAlignment = "Left" Width="200" Margin="5" Padding="20,5" />
<Button Name="WPFPaneluser" Content="User Accounts" HorizontalAlignment = "Left" Width="200" Margin="5" Padding="20,5" />
</StackPanel>
</Border>

View File

@ -1,101 +0,0 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Row="1" Grid.Column="0">
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
<Label Content="Essential Tweaks" FontSize="16"/>
<CheckBox Name="WPFTweaksRestorePoint" Content="Create Restore Point" IsChecked="True" Margin="5,0" ToolTip="Creates a restore point at runtime in case a revert is needed from WinUtil modifications"/>
<CheckBox Name="WPFTweaksEndTaskOnTaskbar" Content="Enable End Task With Right Click" Margin="5,0" ToolTip="Enables option to end task when right clicking a program in the taskbar"/>
<CheckBox Name="WPFTweaksOO" Content="Run OO Shutup" Margin="5,0" ToolTip="Runs OO Shutup and applies the recommended Tweaks. https://www.oo-software.com/en/shutup10"/>
<CheckBox Name="WPFTweaksTele" Content="Disable Telemetry" Margin="5,0" ToolTip="Disables Microsoft Telemetry. Note: This will lock many Edge Browser settings. Microsoft spies heavily on you when using the Edge browser."/>
<CheckBox Name="WPFTweaksWifi" Content="Disable Wifi-Sense" Margin="5,0" ToolTip="Wifi Sense is a spying service that phones home all nearby scanned wifi networks and your current geo location."/>
<CheckBox Name="WPFTweaksAH" Content="Disable Activity History" Margin="5,0" ToolTip="This erases recent docs, clipboard, and run history."/>
<CheckBox Name="WPFTweaksDeleteTempFiles" Content="Delete Temporary Files" Margin="5,0" ToolTip="Erases TEMP Folders"/>
<CheckBox Name="WPFTweaksDiskCleanup" Content="Run Disk Cleanup" Margin="5,0" ToolTip="Runs Disk Cleanup on Drive C: and removes old Windows Updates."/>
<CheckBox Name="WPFTweaksLoc" Content="Disable Location Tracking" Margin="5,0" ToolTip="Disables Location Tracking...DUH!"/>
<CheckBox Name="WPFTweaksAdobe" Content="Disable Adobe Services" Margin="5,0" ToolTip="Disables many of the services that come with Adobe and run in the background."/>
<CheckBox Name="WPFTweaksHome" Content="Disable Homegroup" Margin="5,0" ToolTip="Disables HomeGroup - HomeGroup is a password-protected home networking service that lets you share your stuff with other PCs that are currently running and connected to your network."/>
<CheckBox Name="WPFTweaksStorage" Content="Disable Storage Sense" Margin="5,0" ToolTip="Storage Sense deletes temp files automatically."/>
<CheckBox Name="WPFTweaksHiber" Content="Disable Hibernation" Margin="5,0" ToolTip="Hibernation is really meant for laptops as it saves what&#39;s in memory before turning the pc off. It really should never be used, but some people are lazy and rely on it. Don&#39;t be like Bob. Bob likes hibernation."/>
<CheckBox Name="WPFTweaksDVR" Content="Disable GameDVR" Margin="5,0" ToolTip="GameDVR is a Windows App that is a dependency for some Store Games. I&#39;ve never met someone that likes it, but it&#39;s there for the XBOX crowd."/>
<CheckBox Name="WPFTweaksTeredo" Content="Disable Teredo" Margin="5,0" ToolTip="Teredo network tunneling is a ipv6 feature that can cause additional latency."/>
<CheckBox Name="WPFTweaksServices" Content="Set Services to Manual" Margin="5,0" ToolTip="Turns a bunch of system services to manual that don&#39;t need to be running all the time. This is pretty harmless as if the service is needed, it will simply start on demand."/>
<Label Content="Advanced Tweaks - CAUTION" FontSize="16"/>
<CheckBox Name="WPFTweaksDisplay" Content="Set Display for Performance" Margin="5,0" ToolTip="Sets the system preferences to performance. You can do this manually with sysdm.cpl as well."/>
<CheckBox Name="WPFTweaksUTC" Content="Set Time to UTC (Dual Boot)" Margin="5,0" ToolTip="Essential for computers that are dual booting. Fixes the time sync with Linux Systems."/>
<CheckBox Name="WPFTweaksDisableNotifications" Content="Disable Notification Tray/Calendar" Margin="5,0" ToolTip="Disables all Notifications INCLUDING Calendar"/>
<CheckBox Name="WPFTweaksDeBloat" Content="Remove ALL MS Store Apps - NOT RECOMMENDED" Margin="5,0" ToolTip="USE WITH CAUTION!!!!! This will remove ALL Microsoft store apps other than the essentials to make winget work. Games installed by MS Store ARE INCLUDED!"/>
<CheckBox Name="WPFTweaksRemoveCopilot" Content="Disables Microsoft Copilot" Margin="5,0" ToolTip="Disables MS Copilot AI built into Windows since 23H2."/>
<CheckBox Name="WPFTweaksRemoveEdge" Content="Remove Microsoft Edge - NOT RECOMMENDED" Margin="5,0" ToolTip="Removes MS Edge when it gets reinstalled by updates."/>
<CheckBox Name="WPFTweaksRemoveOnedrive" Content="Remove OneDrive" Margin="5,0" ToolTip="Copies OneDrive files to Default Home Folders and Uninstalls it."/>
<CheckBox Name="WPFTweaksRightClickMenu" Content="Set Classic Right-Click Menu " Margin="5,0" ToolTip="Great Windows 11 tweak to bring back good context menus when right clicking things in explorer."/>
<CheckBox Name="WPFTweaksEnableipsix" Content="Enable IPv6" Margin="5,0" ToolTip="Enables IPv6."/>
<CheckBox Name="WPFTweaksDisableipsix" Content="Disable IPv6" Margin="5,0" ToolTip="Disables IPv6."/>
<Button Name="WPFOOSUbutton" Content="Customize OO Shutup Tweaks" HorizontalAlignment = "Left" Width="220" Margin="5" Padding="20,5" />
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
<Label Content="DNS" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<ComboBox Name="WPFchangedns" Height="32" Width="186" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,5">
<ComboBoxItem IsSelected="True" Content="Default"/>
<ComboBoxItem Content="DHCP"/>
<ComboBoxItem Content="Google"/>
<ComboBoxItem Content="Cloudflare"/>
<ComboBoxItem Content="Cloudflare_Malware"/>
<ComboBoxItem Content="Cloudflare_Malware_Adult"/>
<ComboBoxItem Content="Level3"/>
<ComboBoxItem Content="Open_DNS"/>
<ComboBoxItem Content="Quad9"/>
</ComboBox>
</StackPanel><Button Name="WPFTweaksbutton" Content="Run Tweaks" HorizontalAlignment = "Left" Width="160" Margin="5" Padding="20,5" />
<Button Name="WPFUndoall" Content="Undo Selected Tweaks" HorizontalAlignment = "Left" Width="160" Margin="5" Padding="20,5" />
</StackPanel>
</Border>
<Border Grid.Row="1" Grid.Column="1">
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
<Label Content="Customize Preferences" FontSize="16"/>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Dark Theme" Style="{StaticResource labelfortweaks}" ToolTip="Enable/Disable Dark Mode." />
<CheckBox Name="WPFToggleDarkMode" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Bing Search in Start Menu" Style="{StaticResource labelfortweaks}" ToolTip="If enable then includes web search results from Bing in your Start Menu search." />
<CheckBox Name="WPFToggleBingSearch" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="NumLock on Startup" Style="{StaticResource labelfortweaks}" ToolTip="Toggle the Num Lock key state when your computer starts." />
<CheckBox Name="WPFToggleNumLock" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Verbose Logon Messages" Style="{StaticResource labelfortweaks}" ToolTip="Show detailed messages during the login process for troubleshooting and diagnostics." />
<CheckBox Name="WPFToggleVerboseLogon" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Show File Extensions" Style="{StaticResource labelfortweaks}" ToolTip="If enabled then File extensions (e.g., .txt, .jpg) are visible." />
<CheckBox Name="WPFToggleShowExt" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Snap Assist Flyout" Style="{StaticResource labelfortweaks}" ToolTip="If enabled then Snap preview is disabled when maximize button is hovered." />
<CheckBox Name="WPFToggleSnapFlyout" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Mouse Acceleration" Style="{StaticResource labelfortweaks}" ToolTip="If Enabled then Cursor movement is affected by the speed of your physical mouse movements." />
<CheckBox Name="WPFToggleMouseAcceleration" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Sticky Keys" Style="{StaticResource labelfortweaks}" ToolTip="If Enabled then Sticky Keys is activated - Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury." />
<CheckBox Name="WPFToggleStickyKeys" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
<Label Content="Taskbar Widgets" Style="{StaticResource labelfortweaks}" ToolTip="If Enabled then Widgets Icon in Taskbar will be shown." />
<CheckBox Name="WPFToggleTaskbarWidgets" Style="{StaticResource ColorfulToggleSwitchStyle}" Margin="2.5,0"/>
</StackPanel>
<Label Content="Performance Plans" FontSize="16"/>
<Button Name="WPFAddUltPerf" Content="Add and Activate Ultimate Performance Profile" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
<Button Name="WPFRemoveUltPerf" Content="Remove Ultimate Performance Profile" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
<Label Content="Shortcuts" FontSize="16"/>
<Button Name="WPFWinUtilShortcut" Content="Create WinUtil Shortcut" HorizontalAlignment = "Left" Width="300" Margin="5" Padding="20,5" />
</StackPanel>
</Border>

View File

@ -408,41 +408,71 @@
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}"> <ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid x:Name="toggleSwitch" Margin="10,0,0,0"> <Grid x:Name="toggleSwitch">
<Border x:Name="Border" CornerRadius="11"
Background="#FFFFFFFF" <Grid.ColumnDefinitions>
Width="50" Height="25"> <ColumnDefinition Width="Auto"/>
<Border.Effect> <ColumnDefinition Width="Auto"/>
<DropShadowEffect ShadowDepth="0.5" Direction="0" Opacity="0.3" /> </Grid.ColumnDefinitions>
</Border.Effect> <TextBlock Grid.Column="0" x:Name="txtToggle" VerticalAlignment="Center" FontWeight="DemiBold" Foreground="{MainForegroundColor}" FontSize="12">
<Ellipse x:Name="Ellipse" Fill="#FFFFFFFF" Stretch="Uniform" <TextBlock.Style>
Margin="2 2 2 1" <Style TargetType="TextBlock">
Stroke="Gray" StrokeThickness="0.2" <Setter Property="Text" Value="Off"/>
HorizontalAlignment="Left" Width="22"> <Setter Property="Margin" Value="4,0,4,0"/>
<Ellipse.Effect> <Style.Triggers>
<DropShadowEffect BlurRadius="10" ShadowDepth="1" Opacity="0.3" Direction="260" /> <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked}" Value="True">
</Ellipse.Effect> <Setter Property="Text" Value="On"/>
</Ellipse> </DataTrigger>
</Border> </Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<Border Grid.Column="1" x:Name="Border" CornerRadius="8"
BorderThickness="1"
Width="34" Height="17">
<Ellipse x:Name="Ellipse" Fill="{MainForegroundColor}" Stretch="Uniform"
Margin="2,2,2,1"
HorizontalAlignment="Left" Width="12">
</Ellipse>
</Border>
</Grid> </Grid>
<ControlTemplate.Triggers> <ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="BorderBrush" Value="{MainForegroundColor}" />
<Setter TargetName="Border" Property="Background" Value="{LinkHoverForegroundColor}"/>
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Panel.ZIndex" Value="1000"/>
</Trigger>
<Trigger Property="ToggleButton.IsChecked" Value="False"> <Trigger Property="ToggleButton.IsChecked" Value="False">
<Setter TargetName="Border" Property="Background" Value="#C2283B" /> <Setter TargetName="Border" Property="Background" Value="{MainBackgroundColor}" />
<Setter TargetName="Ellipse" Property="Margin" Value="2 2 2 1" /> <Setter TargetName="Border" Property="BorderBrush" Value="{MainForegroundColor}" />
<Setter TargetName="Ellipse" Property="Fill" Value="{MainForegroundColor}" />
</Trigger> </Trigger>
<Trigger Property="ToggleButton.IsChecked" Value="True"> <Trigger Property="ToggleButton.IsChecked" Value="True">
<Setter TargetName="Border" Property="Background" Value="{MainBackgroundColor}" />
<Setter TargetName="Border" Property="BorderBrush" Value="{MainForegroundColor}" />
<Setter TargetName="Ellipse" Property="Fill" Value="{MainForegroundColor}" />
<Trigger.EnterActions> <Trigger.EnterActions>
<BeginStoryboard> <BeginStoryboard>
<Storyboard> <Storyboard>
<ColorAnimation Storyboard.TargetName="Border" <ColorAnimation Storyboard.TargetName="Border"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="#34A543" Duration="0:0:0.1" /> To="{ToggleButtonOnColor}" Duration="0:0:0.1" />
<ColorAnimation Storyboard.TargetName="Border"
Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
To="{ToggleButtonOnColor}" Duration="0:0:0.1" />
<ColorAnimation Storyboard.TargetName="Ellipse"
Storyboard.TargetProperty="(Fill).(SolidColorBrush.Color)"
To="White" Duration="0:0:0.1" />
<ThicknessAnimation Storyboard.TargetName="Ellipse" <ThicknessAnimation Storyboard.TargetName="Ellipse"
Storyboard.TargetProperty="Margin" Storyboard.TargetProperty="Margin"
To="26 2 2 1" Duration="0:0:0.1" /> To="18,2,2,2" Duration="0:0:0.1" />
</Storyboard> </Storyboard>
</BeginStoryboard> </BeginStoryboard>
</Trigger.EnterActions> </Trigger.EnterActions>
@ -451,15 +481,15 @@
<Storyboard> <Storyboard>
<ColorAnimation Storyboard.TargetName="Border" <ColorAnimation Storyboard.TargetName="Border"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="#C2283B" Duration="0:0:0.1" /> To="{MainBackgroundColor}" Duration="0:0:0.1" />
<ThicknessAnimation Storyboard.TargetName="Ellipse" <ThicknessAnimation Storyboard.TargetName="Ellipse"
Storyboard.TargetProperty="Margin" Storyboard.TargetProperty="Margin"
To="2 2 2 1" Duration="0:0:0.1" /> To="2,2,2,1" Duration="0:0:0.1" />
</Storyboard> </Storyboard>
</BeginStoryboard> </BeginStoryboard>
</Trigger.ExitActions> </Trigger.ExitActions>
<Setter Property="Foreground" Value="{DynamicResource IdealForegroundColorBrush}" />
</Trigger> </Trigger>
</ControlTemplate.Triggers> </ControlTemplate.Triggers>
</ControlTemplate> </ControlTemplate>
@ -541,6 +571,18 @@
</Setter.Value> </Setter.Value>
</Setter> </Setter>
</Style> </Style>
<Style x:Key="ScrollVisibilityRectangle" TargetType="Rectangle">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=ComputedHorizontalScrollBarVisibility, ElementName=scrollViewer}" Value="Visible"/>
<Condition Binding="{Binding Path=ComputedVerticalScrollBarVisibility, ElementName=scrollViewer}" Value="Visible"/>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources> </Window.Resources>
<Grid Background="{MainBackgroundColor}" ShowGridLines="False" Name="WPFMainGrid" Width="Auto" Height="Auto" HorizontalAlignment="Stretch"> <Grid Background="{MainBackgroundColor}" ShowGridLines="False" Name="WPFMainGrid" Width="Auto" Height="Auto" HorizontalAlignment="Stretch">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -671,18 +713,20 @@
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3" Margin="5"> <StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3" Margin="5">
<Button Name="WPFinstall" Content=" Install/Upgrade Selected" Margin="2" /> <Button Name="WPFinstall" Content=" Install/Upgrade Selected" Margin="2" />
<Button Name="WPFInstallUpgrade" Content=" Upgrade All" Margin="2"/> <Button Name="WPFInstallUpgrade" Content=" Upgrade All" Margin="2"/>
<Button Name="WPFuninstall" Content=" Uninstall Selection" Margin="2"/> <Button Name="WPFuninstall" Content=" Uninstall Selected" Margin="2"/>
<Button Name="WPFGetInstalled" Content=" Get Installed" Margin="2"/> <Button Name="WPFGetInstalled" Content=" Get Installed" Margin="2"/>
<Button Name="WPFclearWinget" Content=" Clear Selection" Margin="2"/> <Button Name="WPFclearWinget" Content=" Clear Selection" Margin="2"/>
</StackPanel> </StackPanel>
<ScrollViewer Grid.Row="1" Grid.Column="0" Padding="-1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" <ScrollViewer x:Name="scrollViewer" Grid.Row="1" Grid.Column="0" Padding="-1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
{{InstallPanel_applications}} {{InstallPanel_applications}}
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
<Rectangle Grid.Row="1" Grid.Column="0" Width="18" Height="18" Fill="{MainBackgroundColor}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Style="{StaticResource ScrollVisibilityRectangle}"/>
</Grid> </Grid>
</TabItem> </TabItem>
<TabItem Header="Tweaks" Visibility="Collapsed" Name="WPFTab2"> <TabItem Header="Tweaks" Visibility="Collapsed" Name="WPFTab2">
@ -696,8 +740,7 @@
{{InstallPanel_tweaks}} {{InstallPanel_tweaks}}
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="10"> <StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="10">
<Label Content="Recommended Selections:" FontSize="14" VerticalAlignment="Center"/> <Label Content="Recommended Selections:" FontSize="14" VerticalAlignment="Center"/>
<Button Name="WPFdesktop" Content=" Desktop " Margin="1"/> <Button Name="WPFstandard" Content=" Standard " Margin="1"/>
<Button Name="WPFlaptop" Content=" Laptop " Margin="1"/>
<Button Name="WPFminimal" Content=" Minimal " Margin="1"/> <Button Name="WPFminimal" Content=" Minimal " Margin="1"/>
<Button Name="WPFclear" Content=" Clear " Margin="1"/> <Button Name="WPFclear" Content=" Clear " Margin="1"/>
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="1"/> <Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="1"/>
@ -773,20 +816,29 @@
</TextBlock> </TextBlock>
<CheckBox x:Name="WPFMicrowinISOScratchDir" Content="Use ISO directory for ScratchDir " IsChecked="False" Margin="1" <CheckBox x:Name="WPFMicrowinISOScratchDir" Content="Use ISO directory for ScratchDir " IsChecked="False" Margin="1"
ToolTip="Use ISO directory for ScratchDir " /> ToolTip="Use ISO directory for ScratchDir " />
<Grid>
<Button Name="MicrowinScratchDirBT" Margin="2" Padding="1"> <Grid.ColumnDefinitions>
<Button.Content> <ColumnDefinition Width="*" /> <!-- Takes the remaining space -->
<ColumnDefinition Width="30" /> <!-- Fixed width for Button -->
</Grid.ColumnDefinitions>
<TextBox Name="MicrowinScratchDirBox" Background="Transparent" BorderBrush="{MainForegroundColor}" <TextBox Name="MicrowinScratchDirBox" Background="Transparent" BorderBrush="{MainForegroundColor}"
Text="Scratch" Padding="0" Text="Scratch"
ToolTip="Alt Path For Scratch Directory" BorderThickness="1" Margin="2"
Margin="0,0,0,3" HorizontalAlignment="Left" IsReadOnly="False"
IsReadOnly="False" ToolTip="Alt Path For Scratch Directory"
Height="Auto" Grid.Column="0"
Width="110" VerticalAlignment="Center"
Foreground="{ButtonForegroundColor}" Foreground="{LabelboxForegroundColor}">
/> </TextBox>
</Button.Content> <Button Name="MicrowinScratchDirBT"
</Button> Grid.Column="1"
Margin="2"
Padding="1" VerticalAlignment="Center">
<Button.Content>
...
</Button.Content>
</Button>
</Grid>
<TextBox Name="MicrowinFinalIsoLocation" Background="Transparent" BorderBrush="{MainForegroundColor}" <TextBox Name="MicrowinFinalIsoLocation" Background="Transparent" BorderBrush="{MainForegroundColor}"
Text="ISO location will be printed here" Text="ISO location will be printed here"
Margin="2" Margin="2"
@ -821,6 +873,7 @@
Foreground="{LabelboxForegroundColor}" Foreground="{LabelboxForegroundColor}"
ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers" ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"
/> />
<CheckBox Name="MicrowinImportDrivers" Content="Import drivers from current system" Margin="5,0" IsChecked="False" ToolTip="Export all third-party drivers from your system and inject them to the MicroWin image"/>
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/> <Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
<CheckBox Name="WPFMicrowinCopyToUsb" Content="Copy to Ventoy" Margin="5,0" IsChecked="False" ToolTip="Copy to USB disk with a label Ventoy"/> <CheckBox Name="WPFMicrowinCopyToUsb" Content="Copy to Ventoy" Margin="5,0" IsChecked="False" ToolTip="Copy to USB disk with a label Ventoy"/>
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/> <Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>