Compare commits

..

71 Commits

Author SHA1 Message Date
a22d6b0d10 cleanup 2024-08-15 23:53:05 +02:00
4c6990b515 filter out unneeded categories 2024-08-15 22:30:57 +02:00
3f48c8aa70 fix ? issue in search 2024-08-15 21:52:43 +02:00
cdf36857c5 add image logic 2024-08-11 19:56:04 +02:00
e6e449af94 hotfixes 2024-08-11 18:23:05 +02:00
506c015496 some fixes 2024-08-11 14:06:46 +02:00
3be1999c22 hotfix
fix missing elements
fix var naming
2024-08-10 07:00:46 +02:00
b15f31fdf8 hotfix 2024-08-09 23:39:01 +02:00
47e80010d1 hotfixes
- reworked function calling
- working on correct theming support
2024-08-09 22:30:45 +02:00
1132d53944 move naming from winutil to wpf 2024-08-09 19:40:14 +02:00
bb39be794b fix toggle style 2024-08-07 21:27:07 +02:00
ec4cb1d520 removed unused replacementlogics 2024-08-07 00:31:43 +02:00
eaa19eba8a Merge branch 'ChrisTitusTech:main' into compact 2024-07-31 19:24:16 +02:00
dfe7dc4044 refractor
- removed Get-TabXaml.ps1
- removed compilation part from compile.ps1
- removed existing changes from main.ps1
- added Invoke-WinUtilUIElements.ps1
- refractor existing changes into new function
- modified inputXML to call function
2024-07-31 19:21:45 +02:00
2a530d0c12 Update createchangelog.yml 2024-07-30 21:41:52 -05:00
fb1a0b919c Update pre-release.yaml
bug fix and error handling
2024-07-30 21:33:30 -05:00
83bcf246f6 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2024-07-30 21:16:52 -05:00
e2567bddc9 Update close-discussion.yml 2024-07-30 21:16:47 -05:00
2508f28806 Compile Winutil 2024-07-31 02:15:01 +00:00
2d185e1919 Disable the Generate Sponsors Cronjob on Forks (#2473)
* Compile Winutil

* Only run Sponsor Cron on Main Repo

* Remove winutil from pR

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
2024-07-30 21:14:36 -05:00
5ac13f265e Fix winget ID of Advanced Renamer (#2467)
* Compile Winutil

* Fix Winget ID For Advanced-Renamer

* Remove winutil from pr

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
2024-07-30 21:14:12 -05:00
128593a950 Compile Winutil 2024-07-31 02:13:58 +00:00
e7328c2739 Complete Winget Install Overhaul and Progress Bar in GUI (#2466)
* Compile Winutil

* first draft for Progress bar in GUI

* small optimizations to the loading bar

* Optimize the Winget Installation Function to make it more maintainable

* Apply loading bar to Tweaks

* Update colors

* Add docs

* Fix value range for the taskbar item

* Remove winutil.ps1 from PR

* Documention and fix an oversight in the uninstall logic

* Reduce even more repeaded code

---------

Co-authored-by: Marterich <Marterich@users.noreply.github.com>
2024-07-30 21:13:30 -05:00
18f9f5e35d Compile Winutil 2024-07-31 02:10:40 +00:00
760fb3d30a Update UniGetUI description (#2486) 2024-07-30 21:10:14 -05:00
a75c80057a Compile Winutil 2024-07-31 02:09:00 +00:00
514eddd0b6 Exit Codes and Win32 API calls (#2462)
- Change process code to Start-Process -PassThru, finally removing the need for a new process object
- Add code if ISO generation is not successful to display an error message in the system language from the Windows APIs
2024-07-30 21:08:34 -05:00
3929459106 Update close-discussion.yml 2024-07-30 21:05:13 -05:00
b4bf321e66 Make README.md more friendly (#2455) 2024-07-30 20:55:16 -05:00
74f58e7957 Compile Winutil 2024-07-31 01:52:23 +00:00
875864060e Disable Background Apps (#2452)
* add disable bg apps tweak

* change essentail to advanced tweak
2024-07-30 20:51:47 -05:00
e38615b4b4 Compile Winutil 2024-07-31 01:51:18 +00:00
9f33cb1b82 add "Disable detailed BSoD Preference" (#2451) 2024-07-30 20:50:50 -05:00
313c5f59de Deploying to main from @ ChrisTitusTech/winutil@7de93ae208 🚀 2024-07-28 15:32:00 +00:00
4402c5cf31 try1: apps panel 2024-07-27 12:31:34 +02:00
7de93ae208 Update github-pages.yml
revert to v4
2024-07-25 16:28:02 -05:00
140620e76c Update dependabot.yml
dependabot shit the bed on python v5
2024-07-25 16:27:42 -05:00
8ae328c4b5 Compile Winutil 2024-07-25 21:20:12 +00:00
1032d3d5aa Taskbaritem > Progressbar / Overlay icon / description / asset mgmt (#2309)
* Add Progress bar to some stuff

https://learn.microsoft.com/en-us/dotnet/api/system.windows.shell.taskbariteminfo?view=windowsdesktop-8.0

* add function to manage taskbar item

changed from manually setting the taskbar overlay, progressvalue and progress state to setting them through a function

* add description feature

* use Dispatcher.Invoke

* restructure, fix, additions

* fix merge conflicts

* add check to progresses

* remove progress from wiget & choco install

* fix

* polish

* fix

* Update functions/private/Set-WinUtilTaskbarItem.ps1

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

* fix syntax

* Update functions/private/Set-WinUtilTaskbarItem.ps1

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

* rework

- add overlay presets
- rework image saving & converting
- removed popup after uninstalling applications

* fix description of function

* undo winutil

* remove check.png

* Update functions/private/Set-WinUtilTaskbarItem.ps1

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

* Update functions/private/Set-WinUtilTaskbarItem.ps1

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

* rework assets directory & its usage

* fixes

- ability to set no overlay added
- added relative path to winutildir

* hotfix

* last fixes

* add comment

* remove trailing whitespaces

THX to Mr.K :)

* renamed checkmark & added warning

* last fixes

remove bitmap
remove unneeded "| out-null"

* hotfix for new commit

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
2024-07-25 16:19:45 -05:00
84a84fd34d Compile Winutil 2024-07-25 21:10:23 +00:00
b23c685580 Updated DNS box (#2354) 2024-07-25 16:10:01 -05:00
214eb1d332 Compile Winutil 2024-07-25 21:09:37 +00:00
5083b84233 Added Try-Catch blocks for remaining removal tasks (#2365)
* Added Try-Catch blocks for remaining removal tasks

* Delete winutil.ps1 from tracking list

* Revert "Delete winutil.ps1 from tracking list"

This reverts commit 97044425ea.
2024-07-25 16:09:00 -05:00
4553f3e758 Added undoing tweak in FAQ (#2381)
* Added undoing tweak in FAQ

* fixed grammar

* fixed grammar... again

* Update docs/faq.md

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

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2024-07-25 16:06:56 -05:00
8baacc2966 Bump actions/setup-python from 4 to 5 (#2388)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-25 15:44:42 -05:00
a8c47e64d7 Compile Winutil 2024-07-25 20:43:59 +00:00
fcc48a2b22 Re-apply PR #2271 & Fix For Loop in 'Install-WinUtilProgramWinget' Private Function (#2396)
* Change Main loop from 'ForEach' to 'For' inside 'Install-WinUtilProgramWinget' Private Function (#2271)

* Fix Off By One Error by Replaceing Wrong Comparison Operator from '-le' (Less or Equal) to '-lt' (Less Than) in For Loop of 'Install-WinUtilProgramWinget' Private Function
2024-07-25 15:43:29 -05:00
f2a5574a8c Update changelog.md with all releases 2024-07-25 20:31:41 +00:00
363ed1c41b Fix 'Update changelog.md on Release' Workflow (#2410)
* A Fix for 'createchangelog.yml' & Rename File 'updates.md' to 'changelog.md'

* Fix GitHub CLI Not Working

* Increase the limit for Release List to 1000000

* Add '--exclude-drafts' & '--exclude-pre-releases' to GitHub CLI Release List Command

* Rewrite Bash Script found in a step of 'Update changelog.md on Release' GitHub Workflow

* Change the Content Generation a bit in 'Update changelog.md on Release' GitHub Workflow

* Reorder the Content Generation in 'Update changelog.md on Release' GitHub Workflow

* Update Regex for 'Update changelog.md on Release' Worflow

* Change the Release Event Types to 'Published, Edited, Created, Deleted' to ensure the Changelog is Up-To-Date
2024-07-25 15:27:09 -05:00
706328e674 Compile Winutil 2024-07-25 20:22:03 +00:00
2f43975735 Update MPC to fork thats still being developed (#2415)
- Change Choco id
- Update Description (to description from Githup Repo)
- Update Link to list the actual Github Page where the Updates are being published
2024-07-25 15:21:37 -05:00
d1a40217c1 Compile Winutil 2024-07-25 20:21:14 +00:00
790afac860 change ctt.com/win to github release url (#2420) 2024-07-25 15:20:51 -05:00
efee03b940 Compile Winutil 2024-07-25 20:20:06 +00:00
8beca950a8 renamed some preferences (#2421) 2024-07-25 15:19:32 -05:00
9bc6adf191 Fix 'Close Discussion on PR Merge' Workflow (#2423)
* A Fix for 'close-discussion.yml' Workflow

* Update Regex for 'Close Discussion on PR Merge' Worflow

* Finish last step in 'Close Discussion on PR Merge' Workflow

* Remove & Merge the Steps in 'Close Discussion on PR Merge' Workflow

* Re-Add Missing Environment Variable

* Update Regex for 'Close Discussion on PR Merge' Worflow
2024-07-25 15:17:54 -05:00
fb34c7cbd8 Compile Winutil 2024-07-25 20:16:01 +00:00
ae1b22552a Add explorer bloat tweak (#2424) 2024-07-25 15:15:37 -05:00
57f4eba692 Compile Winutil 2024-07-25 20:14:54 +00:00
22684da35b Added Gitbutler (#2425)
* Added Gitbutler

* Updated content
2024-07-25 15:14:28 -05:00
7acb213a77 Skip 'Close Issue on /close' Workflow if the comment was posted on a PR (#2426) 2024-07-25 15:12:06 -05:00
b9e8b9f697 Compile Winutil 2024-07-25 20:11:53 +00:00
300439c851 Update tweaks.json to correct stadby -> standby (#2432) 2024-07-25 15:11:23 -05:00
0e7ac225af fix OFGB typo (#2438) 2024-07-25 15:10:42 -05:00
0bbbe67446 Compile Winutil 2024-07-25 20:09:01 +00:00
376cc1d745 Fix typo in hybernation tweak. (#2439)
Changed 'stadby' to 'standby'
2024-07-25 15:08:37 -05:00
499848d643 Updates docs to try allow better customising and removes announcment banner. (#2448)
* Updates styling for WinUtil.

* Removes announcement and fixes grammar

* Revert "Deploying to main from @ ChrisTitusTech/winutil@8a6116cea1 🚀"

This reverts commit df2fe4a4c6.

* Revert "Deploying to main from @ ChrisTitusTech/winutil@e82870da89 🚀"

This reverts commit 8a6116cea1.

* Revert "Deploying to main from @ ChrisTitusTech/winutil@e784604a1a 🚀"

This reverts commit e82870da89.

* Revert "Update pre-release.yaml"

This reverts commit e784604a1a.

* Revert "Fixes release log (#2377)"

This reverts commit 5d3d47eeb5.

* Reapply "Fixes release log (#2377)"

This reverts commit 86f8d567b9.

* Reapply "Update pre-release.yaml"

This reverts commit 8761f3b815.

* Reapply "Deploying to main from @ ChrisTitusTech/winutil@e784604a1a 🚀"

This reverts commit 673f416257.

* Update README.md
2024-07-25 15:08:03 -05:00
601e338929 Compile Winutil 2024-07-25 05:27:02 +00:00
8045a78c44 [DOCS] Update (#2427)
* index, known issues & contribute

* revamp some existing stuff

* rework on existing stuff

* rework existing stuff + add new stuff

* remove unused folder & imgs

* undo winutil

* replace faulty formatted line with tip

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

* hotfix for tip

* fix grammer issues

* fix grammer issues

Corrected various grammatical errors in the documentation files. This includes fixing typos, adjusting punctuation, and improving sentence structure for better readability.

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
2024-07-25 00:26:32 -05:00
df2fe4a4c6 Deploying to main from @ ChrisTitusTech/winutil@8a6116cea1 🚀 2024-07-24 15:32:23 +00:00
8a6116cea1 Deploying to main from @ ChrisTitusTech/winutil@e82870da89 🚀 2024-07-21 15:32:26 +00:00
76 changed files with 2539 additions and 1429 deletions

View File

@ -7,3 +7,5 @@ updates:
ignore:
- dependency-name: "actions/stale"
versions: '>= 9'
- dependency-name: "actions/setup-python"
versions: '> 4'

View File

@ -8,23 +8,36 @@ jobs:
closeDiscussion:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Check if PR was merged
if: github.event.pull_request.merged == true
run: echo "PR was merged"
- name: Extract Discussion Number
- name: Extract Discussion Number & Close If any Were Found
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: github.event.pull_request.merged == true
id: extract-discussion
run: |
echo "discussion=$(echo '${{ github.event.pull_request.body }}' | grep -oP '(?<=Resolves #)\d+')" >> $GITHUB_OUTPUT
shell: bash
pr_body="${{ github.event.pull_request.body }}"
discussion_ids=$(echo "$pr_body" | grep -oP '(?i)(resolve|fix|close)[s|d]? #\K[0-9]+')
- name: Close the discussion
if: github.event.pull_request.merged == true && steps.extract-discussion.outputs.discussion
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DISCUSSION_ID: ${{ steps.extract-discussion.outputs.discussion }}
run: |
curl -X PATCH -H "Authorization: token $GITHUB_TOKEN" \
if [ -z "$discussion_ids" ]; then
echo "No discussion IDs found."
exit 0
fi
for discussion_id in $discussion_ids; do
echo "Closing discussion #$discussion_id"
response=$(curl -s -o /dev/null -w "%{http_code}" -X PATCH -H "Authorization: token $GITHUB_TOKEN" \
-d '{"state": "closed"}' \
"https://api.github.com/repos/${{ github.repository }}/discussions/${DISCUSSION_ID}"
"https://api.github.com/repos/${{ github.repository }}/discussions/$discussion_id")
if [ "$response" -ne 200 ]; then
echo "Failed to close discussion #$discussion_id. HTTP status code: $response"
exit 1
fi
done
shell: bash

View File

@ -1,9 +1,14 @@
name: Update update.mb on Release
name: Update changelog.md on Release
on:
release:
types: [published, prereleased]
workflow_dispatch: # Add this line to enable manual triggering
types: [published, created, edited, deleted]
workflow_dispatch:
inputs:
reason:
description: 'Reason for manual trigger'
required: false
default: 'Manual update'
jobs:
update-file:
@ -13,23 +18,94 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Get all releases and update update.mb file
- name: Get all releases and update changelog.md file
run: |
# Fetch all releases including pre-releases using GitHub CLI
gh release list --limit 5 > releases.txt
# Initialize some values
changelog_path="docs/changelog.md"
gh release list --exclude-drafts --json tagName,name,isLatest,isPrerelease --limit 1000000 > releases.txt
declare -r number_of_releases=$(cat releases.txt | grep -Po '"tagName"' | wc --lines)
# Extract numeric versions and create update.mb content
echo "" > docs/update.mb
# Clear the contents of changelog file
echo "" > $changelog_path
# Write some Initial Content to changelog file
echo "# Changelog" >> $changelog_path
echo "" >> $changelog_path
echo "WinUtil change log received from GitHub Releases, it's autogenerated using GitHub Actions." >> $changelog_path
echo "" >> $changelog_path
echo "> [!WARNING]" >> $changelog_path
echo "> This file **SHOULD NOT** be edited directly, any PRs that tries changing it directly will either be requested on not changing it, or it'll get rejected." >> $changelog_path
echo "" >> $changelog_path
# Make array for git tag names
tag_arr=()
cat releases.txt | grep -Po '"tagName":\s*.*?[^\\]"' | awk -F ':' '{print $2}' | sed s/\"//g > tags_list.txt
while read -r line; do
tag=$(echo "$line" | awk '{print $1}')
name=$(echo "$line" | awk -F'\t' '{print $2}')
version_numeric=$(echo "$tag" | grep -o -E '[0-9.]+')
body=$(gh release view "$tag" --json body --jq .body)
echo "## $version_numeric" >> docs/update.mb
echo "Release name: $name" >> docs/update.mb
echo "Release body: $body" >> docs/update.mb
echo "" >> docs/update.mb
done < releases.txt
tag_arr+=("$line")
done < tags_list.txt
# Make array for releases names
name_arr=()
cat releases.txt | grep -Po '"name":\s*.*?[^\\]"' | awk -F ':' '{print $2}' | sed s/\"//g > releases_names_list.txt
while read -r line; do
name_arr+=("$line")
done < releases_names_list.txt
# Make array for isPrerelease
isprerelease_arr=()
cat releases.txt | grep -Po '"isPrerelease":\s*(false|true)' | awk -F ':' '{print $2}' | sed s/\"//g > isprerelease_list.txt
while read -r line; do
isprerelease_arr+=("$line")
done < isprerelease_list.txt
# Make array for isLatest
islatest_arr=()
cat releases.txt | grep -Po '"isLatest":\s*(false|true)' | awk -F ':' '{print $2}' | sed s/\"//g > islatest_list.txt
while read -r line; do
islatest_arr+=("$line")
done < islatest_list.txt
# Debug Output
echo "Tag Array: " ${tag_arr[@]}
echo "Array Length: " ${#tag_arr[@]}
echo ""
echo "Release Name Array: " ${name_arr[@]}
echo "Array Length: " ${#name_arr[@]}
echo ""
echo "IsPrerelease Array: " ${isprerelease_arr[@]}
echo "Array Length: " ${#isprerelease_arr[@]}
echo ""
echo "IsLatest Array: " ${islatest_arr[@]}
echo "Array Length: " ${#islatest_arr[@]}
echo ""
# Exit when this impossible condition is met (just to be safe)
if [[ ! (${#tag_arr[@]}==${#name_arr[@]} && ${#tag_arr[@]}==${#isprerelease_arr[@]} && ${#tag_arr[@]}==${#islatest_arr[@]} ) ]] ; then
echo "Impossible Condition has been met, the Name Array Length Does Not match Tag Array Length, exiting..."
exit 1
fi
# Main loop that does the heavy lifting (Content Generation)
for (( i=0; i<${number_of_releases}; i++ ));
do
# The Variables to use on each iteration
tag=${tag_arr[$i]}
name=${name_arr[$i]}
isprerelease=${isprerelease_arr[$i]}
islatest=${islatest_arr[$i]}
body=$(gh release view "$tag" --json body --jq .body) || { echo "Failed to fetch release body for $tag"; exit 1; }
# The generation of changelog file contents
echo "# $name" >> $changelog_path
echo "" >> $changelog_path
echo "$body" >> $changelog_path
echo "" >> $changelog_path
done
env:
GH_TOKEN: ${{ github.token }}
- name: Commit and Push Changes
env:
@ -37,6 +113,5 @@ jobs:
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add docs/update.mb
git commit -m "Update update.mb with all releases"
git push
git add docs/changelog.md
git diff --quiet && git diff --staged --quiet || (git commit -m "Update changelog.md with all releases" && git push)

View File

@ -6,6 +6,8 @@ on:
jobs:
closeIssueOnClose:
# Skip this job if the comment was created/edited on a PR
if: ${{ !github.event.issue.pull_request }}
runs-on: ubuntu-latest
permissions:
issues: write

View File

@ -14,11 +14,11 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Extract Version from winutil.ps1
- name: Set Version to Todays Date
id: extract_version
run: |
$version = (Get-Date -Format "yy.MM.dd")
echo "version=$version" >> $env:GITHUB_ENV
echo "VERSION=$version" >> $env:GITHUB_ENV
shell: pwsh
- name: Create Tag
@ -27,7 +27,15 @@ jobs:
$tagExists = git tag -l $env:VERSION
if ($tagExists -eq "") {
git tag $env:VERSION
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to create tag $env:VERSION"
exit 1
}
git push origin $env:VERSION
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to push tag $env:VERSION"
exit 1
}
} else {
Write-Host "Tag $env:VERSION already exists, skipping tag creation"
}

View File

@ -8,6 +8,7 @@ permissions:
jobs:
deploy:
runs-on: ubuntu-latest
if: (github.event_name == 'schedule' && github.repository == 'ChrisTitusTech/winutil') || (github.event_name != 'schedule')
steps:
- name: Checkout 🛎️
uses: actions/checkout@v4

View File

@ -97,20 +97,7 @@ Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-
$xaml = (Get-Content .\xaml\inputXML.xaml).replace("'","''")
# Dot-source the Get-TabXaml function
. .\functions\private\Get-TabXaml.ps1
Update-Progress "Building: Xaml " 75
$appXamlContent = Get-TabXaml "applications" 5
$tweaksXamlContent = Get-TabXaml "tweaks"
$featuresXamlContent = Get-TabXaml "feature"
Update-Progress "Adding: Xaml " 90
# Replace the placeholder in $inputXML with the content of inputApp.xaml
$xaml = $xaml -replace "{{InstallPanel_applications}}", $appXamlContent
$xaml = $xaml -replace "{{InstallPanel_tweaks}}", $tweaksXamlContent
$xaml = $xaml -replace "{{InstallPanel_features}}", $featuresXamlContent
$script_content.Add($(Write-output "`$inputXML = '$xaml'"))

View File

@ -6,25 +6,24 @@
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](./docs/assets/screen-install.png)
![screen-install](./docs/assets/Title-Screen.png)
## 💡 Usage
Winutil must be run in Admin mode because it performs system-wide tweaks. To achieve this, open PowerShell or Windows Terminal as an administrator. Here are a few ways to do it:
Winutil must be run in Admin mode because it performs system-wide tweaks. To achieve this, run PowerShell as an administrator. Here are a few ways to do it:
1. **Right-Click Method:**
1. **Start menu Method:**
- Right-click on the start menu.
- Choose "Windows PowerShell (Admin)" (for Windows 10) or "Terminal (Admin)" (for Windows 11).
2. **Search and Launch Method:**
- Press the Windows key.
- Type "PowerShell" or "Terminal" (for Windows 11).
- Press `Ctrl + Shift + Enter` to launch it with administrator privileges.
- Press `Ctrl + Shift + Enter` or Right-click and choose "Run as administrator" to launch it with administrator privileges.
### Launch Command
#### Stable Branch
#### Stable Branch (Recommended)
```ps1
irm "https://christitus.com/win" | iex
@ -45,7 +44,6 @@ If you have Issues, refer to [Known Issues](https://christitustech.github.io/win
### [ChrisTitus.com Article](https://christitus.com/windows-tool/)
## 💖 Support
- To morally and mentally support the project, make sure to leave a ⭐️!
- EXE Wrapper for $10 @ https://www.cttstore.com/windows-toolbox
@ -54,7 +52,7 @@ If you have Issues, refer to [Known Issues](https://christitustech.github.io/win
These are the sponsors that help keep this project alive with monthly contributions.
<!-- sponsors --><a href="https://github.com/GregoryNavasarkian"><img src="https://github.com/GregoryNavasarkian.png" width="60px" alt="Gregory Navasarkian" /></a><a href="https://github.com/ysaito8015"><img src="https://github.com/ysaito8015.png" width="60px" alt="Yusuke Saito" /></a><a href="https://github.com/TriHydera"><img src="https://github.com/TriHydera.png" width="60px" alt="TriHydera" /></a><a href="https://github.com/jozozovko"><img src="https://github.com/jozozovko.png" width="60px" alt="" /></a><a href="https://github.com/DelDongo"><img src="https://github.com/DelDongo.png" width="60px" alt="" /></a><a href="https://github.com/markamos"><img src="https://github.com/markamos.png" width="60px" alt="Mark Amos" /></a><a href="https://github.com/dwelfusius"><img src="https://github.com/dwelfusius.png" width="60px" alt="" /></a><a href="https://github.com/mews-se"><img src="https://github.com/mews-se.png" width="60px" alt="" /></a><a href="https://github.com/jdiegmueller"><img src="https://github.com/jdiegmueller.png" width="60px" alt="Jason A. Diegmueller" /></a><a href="https://github.com/AlanTristar"><img src="https://github.com/AlanTristar.png" width="60px" alt="" /></a><a href="https://github.com/JennJones89"><img src="https://github.com/JennJones89.png" width="60px" alt="" /></a><a href="https://github.com/zepled112"><img src="https://github.com/zepled112.png" width="60px" alt="wyatt" /></a><a href="https://github.com/TDWillingham"><img src="https://github.com/TDWillingham.png" width="60px" alt="MetalliDan28" /></a><a href="https://github.com/frankolivares"><img src="https://github.com/frankolivares.png" width="60px" alt="" /></a><a href="https://github.com/Cube707"><img src="https://github.com/Cube707.png" width="60px" alt="Jan Wille" /></a><a href="https://github.com/Owen-3456"><img src="https://github.com/Owen-3456.png" width="60px" alt="Owen" /></a><a href="https://github.com/altugtekiner"><img src="https://github.com/altugtekiner.png" width="60px" alt="" /></a><a href="https://github.com/getsmor"><img src="https://github.com/getsmor.png" width="60px" alt="" /></a><a href="https://github.com/robertsandrock"><img src="https://github.com/robertsandrock.png" width="60px" alt="" /></a><a href="https://github.com/jeffnesbit"><img src="https://github.com/jeffnesbit.png" width="60px" alt="" /></a><a href="https://github.com/mmomega"><img src="https://github.com/mmomega.png" width="60px" alt="" /></a><a href="https://github.com/KenichiQaz"><img src="https://github.com/KenichiQaz.png" width="60px" alt="Stefan" /></a><a href="https://github.com/thaddl"><img src="https://github.com/thaddl.png" width="60px" alt="thaddl" /></a><a href="https://github.com/paulsheets"><img src="https://github.com/paulsheets.png" width="60px" alt="" /></a><a href="https://github.com/djones369"><img src="https://github.com/djones369.png" width="60px" alt="Dave Jones" /></a><!-- sponsors -->
<!-- sponsors --><a href="https://github.com/GregoryNavasarkian"><img src="https://github.com/GregoryNavasarkian.png" width="60px" alt="Gregory Navasarkian" /></a><a href="https://github.com/ysaito8015"><img src="https://github.com/ysaito8015.png" width="60px" alt="Yusuke Saito" /></a><a href="https://github.com/TriHydera"><img src="https://github.com/TriHydera.png" width="60px" alt="TriHydera" /></a><a href="https://github.com/jozozovko"><img src="https://github.com/jozozovko.png" width="60px" alt="" /></a><a href="https://github.com/DelDongo"><img src="https://github.com/DelDongo.png" width="60px" alt="" /></a><a href="https://github.com/markamos"><img src="https://github.com/markamos.png" width="60px" alt="Mark Amos" /></a><a href="https://github.com/dwelfusius"><img src="https://github.com/dwelfusius.png" width="60px" alt="" /></a><a href="https://github.com/mews-se"><img src="https://github.com/mews-se.png" width="60px" alt="" /></a><a href="https://github.com/jdiegmueller"><img src="https://github.com/jdiegmueller.png" width="60px" alt="Jason A. Diegmueller" /></a><a href="https://github.com/AlanTristar"><img src="https://github.com/AlanTristar.png" width="60px" alt="" /></a><a href="https://github.com/JennJones89"><img src="https://github.com/JennJones89.png" width="60px" alt="" /></a><a href="https://github.com/zepled112"><img src="https://github.com/zepled112.png" width="60px" alt="wyatt" /></a><a href="https://github.com/Cube707"><img src="https://github.com/Cube707.png" width="60px" alt="Jan Wille" /></a><a href="https://github.com/Owen-3456"><img src="https://github.com/Owen-3456.png" width="60px" alt="Owen" /></a><a href="https://github.com/altugtekiner"><img src="https://github.com/altugtekiner.png" width="60px" alt="" /></a><a href="https://github.com/getsmor"><img src="https://github.com/getsmor.png" width="60px" alt="" /></a><a href="https://github.com/robertsandrock"><img src="https://github.com/robertsandrock.png" width="60px" alt="" /></a><a href="https://github.com/jeffnesbit"><img src="https://github.com/jeffnesbit.png" width="60px" alt="" /></a><a href="https://github.com/mmomega"><img src="https://github.com/mmomega.png" width="60px" alt="" /></a><a href="https://github.com/KenichiQaz"><img src="https://github.com/KenichiQaz.png" width="60px" alt="Stefan" /></a><a href="https://github.com/thaddl"><img src="https://github.com/thaddl.png" width="60px" alt="thaddl" /></a><a href="https://github.com/paulsheets"><img src="https://github.com/paulsheets.png" width="60px" alt="Paul" /></a><a href="https://github.com/djones369"><img src="https://github.com/djones369.png" width="60px" alt="Dave Jones" /></a><!-- sponsors -->
## 🏅 Thanks to all Contributors
Thanks a lot for spending your time helping Winutil grow. Thanks a lot! Keep rocking 🍻.

View File

@ -205,7 +205,7 @@
"content": "Advanced Renamer",
"description": "Advanced Renamer is a program for renaming multiple files and folders at once. By configuring renaming methods the names can be manipulated in various ways.",
"link": "https://www.advancedrenamer.com/",
"winget": "XP9MD3S1KFCPH1"
"winget": "HulubuluSoftware.AdvancedRenamer"
},
"calibre": {
"category": "Document",
@ -727,6 +727,14 @@
"link": "https://git-scm.com/",
"winget": "Git.Git"
},
"gitbutler": {
"category": "Development",
"choco": "na",
"content": "Git Butler",
"description": "A Git client for simultaneous branches on top of your existing workflow.",
"link": "https://gitbutler.com/",
"winget": "GitButler.GitButler"
},
"gitextensions": {
"category": "Development",
"choco": "git;gitextensions",
@ -1215,12 +1223,12 @@
"link": "https://motrix.app/",
"winget": "agalwood.Motrix"
},
"mpc": {
"mpchc": {
"category": "Multimedia Tools",
"choco": "mpc-hc",
"content": "Media Player Classic (Video Player)",
"description": "Media Player Classic is a lightweight, open-source media player that supports a wide range of audio and video formats. It includes features like customizable toolbars and support for subtitles.",
"link": "https://mpc-hc.org/",
"choco": "mpc-hc-clsid2",
"content": "Media Player Classic - Home Cinema",
"description": "Media Player Classic - Home Cinema (MPC-HC) is a free and open-source video and audio player for Windows. MPC-HC is based on the original Guliverkli project and contains many additional features and bug fixes.",
"link": "https://github.com/clsid2/mpc-hc/",
"winget": "clsid2.mpc-hc"
},
"mremoteng": {
@ -2458,8 +2466,8 @@
"wingetui": {
"category": "Utilities",
"choco": "wingetui",
"content": "UnigetUI",
"description": "WingetUI is a graphical user interface for Microsoft's Windows Package Manager (winget).",
"content": "UniGetUI",
"description": "UniGetUI is a GUI for Winget, Chocolatey, and other Windows CLI package managers.",
"link": "https://www.marticliment.com/wingetui/",
"winget": "SomePythonThings.WingetUIStore"
},
@ -2883,7 +2891,7 @@
"category": "Utilities",
"choco": "ofgb",
"content": "OFGB (Oh Frick Go Back)",
"description":"GUI Tool To Removes Ads From Various Places Around Windows 11",
"description":"GUI Tool to remove ads from various places around Windows 11",
"link": "https://github.com/xM4ddy/OFGB",
"winget": "xM4ddy.OFGB"
},

View File

@ -12,7 +12,7 @@
"HeaderFontFamily": "Consolas, Monaco",
"CheckBoxBulletDecoratorFontSize": "14",
"CheckBoxMargin": "15,0,0,2",
"CheckBoxMargin": "5,0,0,2",
"TabButtonFontSize": "14",
"TabButtonWidth": "100",
@ -25,6 +25,10 @@
"MicroWinLogoSize": "10",
"ProgressBarForegroundColor": "#FFAC1C",
"ProgressBarBackgroundColor": "Transparent",
"ProgressBarTextColor": "#000000",
"ComboBoxBackgroundColor": "#FFFFFF",
"LabelboxForegroundColor": "#000000",
"MainForegroundColor": "#000000",
@ -82,7 +86,7 @@
"HeaderFontFamily": "Consolas, Monaco",
"CheckBoxBulletDecoratorFontSize": "14",
"CheckBoxMargin": "15,0,0,2",
"CheckBoxMargin": "5,0,0,1",
"TabButtonFontSize": "14",
"TabButtonWidth": "100",
@ -95,6 +99,10 @@
"MicroWinLogoSize": "10",
"ProgressBarForegroundColor": "#222222",
"ProgressBarBackgroundColor": "Transparent",
"ProgressBarTextColor": "#cccccc",
"ComboBoxBackgroundColor": "#000000",
"LabelboxForegroundColor": "#FFEE58",
"MainForegroundColor": "#9CCC65",
@ -150,7 +158,7 @@
"HeaderFontFamily": "Consolas, Monaco",
"CheckBoxBulletDecoratorFontSize": "14",
"CheckBoxMargin": "15,0,0,2",
"CheckBoxMargin": "5,0,0,0.8",
"TabButtonFontSize": "14",
"TabButtonWidth": "100",
@ -163,6 +171,10 @@
"MicroWinLogoSize": "10",
"ProgressBarForegroundColor": "#222222",
"ProgressBarBackgroundColor": "Transparent",
"ProgressBarTextColor": "#FFFFFF",
"ComboBoxBackgroundColor": "#000000",
"LabelboxForegroundColor": "#FFEE58",
"MainForegroundColor": "#9CCC65",

View File

@ -60,7 +60,7 @@
},
"WPFTweaksLaptopHibernation": {
"Content": "Set Hibernation as default (good for laptops)",
"Description": "Most modern laptops have connected stadby enabled which drains the battery, this sets hibernation as default which will not drain the battery. See issue https://github.com/ChrisTitusTech/winutil/issues/1399",
"Description": "Most modern laptops have connected standby enabled which drains the battery, this sets hibernation as default which will not drain the battery. See issue https://github.com/ChrisTitusTech/winutil/issues/1399",
"category": "Essential Tweaks",
"panel": "1",
"Order": "a014_",
@ -2006,6 +2006,27 @@
}
]
},
"WPFTweaksRemoveHomeGallery": {
"Content": "Remove Home and Gallery from explorer",
"Description": "Removes the Home and Gallery from explorer and sets This PC as default",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"Order": "a029_",
"InvokeScript": [
"
REG DELETE \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\{e88865ea-0e1c-4e20-9aa6-edcd0212c87c}\" /f
REG DELETE \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\{f874310e-b6b7-47dc-bc84-b9e6b38f5903}\" /f
REG ADD \"HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" /f /v \"LaunchTo\" /t REG_DWORD /d \"1\"
"
],
"UndoScript": [
"
REG ADD \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\{e88865ea-0e1c-4e20-9aa6-edcd0212c87c}\" /f /ve /t REG_SZ /d \"{e88865ea-0e1c-4e20-9aa6-edcd0212c87c}\"
REG ADD \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\{f874310e-b6b7-47dc-bc84-b9e6b38f5903}\" /f /ve /t REG_SZ /d \"CLSID_MSGraphHomeFolder\"
REG DELETE \"HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" /f /v \"LaunchTo\"
"
]
},
"WPFTweaksDisplay": {
"Content": "Set Display for Performance",
"Description": "Sets the system preferences to performance. You can do this manually with sysdm.cpl as well.",
@ -2995,6 +3016,22 @@
"Enable-NetAdapterBinding -Name \"*\" -ComponentID ms_tcpip6"
]
},
"WPFTweaksDisableBGapps": {
"Content": "Disable Background Apps",
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Win11",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"Order": "a024_",
"registry": [
{
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\BackgroundAccessApplications",
"Name": "GlobalUserDisabled",
"Value": "1",
"OriginalValue": "0",
"Type": "DWord"
}
]
},
"WPFTweaksDisableFSO": {
"Content": "Disable Fullscreen Optimizations",
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen",
@ -3012,7 +3049,7 @@
]
},
"WPFToggleDarkMode": {
"Content": "Enable Dark Theme for Windows",
"Content": "Dark Theme for Windows",
"Description": "Enable/Disable Dark Mode.",
"category": "Customize Preferences",
"panel": "2",
@ -3020,7 +3057,7 @@
"Type": "Toggle"
},
"WPFToggleBingSearch": {
"Content": "Enable Bing Search in Start Menu",
"Content": "Bing Search in Start Menu",
"Description": "If enable then includes web search results from Bing in your Start Menu search.",
"category": "Customize Preferences",
"panel": "2",
@ -3028,7 +3065,7 @@
"Type": "Toggle"
},
"WPFToggleNumLock": {
"Content": "Enable NumLock on Startup",
"Content": "NumLock on Startup",
"Description": "Toggle the Num Lock key state when your computer starts.",
"category": "Customize Preferences",
"panel": "2",
@ -3036,7 +3073,7 @@
"Type": "Toggle"
},
"WPFToggleVerboseLogon": {
"Content": "Enable Verbose Messages During Logon",
"Content": "Verbose Messages During Logon",
"Description": "Show detailed messages during the login process for troubleshooting and diagnostics.",
"category": "Customize Preferences",
"panel": "2",
@ -3044,7 +3081,7 @@
"Type": "Toggle"
},
"WPFToggleSnapWindow": {
"Content": "Enable Snap Window",
"Content": "Snap Window",
"Description": "If enabled you can align windows by dragging them. | Relogin Required",
"category": "Customize Preferences",
"panel": "2",
@ -3052,7 +3089,7 @@
"Type": "Toggle"
},
"WPFToggleSnapFlyout": {
"Content": "Enable Snap Assist Flyout",
"Content": "Snap Assist Flyout",
"Description": "If enabled then Snap preview is disabled when maximize button is hovered.",
"category": "Customize Preferences",
"panel": "2",
@ -3060,7 +3097,7 @@
"Type": "Toggle"
},
"WPFToggleSnapSuggestion": {
"Content": "Enable Snap Assist Suggestion",
"Content": "Snap Assist Suggestion",
"Description": "If enabled then you will get suggestions to snap other applications in the left over spaces.",
"category": "Customize Preferences",
"panel": "2",
@ -3068,7 +3105,7 @@
"Type": "Toggle"
},
"WPFToggleMouseAcceleration": {
"Content": "Enable Mouse Acceleration",
"Content": "Mouse Acceleration",
"Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.",
"category": "Customize Preferences",
"panel": "2",
@ -3076,7 +3113,7 @@
"Type": "Toggle"
},
"WPFToggleStickyKeys": {
"Content": "Enable Sticky Keys",
"Content": "Sticky Keys",
"Description": "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.",
"category": "Customize Preferences",
"panel": "2",
@ -3100,7 +3137,7 @@
"Type": "Toggle"
},
"WPFToggleTaskbarSearch": {
"Content": "Show Search Button in Taskbar",
"Content": "Search Button in Taskbar",
"Description": "If Enabled Search Button will be on the taskbar.",
"category": "Customize Preferences",
"panel": "2",
@ -3108,7 +3145,7 @@
"Type": "Toggle"
},
"WPFToggleTaskView": {
"Content": "Show Task View Button in Taskbar",
"Content": "Task View Button in Taskbar",
"Description": "If Enabled then Task View Button in Taskbar will be shown.",
"category": "Customize Preferences",
"panel": "2",
@ -3116,7 +3153,7 @@
"Type": "Toggle"
},
"WPFToggleTaskbarWidgets": {
"Content": "Show Widgets Button in Taskbar",
"Content": "Widgets Button in Taskbar",
"Description": "If Enabled then Widgets Button in Taskbar will be shown.",
"category": "Customize Preferences",
"panel": "2",
@ -3124,13 +3161,21 @@
"Type": "Toggle"
},
"WPFToggleTaskbarAlignment": {
"Content": "Switch Taskbar Items between Center & Left",
"Content": "Center Taskbar Items",
"Description": "[Windows 11] If Enabled then the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
"category": "Customize Preferences",
"panel": "2",
"Order": "a204_",
"Type": "Toggle"
},
"WPFToggleDetailedBSoD": {
"Content": "Detailed BSoD",
"Description": "If Enabled then you will see a detailed Blue Screen of Death (BSOD) with more information.",
"category": "Customize Preferences",
"panel": "2",
"Order": "a205_",
"Type": "Toggle"
},
"WPFOOSUbutton": {
"Content": "Run OO Shutup 10",
"category": "z__Advanced Tweaks - CAUTION",
@ -3144,7 +3189,7 @@
"panel": "1",
"Order": "a040_",
"Type": "Combobox",
"ComboItems": "Default DHCP Google Cloudflare Cloudflare_Malware Cloudflare_Malware_Adult Level3 Open_DNS Quad9"
"ComboItems": "Default DHCP Google Cloudflare Cloudflare_Malware Cloudflare_Malware_Adult Open_DNS Quad9 AdGuard_Ads_Trackers AdGuard_Ads_Trackers_Malware_Adult"
},
"WPFTweaksbutton": {
"Content": "Run Tweaks",

View File

@ -1,5 +1,3 @@
## Known Issues and Fixes
### Launch Issues:
- Windows Security (formerly Defender) and other anti-virus software are known to block the script. The script gets flagged due to the fact that it requires administrator privileges & makes drastic system changes.
@ -14,10 +12,14 @@
- If you are unable to resolve `christitus.com/win` and are getting errors launching the tool, it might be due to India blocking GitHub's content domain and preventing downloads.
- Source: <https://timesofindia.indiatimes.com/gadgets-news/github-content-domain-blocked-for-these-indian-users-reports/articleshow/96687992.cms>
If you are still having issues try using a **VPN**, or changing your **DNS provider** to:
If you are still having issues try using a **VPN**, or changing your **DNS provider** to one of following two providers:
| Provider | Primary DNS | Secondary DNS |
|:------------:|:------------:|:-------------:|
| Cloudflare | `1.1.1.1` | `1.0.0.1` |
| Google | `8.8.8.8` | `8.8.4.4` |
| `1.1.1.1` | `1.0.0.1` | or | `8.8.8.8` | `8.8.4.4` |
|---------|---------|-----|---------|---------|
- Script doesn't run/PowerShell crashes:
1. Press Windows Key+X and select 'PowerShell (Admin)' (Windows 10) or 'Windows Terminal (Admin)' (Windows 11)
@ -53,7 +55,7 @@ Get-Service -Name "XboxGipSvc" | Set-Service -StartupType Automatic
- Explorer no longer launches: Go to Control Panel, File Explorer Options, Change the 'Open File Explorer to' option to 'This PC'.
### Battery drains too fast.
When your battery on the laptop drains too fast, please perform these steps and report the results back to the 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:**
- Open a Command Prompt as an administrator.
@ -134,13 +136,13 @@ When your battery on the laptop drains too fast, please perform these steps and
- Check settings/preferences of individual applications for power-related options.
- Uninstall unnecessary or problematic software.
By following these detailed instructions, you should be able to thoroughly diagnose and address battery drain issues on your Windows laptop. Adjust settings as needed to optimize power management and improve battery life.
* By following these detailed instructions, you should be able to thoroughly diagnose and address battery drain issues on your Windows laptop. Adjust settings as needed to optimize power management and improve battery life.
### Troubleshoot errors during Microwin usage
#### Error `0x80041031`
This error code typically indicates an issue related to Windows Management Instrumentation (WMI). Here are a few steps you can try to resolve the issue:
* This error code typically indicates an issue related to Windows Management Instrumentation (WMI). Here are a few steps you can try to resolve the issue:
1. **Reboot Your Computer:**
Sometimes, a simple reboot can resolve temporary issues. Restart your computer and try mounting the ISO again.
@ -174,4 +176,4 @@ This error code typically indicates an issue related to Windows Management Instr
7. **ISO File Integrity:**
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 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.
* 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.

BIN
docs/assets/Commit-GHD.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

BIN
docs/assets/Compile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

BIN
docs/assets/Discard-GHD.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

BIN
docs/assets/Push-Commit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
docs/assets/Screen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

View File

Before

Width:  |  Height:  |  Size: 339 KiB

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

175
docs/changelog.md Normal file
View File

@ -0,0 +1,175 @@
# Changelog
WinUtil change log received from GitHub Releases, it's autogenerated using GitHub Actions.
> [!WARNING]
> This file **SHOULD NOT** be edited directly, any PRs that tries changing it directly will either be requested on not changing it, or it'll get rejected.
# Release 24.07.17
![GitHub Downloads (specific asset, specific tag)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/24.07.17/winutil.ps1)
## What's Changed
* Pump up the value of 'operations-per-run' Field for 'Close Old Issues' Workflow by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2219
* Improvements/Fixes for the Release Actions by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2221
* Move Launch Issues from ReadMe to Known Issues by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2222
* [01] Refactoring UI code by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2274
* Delete Un-used 'helperscript.ps1' File by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2223
* Known Issues: Removed redundancy caused by resolving the merge conflict. by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2224
* Redirect dev to latest Full Release if can't find prerelease by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2225
* Add 'CONTRIBUTING.md' File by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2227
* Update main.ps1 by @eltociear in https://github.com/ChrisTitusTech/winutil/pull/2229
* Added get installed check for classic right click menu tweak by @btstromberg in https://github.com/ChrisTitusTech/winutil/pull/2231
* fix syntax highlighting in .MDs by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2235
* Add "Shotcut" in applications by @ksb2311 in https://github.com/ChrisTitusTech/winutil/pull/2238
* Fix Icon Support for Shortcut Creation by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2242
* Allow for tasks to be distinguished by @CodingWonders in https://github.com/ChrisTitusTech/winutil/pull/2251
* Fix & Rename Nilesoft Shell by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2261
* Fix: Ultimate Performance Plan by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2267
* Change Main loop from 'ForEach' to 'For' inside 'Install-WinUtilProgramWinget' Private Function by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2271
* Fix 'Close Old Issues' Workflow by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2272
* Add new 'Disable Powershell 7 Telemetry' Tweak by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2273
* Fix Typo in 'Invoke-WinUtilTaskbarSearch' Private Function by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2275
* Update applications.json by @dhruvmistry2000 in https://github.com/ChrisTitusTech/winutil/pull/2290
* Add app: Modern Flyouts by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2293
* Adds PR template by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2299
* Add download counter by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2300
* Change Kicad category by @Joanty24 in https://github.com/ChrisTitusTech/winutil/pull/2302
* Fix: PR Template file extension by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2304
* Rework JDK packages with Corretto LTS ones by @meenbeese in https://github.com/ChrisTitusTech/winutil/pull/2305
* Added IPv6 DNS by @Joanty24 in https://github.com/ChrisTitusTech/winutil/pull/2303
* Create createchangelog.yml for docs page by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2346
* Adds all files for winutil docs by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2342
* Adds Community Discord to ReadMe file by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2343
* Discussions close on PR merge by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2336
* Documentation & ReadMe Cleanup by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2310
* Added MicroWin documentation by @CodingWonders in https://github.com/ChrisTitusTech/winutil/pull/2349
* Update Install-WinUtilProgramChoco.ps1 by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2307
* Addition of Fork by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2313
* Hidden File Tweaks by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2320
* Optimized: Shortcut Creation and PS7 Tweak by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2314
* Addition of multiple applications by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2316
* Add Application: ZoomIt by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2319
* Fix Compile Errors on PowerShell 5 by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2322
* Add application: Lenovo Legion Toolkit by @Klusio19 in https://github.com/ChrisTitusTech/winutil/pull/2324
* Remove Edge leftovers from WOW6432Node by @CodingWonders in https://github.com/ChrisTitusTech/winutil/pull/2328
* Fix: End Task with right click by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2331
* Adds Palemoon and closes old issues if not needed by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2332
* Change the titles for each section from Bold Text to Header 2 in Bug Report Issue Template by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2339
* Optimize badges by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2356
* Add New Windows 11 Specific Toggle - The 'Taskbar Alignment' Toggle by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2347
* Make the 'Youtube Tutorial' Header be the link instead of the Youtube Thumbnail for it, Making the 'README.md' even shorter by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2359
* Fix WinUtil Crashing on Startup - Xaml Error from Generated Applications List by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2361
* [Wiki] Automatically enabling Dark/Light mode set by user's browser Preference by @Angxddeep in https://github.com/ChrisTitusTech/winutil/pull/2366
* Fixes an issue with create changelog not working by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2375
* Updates PR template so disscussion and issue is on the same line. by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2363
* Update close-discussion.yml so it detects based on new previous PR by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2364
* Repo Cleanup by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2367
* Add /close command for the active contributors to close issues by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2380
* Update workflows to remove `::set-output` by @wojsmol in https://github.com/ChrisTitusTech/winutil/pull/2384
* Fixes release log by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2377
* Bump actions/checkout from 2 to 4 by @dependabot in https://github.com/ChrisTitusTech/winutil/pull/2389
* Bump actions/cache from 2 to 4 by @dependabot in https://github.com/ChrisTitusTech/winutil/pull/2390
## New Contributors
* @btstromberg made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2231
* @ksb2311 made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2238
* @dhruvmistry2000 made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2290
* @Klusio19 made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2324
* @Angxddeep made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2366
* @wojsmol made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2384
* @dependabot made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2389
**Full Changelog**: https://github.com/ChrisTitusTech/winutil/compare/24.06.29...24.07.17
# Release 24.06.28
![GitHub Downloads (specific asset, specific tag)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/24.06.28/winutil.ps1)
## What's Changed
* Rename Application: ForceAutoHDR by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2081
* Remove force install of Winget + Small improvements by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2083
* Remove WwanSvc Service From Manual Services Tweak by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2086
* Added Plex Desktop along side Plex Media Server by @PedroBuffon in https://github.com/ChrisTitusTech/winutil/pull/2091
* Remove java 20 by @brrock in https://github.com/ChrisTitusTech/winutil/pull/2095
* Remove oosu essential tweak by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2099
* Removed Free File Sync because of Malware warning on choco repo by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2101
* Remove unused Functions by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2102
* Remove Extra Tabs in 'applications.json' File by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2113
* Fix Compile -Run always starting as PS5 by @Marterich in https://github.com/ChrisTitusTech/winutil/pull/2165
* Fix White space (bottom right of Application Tab) by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2120
* Delete Un-used 'logs' Folder by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2135
* Fixes Edge Removal by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2136
* Added kicad by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2138
* Addition of Dropbox by @Real-MullaC in https://github.com/ChrisTitusTech/winutil/pull/2200
* Spelling Fix: uninstall button by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2197
* Add Overlay to Taskbaritem by @MyDrift-user in https://github.com/ChrisTitusTech/winutil/pull/2196
## New Contributors
* @PedroBuffon made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2091
* @brrock made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2095
**Full Changelog**: https://github.com/ChrisTitusTech/winutil/compare/24.06.25...24.06.28
# Release 24.06.18
## What's Changed
* Update Invoke-WinUtilNumLock.ps1 by @ChrisTitusTech in https://github.com/ChrisTitusTech/winutil/pull/2104
**Full Changelog**: https://github.com/ChrisTitusTech/winutil/compare/24.06.11...24.06.18
# Release 24.06.11
This release is an auto generated release.
From now on any pull request on the main branch generates a release like this, which ensures you can rewind in time to ANY version of winutil. Also this makes it easy to launch winutil from github.com instead of using raw GitHub which is blocked in some countries. Big shoutout to KonTy for the auto release idea!
## What's Changed
* Fix Numlock toggle by @ChrisTitusTech in https://github.com/ChrisTitusTech/winutil/pull/2044
* fix typo by @nikolan123 in https://github.com/ChrisTitusTech/winutil/pull/2041
* Simplify 'Close Old Issues' Workflow by using 'actions/stale' GitHub Action by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2055
* Compile Cleanup and Tweak Fixes by @ChrisTitusTech in https://github.com/ChrisTitusTech/winutil/pull/2062
* Fix the URL of an Example in 'README.md' File by @og-mrk in https://github.com/ChrisTitusTech/winutil/pull/2063
## New Contributors
* @nikolan123 made their first contribution in https://github.com/ChrisTitusTech/winutil/pull/2041
**Full Changelog**: https://github.com/ChrisTitusTech/winutil/compare/v2024.06.05...24.06.11
# WinUtil 2024.06.05 Bug Fixes and Feature Additions
- Applications cleanup (Few unmaintained applications culled)
- Application Additions
- Various Microwin fixes thanks to @KonTy
- Better application filtering @Marterich
- CoPilot Removal @KonTy @ModernTTY
- Import Drivers @CodingWonders
- OOSU updates @Marterich
- Fix Auto HDR @og-mrk
- Only install chocolatey if needed @Marterich
- Various winget fixes @og-mrk
- Adobe Fixes @MyDrift-user
- Disable Fullscreen Optimizations Tweak Added
- Tweaks reorder and cleanup
- Chocolatey fallback fix @ty802
This was a massive 100+ commit PR and the last of it's size. Going forward I will be making multiple branches to separate the pr's into. This will help seperate application PRs, GUI PRs, Tweaks, and others into their own branches based on features.
# WinUtil 2024.04.20 Bug Fixes and Issue Fixes
- Toggle Widgets fix @og-mrk
- Fix Special Characters causing errors in JSON files @og-mrk
- Restart explorer on classic right click tweak @og-mrk
- Fix Disable Storage Sense @og-mrk
- Robocopy fix when username has space in during OneDrive uninstall @og-mrk
- Multiple Winget Fixes made by @ruxunderscore
- Fix DISM Conversion for ESD files @CodingWonders
- Independent Edge Removal Update by @DaEpicR
- Disable SCOOBE @ICTdE
- O&O Tweaks update by @Marterich
- Bugfix for Window Restore Creation by @ChrisTitusTech
- Fix Winget Installs for Default -> User Scope -> Unelevated if one fails it trys the next method. @ChrisTitusTech
- Fix Unit Tests for Functions @ChrisTitusTech

View File

@ -1,57 +1,106 @@
# How to Contribute?
## Testing
* Test the latest changes to WinUtil by running the pre-release and reporting issues you are encountering to help us continually improve WinUtil!
#### **Run the latest pre-release**
```ps1
irm christitus.com/windev | iex
```
   
!!! bug "Keep in mind"
This is a pre-release and should be treated as such. It exists for developers to test the utility and report or fix bugs before they get added to the stable release. Don't use it in production!
## Issues
* If you encounter any challenges or problems with the script, I kindly request that you submit them via the "Issues" tab on the GitHub repository. By filling out the provided template, you can provide specific details about the issue, allowing me (and others in the community) to promptly address any bugs, or consider feature requests.
* If you encounter any challenges or problems with the script, I kindly request that you submit them via the "Issues" tab on the GitHub repository. By filling out the provided template, you can provide specific details about the issue, allowing me (and others in the community) to promptly address any bugs or consider feature requests.
## Contribute Code
* 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.
* 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 you're doing code changes, then you can submit a PR to `main` branch, but I am very selective about these.
> [!WARNING]
> 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!
!!! warning "Important"
* When creating pull requests, it is essential to thoroughly document all changes made. This includes, but not limited to, documenting any additions made to the `tweaks` section and corresponding `undo tweak`, so users are able to remove the newly added tweaks if necessary, and comprehensive documentation is required for all code changes, document your changes and briefly explain why you made your changes in your Pull Request Description. Failure to adhere to this format may result in denial of the pull request. Additionally, Any code lacking sufficient documentation may also be denied.
Do not use a code formatter, make massive amounts of line changes, or 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, but is not limited to, documenting any additions made to the `tweaks` section and corresponding `undo tweak`, so users are able to remove the newly added tweaks if necessary, and comprehensive documentation is required for all code changes. Document your changes and briefly explain why you made your changes in your Pull Request Description. Failure to adhere to this format may result in the denial of the pull request. Additionally, any code lacking sufficient documentation may also be denied.
* By following these guidelines, we can maintain a high standard of quality and ensure that the codebase remains organized and well-documented.
> [!NOTE]
> When creating a function, please include "WPF" or "WinUtil" in the file name so it can be loaded into the runspace.
!!! note
When creating a function, please include "WPF" or "WinUtil" in the file name so it can be loaded into the runspace.
## Walk through
* This is a guide for beginners. If you are still having issues, look at the following official GitHub documentation:
* [Commit through WEB](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits)
* [Commit through GitHub Desktop](https://docs.github.com/en/desktop/making-changes-in-a-branch/committing-and-reviewing-changes-to-your-project-in-github-desktop#about-commits)
* [Create a Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)
### Overview
``` mermaid
graph LR
  A[Fork Project] --> B[Clone Repository];
  B --> C[Create New Branch];
  C --> D[Make Changes];
  D --> G[Test Changes];
  G --> H{Tests Passed?};
  H -->|Yes| E[Commit Changes];
  E --> F[Push Branch];
  H -->|No| J[Fix Issues];
  F --> K[Create Pull Request];
  K --> L[Fill out PR template];
  J --> G;
```
!!! info
This is a diagram to guide you through the process. It may vary depending on the type of change you're making.
### Fork the Repo
* Fork the WinUtil Repository [here](https://github.com/ChrisTitusTech/winutil) to create a copy that will be available in your Repository-list.
![Fork](assets/ForkButton.png)
* Fork the WinUtil Repository [here](https://github.com/ChrisTitusTech/winutil) to create a copy that will be available in your repository list.
![Fork Image](assets/Fork-Button-Dark.png#only-dark)
![FOrk Image](assets/Fork-Button-Light.png#only-light)
### Clone the Fork
* While you can make your changes directly through the Web, we recommend cloning the repo to your device to test your fork easily.
* Using the application GitHub Desktop (available in WinUtil) you can easily manage your repos locally. You can do it using other tools like git-cli (available in WinUtil), we recommend GitHub Desktop for ease of use.
* Install GitHub Desktop if not already installed
* Log in using the same GitHub account u used to fork WinUtil
* Choose the fork under "Your Repositories" and press "clone {repo name}"
* Create a new Branch and name it something relatable to your changes,
!!! tip
* Now you can modify WinUtil to your liking using your prefered text editor.
While you can make your changes directly through the Web, we recommend cloning the repo to your device using the application GitHub Desktop (available in WinUtil) to test your fork easily.
* Install GitHub Desktop if it is not already installed.
* Log in using the same GitHub account you used to fork WinUtil.
* Choose the fork under "Your Repositories" and press "clone {repo name}"
* Create a new branch and name it something relatable to your changes.
* Now you can modify WinUtil to your liking using your preferred text editor.
### Testing your changes
* To test to see if your changes work as intended run following commands in a powershell teminal:
* To test to see if your changes work as intended run following commands in a powershell teminal as admin:
* Change the directory where you are running the commands to the forked project.
* `cd {path to the folder with the compile.ps1}`
* Run following command to compile and run Winutil
* Run the following command to compile and run WinUtil:
* `.\Compile.ps1 -run`
* After seeing that your changes work properly feel free to commit the changes to the repository and make a PR, for help on that follow the documentation below.
* ![Compile](assets/Compile.png)
* After seeing that your changes work properly, feel free to commit the changes to the repository and make a PR. For help on that, follow the documentation below.
### Commiting the changes
* Commit your changes once you are fine with the result
* Push the changes to "upload" them to your fork on github.com.
### Committing the changes
* Before committing your changes, please discard changes made to the `winutil.ps1` file, like the following:
- ![Push Commit Image](assets/Discard-GHD.png)
* Now, commit your changes once you are happy with the result.
![Commit Image](assets/Commit-GHD.png)
* Push the changes to upload them to your fork on github.com.
![Push Commit Image](assets/Push-Commit.png)
### Making a PR
* To make a PR on your repo under a new branch linking to the main branch a button will show and say Preview and Create pull request. Click that button and fill in all information that is provided on the template. Once all the information is filled in correctly check your PR to make sure there is not a WinUtil.ps1 file attached to the PR. Once everything is good make the PR and wait for Chris (The Maintainer) to accept or deny your PR. Once it is accepted in by Chris you will be able to see your changes in the /windev build.
* If you do not see your feature in the main /win build that is fine. As all new changes go into the /windev build to make sure everything is working ok before going fully public.
* Congrats you just submitted your first PR. Thank you so much for contributing to WinUtil.
* To make a PR on your repo under a new branch linking to the main branch, a button will show and say Preview and Create pull request. Click that button and fill in all the information that is provided on the template. Once all the information is filled in correctly, check your PR to make sure there is not a WinUtil.ps1 file attached to the PR. Once everything is good, make the PR and wait for Chris (the maintainer) to accept or deny your PR. Once it is accepted by Chris, you will be able to see your changes in the "/windev" build.
* If you do not see your feature in the main "/win" build, that is fine. All new changes go into the /windev build to make sure everything is working OK before going fully public.
* Congratulations! You just submitted your first PR. Thank you so much for contributing to WinUtil.

View File

@ -2,3 +2,6 @@
## How do I uninstall WinUtil?
* You do not have to uninstall WinUtil. As it is a script you run from Powershell it only loads into your RAM. This means as soon as you close WinUtil it will be deleted off your system.
## I applied a tweak and now something doesn't work, what do I do?
* If you applied a tweak and it breaks something, you can always revert the tweak by selecting the tweak and clicking "Undo Selected Tweaks".

View File

@ -1,12 +1,20 @@
# Welcome to Chris Titus WinUtil Official Documentation!
# Welcome to the WinUtil Documentation!
[![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ)](https://discord.gg/RUbZUZyByQ)
[![Version](https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge)](https://github.com/ChrisTitusTech/winutil/releases/latest)
![GitHub Downloads (specific asset, all releases)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge)
## Running
[![Discord Community Server](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ)](https://discord.gg/RUbZUZyByQ)
There are 4 ways to run WinUtil. The 4 ways goes as follows:
Welcome to the official documentation for WinUtil, your go-to utility for optimizing and managing your Windows environment. Whether youre an IT professional, power user, or regular user, WinUtil provides a comprehensive set of tools to enhance your Windows experience.
* `irm christitus.com/win | iex` - Runs WinUtil from ChrisTitus's website using the latest Full Releases.
* `irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1 | iex` - Runs WinUtil from github using the latest Full Release.
* `irm christitus.com/windev | iex` - Runs WinUtil from ChrisTitus website using the latest Pre-Release.
* `irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/windev.ps1 | iex` - Runs WinUtil from github using the latest Pre-Release.
## Running the latest release of WinUtil
* You will first need to start a Powershell terminal **as Admin**.
* Now you can run the following command:
```ps1
irm christitus.com/win | iex
```
!!! info
WinUtil is updated weekly as of the time of writing. Consequently, features and functionalities may evolve, and the documentation may not always reflect the most current images or information.

View File

@ -0,0 +1,13 @@
/* Custom styles for MkDocs Material */
body {
background-color: #c22525;
}
.md-nav__link {
color: #ff5722;
}
.md-typeset h1 {
font-size: 2.5em;
color: #3f51b5;
}

View File

@ -1,3 +0,0 @@
# Update Log
#

View File

@ -1,72 +1,121 @@
# User Guide
# Walkthrough
## Overview
* short one
## Install
---
=== "Installation & Updates"
* Choose the programs you want to install or upgrade.
* For programs not currently installed, this action will install them.
* For programs already installed, this action will update them to the latest version.
* Click the `Install/Upgrade Selected` button to start the installation or upgrade process.
=== "Upgrade All"
* Simply press the `Upgrade All` button.
* This will upgrade all applicable programs that are installed without the need for individual selection.
=== "Uninstall"
* Select the programs you wish to uninstall.
* Click the `Uninstall Selected` button to remove the selected programs.
=== "Get Installed"
* Click the `Get Installed` button.
* This will scan for and select all installed programs in WinUtil that WinGet supports.
=== "Clear Selection"
* Click the `Clear Selection` button.
* This will unselect all checked programs.
![Install Image](assets/Install-Tab-Dark.png#only-dark)
![Install Image](assets/Install-Tab-Light.png#only-light)
!!! tip
If you have trouble finding an application, press `ctrl + f` and search the name of it. Applications will filter depending on your input.
## Tweaks
---
![Tweaks Image](assets/Tweaks-Tab-Dark.png#only-dark)
![Tweaks Image](assets/Tweaks-Tab-Light.png#only-light)
### Run Tweaks
* **Open Tweaks Tab**: Navigate to the 'Tweaks' tab in the application.
* **Select Tweaks**: Choose the tweaks you want to apply. You can use the presets available at the top for convenience.
* **Run Tweaks**: After selecting the desired tweaks, click the 'Run Tweaks' button at the bottom of the screen.
### Undo Tweaks
* **Open Tweaks Tab**: Go to the 'Tweaks' tab located next to 'Install'.
* **Select Tweaks to Remove**: Choose the tweaks you want to disable or remove.
* **Undo Tweaks**: Click the 'Undo Selected Tweaks' button at the bottom of the screen to apply the changes.
### Essential Tweaks
Essential Tweaks are modifications and optimizations that are generally safe for most users to implement. These tweaks are designed to enhance system performance, improve privacy, and reduce unnecessary system activities. They are considered low-risk and are recommended for users who want to ensure their system runs smoothly and efficiently without delving too deeply into complex configurations. The goal of Essential Tweaks is to provide noticeable improvements with minimal risk, making them suitable for a wide range of users, including those who may not have advanced technical knowledge.
### Advanced Tweaks - CAUTION
Advanced Tweaks are intended for experienced users who have a solid understanding of their system and the potential implications of making deep-level changes. These tweaks involve more significant alterations to the operating system and can provide substantial customization. However, they also carry a higher risk of causing system instability or unintended side effects if not implemented correctly. Users who choose to apply Advanced Tweaks should proceed with caution, ensuring they have adequate knowledge and backups in place to recover if something goes wrong. These tweaks are not recommended for novice users or those unfamiliar with the inner workings of their operating system.
### O&O Shutup
## Walkthrough
[O&O ShutUp10++](https://www.oo-software.com/en/shutup10) can be launched from WinUtil with only one button click. It is a free privacy tool for Windows that lets users easily manage their privacy settings. It disables telemetry, controls updates, and manages app permissions to enhance security and privacy. The tool offers recommended settings for optimal privacy with just a few clicks.
### Program
#### Installation & Updates
* To install programs select the programs you wish to install or update like the picture below.
![Program Install](assets/ProgramInstall.png)
* Once you have selected the programs you wish to install click the select Install/Upgrade Selected button as seen below.
![Program Install Button](assets/ProgramInstallButton.png)
#### Upgrade All
* Press the button to upgrade all installed programs that are supported by WinGet, there is no selection needed.
#### Uninstall
* To uninstall programs select the programs you wish to uninstall like the picture below.
![Program Uninstall](assets/ProgramInstall.png)
* Once you have selected the programs you wish to uninstall click the select Uninstall Selected button as seen below.
![Program Uninstall Button](assets/ProgramUninstall.png)
#### Get Installed
* Checks for installed programs that are supported by WinGet and selects them in the Utility.
#### Clear Selection
* Clears ur current selection so no program is checked.
### Tweaks
#### Tweaks Addition
* To enable tweaks on your system select Tweaks at the top next to Install.
* Then you can select what tweaks you want adding to your system. We do have some presets you can select from at the top you can see this in the picture below.
![Tweaks Screen](assets/TweaksScreen.PNG)
* After you have chosen your tweaks click the Run Tweaks button at the bottom of the screen.
#### Tweaks Removal
* To disable tweaks on your system select Tweaks at the top next to Install.
* Then you can select what tweaks you want removing from your system.
* After you have chosen your tweaks you want to remove click the Undo Selected Tweaks button at the bottom of the screen.
#### Essential Tweaks
* The Tweaks under the Essential
#### Advanced Tweaks - CAUTION
#### O&O Shutup
#### DNS
#### Customize Preferences
#### Performance Plans
#### Shortcuts
<iframe width="640" height="360" src="https://www.youtube.com/embed/3HvNr8eMcv0" title="O&O ShutUp10++: For Windows 10 & 11, with Dark Mode" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
![Tweaks Screen](assets/TweaksScreen.PNG)
### DNS
### Config
The utility provides a convenient DNS selection feature, allowing users to choose between various DNS providers for both IPv4 and IPv6. This enables users to optimize their internet connection for speed, security, and privacy according to their specific needs. Here are the available options:
#### Features
* Install the most used Windows Features by checking the checkbox and clicking "Install Features" to install them
* **Default**: Uses the default DNS settings configured by your ISP or network.
* **DHCP**: Automatically acquires DNS settings from the DHCP server.
* [**Google**](https://developers.google.com/speed/public-dns?hl=de): A reliable and fast DNS service provided by Google.
* [**Cloudflare**](https://developers.cloudflare.com/1.1.1.1/): Known for speed and privacy, Cloudflare DNS is a popular choice for enhancing internet performance.
* [**Cloudflare_Malware**](https://developers.cloudflare.com/1.1.1.1/setup/#:~:text=Use%20the%20following%20DNS%20resolvers%20to%20block%20malicious%20content%3A): Provides additional protection by blocking malware sites.
* [**Cloudflare_Malware_Adult**](https://developers.cloudflare.com/1.1.1.1/setup/#:~:text=Use%20the%20following%20DNS%20resolvers%20to%20block%20malware%20and%20adult%20content%3A): Blocks both malware and adult content, offering more comprehensive filtering.
* [**Level3**](https://www.lumen.com/): Another fast and reliable DNS service option.
* [**Open_DNS**](https://www.opendns.com/setupguide/#familyshield): Offers customizable filtering and enhanced security features.
* [**Quad9**](https://quad9.net/): Focuses on security by blocking known malicious domains.
#### Fixes
* Quick Fixes for your system if you are having Issues.
### Customize Preferences
The Customize Preferences section allows users to personalize their Windows experience by toggling various visual and functional features. These preferences are designed to enhance usability and tailor the system to the users specific needs and preferences.
### Performance Plans
The Performance Plans section allows users to manage the Ultimate Performance Profile on their system. This feature is designed to optimize the system for maximum performance.
#### Add and activate the Ultimate Performance Profile:
* Enables and activates the Ultimate Performance Profile to enhance system performance by minimizing latency and increasing efficiency.
#### Remove Ultimate Performance Profile:
* Deactivates the Ultimate Performance Profile, changing the system to the Balanced Profile.
### Shortcuts
The utility includes a feature to easily create a desktop shortcut, providing quick access to the script.
## Config
---
### Features
* Install the most used **Windows Features** by checking the checkbox and clicking "Install Features" to install them.
* All .Net Frameworks (2, 3, 4)
* HyperV Virtualization
* Legacy Media (WMP, DirectPlay)
* NFS - Network File System
* Enable Search Box Web Suggestions in Registry (explorer restart)
* Disables Search Box Web Suggestions in Registry (explorer restart)
* Enable Daily Registry Backup Task 12:30am
* Enable Legacy F8 Boot Recovery
* Disable Legacy F8 Boot Recovery
* Windows Subsystem for Linux
* Windows Sandbox
### Fixes
* Quick fixes for your system if you are having issues.
* Set Up Autologin
* Reset Windows Update
@ -75,85 +124,137 @@
* WinGet Reinstall
* Remove Adobe Creative Cloud
#### Legacy Windows Panels
### Legacy Windows Panels
### Updates | Not working rn
Open old-school Windows panels directly from WinUtil. Following Panels are available:
### MicroWin
* Control Panel
* Network Connections
* Power Panel
* Region
* Sound Settings
* System Properties
* User Accounts
**MicroWin** lets you customize your Windows 10 and 11 installation images by debloating them however you want.
## Updates
---
![MicroWin](assets/MicroWinScreen.png)
The utility provides three distinct settings for managing Windows updates: Default (Out of Box) Settings, Security (Recommended) Settings, and Disable ALL Updates (NOT RECOMMENDED!). Each setting offers a different approach to handling updates, catering to various user needs and preferences.
### Default (Out of Box) Settings
- **Description**: This setting retains the default configurations that come with Windows, ensuring no modifications are made.
- **Functionality**: It will remove any custom Windows update settings previously applied.
- **Note**: If update errors persist, reset all updates in the configuration tab to restore all Microsoft Update Services to their default settings, reinstalling them from their servers.
### Security (Recommended) Settings
- **Description**: This is the recommended setting for all computers.
- **Update Schedule**:
- **Feature Updates**: Delays feature updates by 2 years to avoid potential bugs and instability.
- **Security Updates**: Installs security updates 4 days after their release to ensure system protection against pressing security flaws.
- **Rationale**:
- **Feature Updates**: Often introduce new features and bugs; delaying these updates minimizes the risk of system disruptions.
- **Security Updates**: Essential for patching critical security vulnerabilities. Delaying them by a few days allows for verification of stability and compatibility without leaving the system exposed for extended periods.
### Disable ALL Updates (NOT RECOMMENDED!)
- **Description**: This setting completely disables all Windows updates.
- **Suitability**: May be appropriate for systems used for specific purposes that do not require active internet browsing.
- **Warning**: Disabling updates significantly increases the risk of the system being hacked or infected due to the lack of security patches.
- **Note**: It is strongly advised against using this setting due to the heightened security risks.
!!! bug
The Updates tab is currently non-functional. We are actively working on a resolution to restore its functionality.
## MicroWin
---
* **MicroWin** lets you customize your Windows 10 and 11 installation images by debloating them however you want.
![Microwin](assets/Microwin-Dark.png#only-dark)
![Microwin](assets/Microwin-Light.png#only-light)
#### Basic usage
1. Specify the source Windows ISO to customize
1. Specify the source Windows ISO to customize.
* If you don't have a Windows ISO file prepared, you can download it using the Media Creation Tool for the respective Windows version. [Here](https://go.microsoft.com/fwlink/?linkid=2156295) is the Windows 11 version, and [here](https://go.microsoft.com/fwlink/?LinkId=2265055) is the Windows 10 version
2. Configure the debloat process
3. Specify the target location for the new ISO file
2. Configure the debloat process.
3. Specify the target location for the new ISO file.
4. Let the magic happen!
**NOTE:** this feature is still in development and you may encounter some issues with the generated images. If that happens, don't hesitate to report an issue!
!!! warning "Heads-up"
This feature is still in development, and you may encounter some issues with the generated images. If that happens, don't hesitate to report an issue!
#### Options
* **Download oscdimg.exe from CTT GitHub repo** will grab a OSCDIMG executable from the GitHub repository instead of a Chocolatey package
* **Download oscdimg.exe from the CTT GitHub repo** will grab an OSCDIMG executable from the GitHub repository instead of a Chocolatey package.
!!! info
OSCDIMG is the tool that lets the program create ISO images. Typically, you would find this in the [Windows Assessment and Deployment Kit](https://learn.microsoft.com/en-us/windows-hardware/get-started/adk-install)
* Selecting a scratch directory will copy the contents of the ISO file to the directory you specify instead of an automatically generated folder on the `%TEMP%` directory
* You can select an edition of Windows to debloat (**SKU**) using the convenient drop-down menu
* Selecting a scratch directory will copy the contents of the ISO file to the directory you specify instead of an automatically generated folder in the `%TEMP%` directory.
* You can select an edition of Windows to debloat (**SKU**) using the convenient drop-down menu.
By default, MicroWin will debloat the Pro edition, but you can choose any edition you want
    By default, MicroWin will debloat the Pro edition, but you can choose any edition you want.
##### Customization options
* **Keep Provisioned Packages**: leaving this option unticked (default) will try to remove every operating system package
* **Keep Provisioned Packages**: leaving this option unticked (default) will try to remove every operating system package.
Some packages may remain after processing. This can happen if the packages in question were permanent ones or had been superseded by newer versions
    Some packages may remain after processing. This can happen if the packages in question are permanent or have been superseded by newer versions.
* **Keep Appx Packages**: leaving this option unticked (default) will try to remove every Microsoft Store app from the Windows image
* **Keep Appx Packages**: leaving this option unticked (default) will try to remove every Microsoft Store app from the Windows image.
This option will exclude some applications that are essential in the case that you want or need to add a Store app later on
    This option will exclude some applications that are essential in the event that you want or need to add a Store app later on.
* **Keep Defender**: leaving this option unticked will try to remove every part of Windows Defender, including the Windows Security app
* **Keep Defender**: leaving this option unticked will try to remove every part of Windows Defender, including the Windows Security app.
Leaving this option unticked is **NOT recommended** unless you plan to use a third-party antivirus solution on your MicroWin installation. On that regard, don't install AVs with bad reputation or rogueware
    Leaving this option unticked is **NOT recommended** unless you plan to use a third-party antivirus solution on your MicroWin installation. In that regard, don't install AVs with bad reputations or rogueware.
* **Keep Edge**: leaving this option unticked will try to remove every part of the Microsoft Edge browser using the best methods available
* **Keep Edge**: leaving this option unticked will try to remove every part of the Microsoft Edge browser using the best methods available.
Leaving this option unticked is not recommended because it might break some applications that might depend on the `Edge WebView2` runtime. However, if that happens, you can easily [reinstall it](https://developer.microsoft.com/en-us/microsoft-edge/webview2)
    Leaving this option unticked is not recommended because it might break some applications that might depend on the `Edge WebView2` runtime. However, if that happens, you can easily [reinstall it](https://developer.microsoft.com/en-us/microsoft-edge/webview2)
##### Driver integration options
* **Inject drivers** will add the drivers in the folder that you specify to the target Windows image
* **Import drivers from current system** will add every third-party driver that is present in your active installation
* **Inject drivers** will add the drivers in the folder that you specify to the target Windows image.
* **Import drivers from the current system** will add every third-party driver that is present in your active installation.
This makes the target image have the same hardware compatibility of the active installation. However, this means that you will only be able to install the target Windows image and take full advantage of it on computers with **the same hardware**. To avoid this, you'll need to customize the `install.wim` file of the target ISO in the `sources` folder
    This makes the target image have the same hardware compatibility as the active installation. However, this means that you will only be able to install the target Windows image and take full advantage of it on computers with **the same hardware**. To avoid this, you'll need to customize the `install.wim` file of the target ISO in the 'sources` folder.
##### Ventoy options
* **Copy to Ventoy** will copy the target ISO file to any USB drive with [Ventoy](https://ventoy.net/en/index.html) installed
!!! info
Ventoy is a solution that lets you boot to any ISO file stored in a drive. Think of it as having multiple bootable USBs in one. Do note though that your drive needs to have enough free space for the target ISO file
Ventoy is a solution that lets you boot to any ISO file stored on a drive. Think of it as having multiple bootable USBs in one. Do note, though, that your drive needs to have enough free space for the target ISO file.
## Automation
* 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
* 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
* On the Install Tab, click "Get Installed", this will get all installed apps **supported by Winutil** on the system
![GetInstalled](assets/Get-Installed.png)
* Click on the Settings cog in the upper right corner and chose Export, chose file file and location, this will export the setting file.
![SettingsExport](assets/Settings-Export.png)
* Copy this file to a USB or somewhere you can use after Windows installation.
* Use Microwin tab to create a custom Windows image.
* Install the Windows image.
* In the new Windows, Open PowerShell in the admin mode and run command to automatically apply tweaks and install apps from the config file.
* ``` iex "& { $(irm christitus.com/win) } -Config [path-to-your-config] -Run" ```
* On the Install Tab, click "Get Installed", this will get all installed apps **supported by Winutil** on the system.
![GetInstalled](assets/Get-Installed-Dark.png#only-dark)
![GetInstalled](assets/Get-Installed-Light.png#only-light)
* Click on the Settings cog in the upper right corner and choose Export. Choose file file and location; this will export the setting file.
![SettingsExport](assets/Settings-Export-Dark.png#only-dark)
![SettingsExport](assets/Settings-Export-Light.png#only-light)
* Copy this file to a USB or somewhere you can use it after Windows installation.
!!! tip
Use the Microwin tab to create a custom Windows image & install the Windows image.
* On any supported Windows machine, open PowerShell **as Admin** and run the following command to automatically apply tweaks and install apps from the config file.
```ps1
iex "& { $(irm christitus.com/win) } -Config [path-to-your-config] -Run"
```
* Have a cup of coffee! Come back when it's done.

View File

@ -1,217 +0,0 @@
function Get-TabXaml {
<#
.SYNOPSIS
Generates XAML for a tab in the WinUtil GUI
This function is used to generate the XAML for the applications tab in the WinUtil GUI
It takes the tabname and the number of columns to display the applications in as input and returns the XAML for the tab as output
.PARAMETER tabname
The name of the tab to generate XAML for
Note: the 'tabname' parameter must equal one of the json files found in $sync.configs variable
Otherwise, it'll throw an exception
.PARAMETER columncount
The number of columns to display the applications in, default is 0
.OUTPUTS
The XAML for the tab
.EXAMPLE
Get-TabXaml "applications" 3
#>
param(
[Parameter(Mandatory, position=0)]
[string]$tabname,
[Parameter(position=1)]
[ValidateRange(0,10)] # 10 panels as max number is more then enough
[int]$columncount = 0
)
# Validate tabname
if ($sync.configs.$tabname -eq $null) {
throw "Invalid parameter passed, can't find '$tabname' in '`$sync.configs' variable, please double check any calls to 'Get-TabXaml' function."
}
$organizedData = @{}
# Iterate through JSON data and organize by panel and category
foreach ($appName in $sync.configs.$tabname.PSObject.Properties.Name) {
$appInfo = $sync.configs.$tabname.$appName
# Create an object for the application
$appObject = [PSCustomObject]@{
Name = $appName
Category = $appInfo.Category
Content = $appInfo.Content
Choco = $appInfo.choco
Winget = $appInfo.winget
Panel = if ($columncount -gt 0 ) { "0" } else {$appInfo.panel}
Link = $appInfo.link
Description = $appInfo.description
# Type is (Checkbox,Toggle,Button,Combobox ) (Default is Checkbox)
Type = $appInfo.type
ComboItems = $appInfo.ComboItems
# Checked is the property to set startup checked status of checkbox (Default is false)
Checked = $appInfo.Checked
ButtonWidth = $appInfo.ButtonWidth
}
if (-not $organizedData.ContainsKey($appObject.panel)) {
$organizedData[$appObject.panel] = @{}
}
if (-not $organizedData[$appObject.panel].ContainsKey($appObject.Category)) {
$organizedData[$appObject.panel][$appObject.Category] = @{}
}
# Store application data in a sub-array under the category
# Add Order property to keep the original order of tweaks and features
$organizedData[$appObject.panel][$appInfo.Category]["$($appInfo.order)$appName"] = $appObject
}
# Same tab amount in last line of 'inputXML.xaml' file
# TODO: Get the base repeat (amount) of tabs from last line (or even lines)
# so it can dynamicly react to whatever is before this generated XML string.
# .. may be solve this even before calling this function, and pass the result as a parameter?
$tab_repeat = 7
$spaces_per_tab = 4 # The convenction used across the code base
$tab_as_spaces = $(" " * $spaces_per_tab)
$precal_indent = $($tab_as_spaces * $tab_repeat)
$precal_indent_p1 = $($tab_as_spaces * ($tab_repeat + 1))
$precal_indent_p2 = $($tab_as_spaces * ($tab_repeat + 2))
$precal_indent_m1 = $($tab_as_spaces * ($tab_repeat - 1))
$precal_indent_m2 = $($tab_as_spaces * ($tab_repeat - 2))
# Calculate the needed number of panels
$panelcount = 0
$paneltotal = $organizedData.Keys.Count
if ($columncount -gt 0) {
$appcount = $sync.configs.$tabname.PSObject.Properties.Name.count + $organizedData["0"].Keys.count
$maxcount = [Math]::Round( $appcount / $columncount + 0.5)
$paneltotal = $columncount
}
# add ColumnDefinitions to evenly draw colums
$blockXml = "<Grid.ColumnDefinitions>"
$blockXml += $("`r`n" + " " * ($spaces_per_tab * $tab_repeat) +
"<ColumnDefinition Width=""*""/>") * $paneltotal
$blockXml += $("`r`n" + " " * ($spaces_per_tab * ($tab_repeat - 1))) +
"</Grid.ColumnDefinitions>" + "`r`n"
# Iterate through 'organizedData' by panel, category, and application
$count = 0
foreach ($panel in ($organizedData.Keys | Sort-Object)) {
$blockXml += $precal_indent_m1 + "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">" + "`r`n"
$blockXml += $precal_indent + "<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">" + "`r`n"
$panelcount++
foreach ($category in ($organizedData[$panel].Keys | Sort-Object)) {
$count++
if ($columncount -gt 0) {
$panelcount2 = [Int](($count)/$maxcount-0.5)
if ($panelcount -eq $panelcount2 ) {
$blockXml += $precal_indent_p2 + "</StackPanel>" + "`r`n"
$blockXml += $precal_indent_p1 + "</Border>" + "`r`n"
$blockXml += $precal_indent_p1 + "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">" + "`r`n"
$blockXml += $precal_indent_p2 + "<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">" + "`r`n"
$panelcount++
}
}
# Dot-source the Get-WPFObjectName function
. .\functions\private\Get-WPFObjectName
$categorycontent = $($category -replace '^.__', '')
$categoryname = Get-WPFObjectName -type "Label" -name $categorycontent
$blockXml += $("`r`n" + " " * ($spaces_per_tab * $tab_repeat)) +
"<Label Name=""$categoryname"" Content=""$categorycontent""" + " " +
"FontSize=""{FontSizeHeading}"" FontFamily=""{HeaderFontFamily}""/>" + "`r`n" + "`r`n"
$sortedApps = $organizedData[$panel][$category].Keys | Sort-Object
foreach ($appName in $sortedApps) {
$count++
if ($columncount -gt 0) {
$panelcount2 = [Int](($count)/$maxcount-0.5)
# Verify the indentation actually works...
if ($panelcount -eq $panelcount2 ) {
$blockXml += $precal_indent_m1 +
"</StackPanel>" + "`r`n"
$blockXml += $precal_indent_m2 +
"</Border>" + "`r`n"
$blockXml += $precal_indent_m2 +
"<Border Grid.Row=""1"" Grid.Column=""$panelcount"">" + "`r`n"
$blockXml += $precal_indent_m1 +
"<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">" + "`r`n"
$panelcount++
}
}
$appInfo = $organizedData[$panel][$category][$appName]
switch ($appInfo.Type) {
"Toggle" {
$blockXml += $precal_indent_m1 +
"<DockPanel LastChildFill=""True"">" + "`r`n"
$blockXml += $precal_indent +
"<CheckBox Name=""$($appInfo.Name)"" Style=""{StaticResource ColorfulToggleSwitchStyle}"" Margin=""4,0""" + " " +
"HorizontalAlignment=""Right"" FontSize=""{FontSize}""/>" + "`r`n"
$blockXml += $precal_indent +
"<Label Content=""$($appInfo.Content)"" ToolTip=""$($appInfo.Description)""" + " " +
"HorizontalAlignment=""Left"" FontSize=""{FontSize}""/>" + "`r`n"
$blockXml += $precal_indent_m1 +
"</DockPanel>" + "`r`n"
}
"Combobox" {
$blockXml += $precal_indent_m1 +
"<StackPanel Orientation=""Horizontal"" Margin=""0,5,0,0"">" + "`r`n"
$blockXml += $precal_indent + "<Label Content=""$($appInfo.Content)"" HorizontalAlignment=""Left""" + " " +
"VerticalAlignment=""Center"" FontSize=""{FontSize}""/>" + "`r`n"
$blockXml += $precal_indent +
"<ComboBox Name=""$($appInfo.Name)"" Height=""32"" Width=""186"" HorizontalAlignment=""Left""" + " " +
"VerticalAlignment=""Center"" Margin=""5,5"" FontSize=""{FontSize}"">" + "`r`n"
$addfirst="IsSelected=""True"""
foreach ($comboitem in ($appInfo.ComboItems -split " ")) {
$blockXml += $precal_indent_p1 +
"<ComboBoxItem $addfirst Content=""$comboitem"" FontSize=""{FontSize}""/>" + "`r`n"
$addfirst=""
}
$blockXml += $precal_indent_p1 + "</ComboBox>" + "`r`n"
$blockXml += $precal_indent + "</StackPanel>" + "`r`n"
}
"Button" {
if ($appInfo.ButtonWidth -ne $null) {
$ButtonWidthStr = "Width=""$($appInfo.ButtonWidth)"""
}
$blockXml += $precal_indent +
"<Button Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)""" + " " +
"HorizontalAlignment=""Left"" Margin=""5"" Padding=""20,5"" $($ButtonWidthStr)/>" + "`r`n"
}
# else it is a checkbox
default {
$checkedStatus = If ($appInfo.Checked -eq $null) {""} Else {" IsChecked=""$($appInfo.Checked)"""}
if ($appInfo.Link -eq $null) {
$blockXml += $precal_indent +
"<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)""$($checkedStatus) Margin=""5,0""" + " " +
"ToolTip=""$($appInfo.Description)""/>" + "`r`n"
} else {
$blockXml += $precal_indent +
"<StackPanel Orientation=""Horizontal"">" + "`r`n"
$blockXml += $precal_indent_p1 +
"<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)""$($checkedStatus)" + " " +
"ToolTip=""$($appInfo.Description)"" Margin=""0,0,2,0""/>" + "`r`n"
$blockXml += $precal_indent_p1 +
"<TextBlock Name=""$($appInfo.Name)Link"" Style=""{StaticResource HoverTextBlockStyle}"" Text=""(?)""" + " " +
"ToolTip=""$($appInfo.Link)""/>" + "`r`n"
$blockXml += $precal_indent +
"</StackPanel>" + "`r`n"
}
}
}
}
}
$blockXml += $precal_indent_p1 + "</StackPanel>" + "`r`n"
$blockXml += $precal_indent + "</Border>" + "`r`n"
}
return ($blockXml)
}

View File

@ -154,4 +154,13 @@ Function Get-WinUtilToggleStatus {
return $true
}
}
if ($ToggleSwitch -eq "WPFToggleDetailedBSoD") {
$DetailedBSoD = (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl').DisplayParameters
if($DetailedBSoD -eq 0) {
return $false
}
else{
return $true
}
}
}

View File

@ -54,12 +54,18 @@ function Install-WinUtilProgramChoco {
}
if(($chocoInstallStatus -eq 0) -AND ($tryUpgrade -eq $false)){
Write-Host "$($Program.choco) installed successfully using Chocolatey."
$X++
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value ($x/$count) })
continue
} else {
Write-Host "Failed to install $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $installOutputFilePath)."
$X++
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) })
}
} catch {
Write-Host "Failed to install $($Program.choco) due to an error: $_"
$X++
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) })
}
}
@ -71,15 +77,20 @@ function Install-WinUtilProgramChoco {
$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."
$x++
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value ($x/$count) })
continue
} else {
Write-Host "Failed to uninstall $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $uninstallOutputFilePath)."
$x++
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) })
}
} catch {
Write-Host "Failed to uninstall $($Program.choco) due to an error: $_"
}
}
$x++
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) })
}
}
}
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed

View File

@ -1,103 +0,0 @@
Function Install-WinUtilProgramWinget {
<#
.SYNOPSIS
Manages the provided programs using Winget
.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.
The winget Return codes are documented here: https://github.com/microsoft/winget-cli/blob/master/doc/windows/package-manager/winget/returnCodes.md
#>
param(
[Parameter(Mandatory, Position=0)]
[PsCustomObject]$ProgramsToInstall,
[Parameter(Position=1)]
[String]$manage = "Installing"
)
$x = 0
$count = $ProgramsToInstall.Count
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
Write-Host "==========================================="
Write-Host "-- Configuring winget packages ---"
Write-Host "==========================================="
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"){
# 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.
# 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.
Write-Host "Starting install of $($Program.winget) with winget."
try {
$status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru -NoNewWindow).ExitCode
if($status -eq 0){
Write-Host "$($Program.winget) installed successfully."
continue
}
if ($status -eq -1978335189){
Write-Host "$($Program.winget) No applicable update found"
continue
}
Write-Host "Attempt with User scope"
$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){
Write-Host "$($Program.winget) 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 {
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 {
Write-Host "Failed to install $($Program.winget). With winget"
$failedPackages += $Program
}
}
if($manage -eq "Uninstalling"){
# Uninstall package via ID using winget directly.
try {
$status = $(Start-Process -FilePath "winget" -ArgumentList "uninstall --id $($Program.winget) --silent" -Wait -PassThru -NoNewWindow).ExitCode
if($status -ne 0){
Write-Host "Failed to uninstall $($Program.winget)."
} else {
Write-Host "$($Program.winget) uninstalled successfully."
$failedPackages += $Program
}
} catch {
Write-Host "Failed to uninstall $($Program.winget) due to an error: $_"
$failedPackages += $Program
}
}
$X++
}
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
return $failedPackages;
}

View File

@ -19,6 +19,7 @@ function Install-WinUtilWinget {
Write-Host "`nWinget is not Installed. Continuing with install.`r" -ForegroundColor Red
}
# Gets the computer's information
if ($null -eq $sync.ComputerInfo){
$ComputerInfo = Get-ComputerInfo -ErrorAction Stop
@ -63,4 +64,5 @@ function Install-WinUtilWinget {
throw [WingetFailedInstall]::new('Failed to install!')
}
}
}

View File

@ -38,6 +38,8 @@ function Remove-Features([switch] $dumpFeatures = $false, [switch] $keepDefender
Remove-Features -keepDefender:$false
#>
try
{
$featlist = (Get-WindowsOptionalFeature -Path $scratchDir).FeatureName
if ($dumpFeatures)
{
@ -64,10 +66,17 @@ function Remove-Features([switch] $dumpFeatures = $false, [switch] $keepDefender
}
Write-Progress -Activity "Removing features" -Status "Ready" -Completed
Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in <installation media>\Sources."
}
catch
{
Write-Host "Unable to get information about the features. MicroWin processing will continue, but features will not be processed"
}
}
function Remove-Packages
{
try
{
$pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName
$pkglist = $pkglist | Where-Object {
@ -122,6 +131,11 @@ function Remove-Packages
}
}
Write-Progress -Activity "Removing Apps" -Status "Ready" -Completed
}
catch
{
Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
}
}
function Remove-ProvisionedPackages([switch] $keepSecurity = $false)

View File

@ -0,0 +1,34 @@
Function Invoke-WinUtilDetailedBSoD {
<#
.SYNOPSIS
Enables/Disables Detailed BSoD
(Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl' -Name 'DisplayParameters').DisplayParameters
#>
Param($Enabled)
Try{
if ($Enabled -eq $false){
Write-Host "Enabling Detailed BSoD"
$value = 1
}
else {
Write-Host "Disabling Detailed BSoD"
$value =0
}
$Path = "HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl"
Set-ItemProperty -Path $Path -Name DisplayParameters -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

@ -10,6 +10,8 @@ function Invoke-WinUtilFeatureInstall {
$CheckBox
)
$x = 0
$CheckBox | ForEach-Object {
if($sync.configs.feature.$psitem.feature){
Foreach( $feature in $sync.configs.feature.$psitem.feature ){
@ -20,9 +22,11 @@ function Invoke-WinUtilFeatureInstall {
Catch{
if ($psitem.Exception.Message -like "*requires elevation*"){
Write-Warning "Unable to Install $feature due to permissions. Are you running as admin?"
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" })
}
else{
Write-Warning "Unable to Install $feature due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace
}
@ -40,14 +44,18 @@ function Invoke-WinUtilFeatureInstall {
Catch{
if ($psitem.Exception.Message -like "*requires elevation*"){
Write-Warning "Unable to Install $feature due to permissions. Are you running as admin?"
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" })
}
else{
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" })
Write-Warning "Unable to Install $feature due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace
}
}
}
}
$X++
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($x/$CheckBox.Count) })
}
}

View File

@ -0,0 +1,171 @@
Function Invoke-WinUtilWingetProgram {
<#
.SYNOPSIS
Runs the designated action on the provided programs using Winget
.PARAMETER Programs
A list of programs to process
.PARAMETER action
The action to perform on the programs, can be either 'Install' or 'Uninstall'
.NOTES
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-actionr/winget/returnCodes.md
#>
param(
[Parameter(Mandatory, Position=0)]
$Programs,
[Parameter(Mandatory, Position=1)]
[ValidateSet("Install", "Uninstall")]
[String]$Action
)
Function Invoke-Winget {
<#
.SYNOPSIS
Invokes the winget.exe with the provided arguments and return the exit code
.PARAMETER wingetId
The Id of the Program that Winget should Install/Uninstall
.PARAMETER scope
Determines the installation mode. Can be "user" or "machine" (For more info look at the winget documentation)
.PARAMETER credential
The PSCredential Object of the user that should be used to run winget
.NOTES
Invoke Winget uses the public variable $Action defined outside the function to determine if a Program should be installed or removed
#>
param (
[string]$wingetId,
[string]$scope = "",
[PScredential]$credential = $null
)
$commonArguments = "--id $wingetId --silent"
$arguments = if ($Action -eq "Install"){
"install $commonArguments --accept-source-agreements --accept-package-agreements $(if ($scope) {" --scope $scope"})"
}
else {
"uninstall $commonArguments"
}
$processParams = @{
FilePath = "winget"
ArgumentList = $arguments
Wait = $true
PassThru = $true
NoNewWindow = $true
}
if ($credential) {
$processParams.credential = $credential
}
return (Start-Process @processParams).ExitCode
}
Function Invoke-Install {
<#
.SYNOPSIS
Contains the Install Logic and return code handling from winget
.PARAMETER Program
The Winget ID of the Program that should be installed
#>
param (
[string]$Program
)
$status = Invoke-Winget -wingetId $Program
if ($status -eq 0) {
Write-Host "$($Program) installed successfully."
return $true
} elseif ($status -eq -1978335189) {
Write-Host "$($Program) No applicable update found"
return $true
}
Write-Host "Attempt installation of $($Program) with User scope"
$status = Invoke-Winget -wingetId $Program -scope "user"
if ($status -eq 0) {
Write-Host "$($Program) installed successfully with User scope."
return $true
} elseif ($status -eq -1978335189) {
Write-Host "$($Program) No applicable update found"
return $true
}
$userChoice = [System.Windows.MessageBox]::Show("Do you want to attempt $($Program) 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
$status = Invoke-Winget -wingetId $Program -credential $getcreds
if ($status -eq 0) {
Write-Host "$($Program) installed successfully with User prompt."
return $true
}
} else {
Write-Host "Skipping installation with specific user credentials."
}
Write-Host "Failed to install $($Program)."
return $false
}
Function Invoke-Uninstall {
<#
.SYNOPSIS
Contains the Uninstall Logic and return code handling from winget
.PARAMETER Program
The Winget ID of the Program that should be uninstalled
#>
param (
[psobject]$Program
)
try {
$status = Invoke-Winget -wingetId $Program
if ($status -eq 0) {
Write-Host "$($Program) uninstalled successfully."
return $true
} else {
Write-Host "Failed to uninstall $($Program)."
return $false
}
} catch {
Write-Host "Failed to uninstall $($Program) due to an error: $_"
return $false
}
}
$count = $Programs.Count
$failedPackages = @()
Write-Host "==========================================="
Write-Host "-- Configuring winget packages ---"
Write-Host "==========================================="
for ($i = 0; $i -lt $count; $i++) {
$Program = $Programs[$i]
$result = $false
Set-WinUtilProgressBar -label "$Action $($Program)" -percent ($i / $count * 100)
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($i / $count)})
$result = switch ($Action) {
"Install" {Invoke-Install -Program $Program}
"Uninstall" {Invoke-Uninstall -Program $Program}
default {throw "[Install-WinUtilProgramWinget] Invalid action: $Action"}
}
if (-not $result) {
$failedPackages += $Program
}
}
Set-WinUtilProgressBar -label "$($Action)ation done" -percent 100
return $failedPackages
}

View File

@ -0,0 +1,31 @@
function Set-WinUtilProgressbar{
<#
.SYNOPSIS
This function is used to Update the Progress Bar displayed in the winutil GUI.
It will be automatically hidden if the user clicks something and no process is running
.PARAMETER Label
The Text to be overlayed onto the Progress Bar
.PARAMETER PERCENT
The percentage of the Progress Bar that should be filled (0-100)
.PARAMETER Hide
If provided, the Progress Bar and the label will be hidden
#>
param(
[string]$Label,
[ValidateRange(0,100)]
[int]$Percent,
$Hide
)
if ($hide){
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Visibility = "Collapsed"})
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBar.Visibility = "Collapsed"})
}
else{
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Visibility = "Visible"})
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBar.Visibility = "Visible"})
}
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Content.Text = $label})
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Content.ToolTip = $label})
$sync.form.Dispatcher.Invoke([action]{ $sync.ProgressBar.Value = $percent})
}

View File

@ -0,0 +1,86 @@
function Set-WinUtilTaskbaritem {
<#
.SYNOPSIS
Modifies the Taskbaritem of the WPF Form
.PARAMETER value
Value can be between 0 and 1, 0 being no progress done yet and 1 being fully completed
Value does not affect item without setting the state to 'Normal', 'Error' or 'Paused'
Set-WinUtilTaskbaritem -value 0.5
.PARAMETER state
State can be 'None' > No progress, 'Indeterminate' > inf. loading gray, 'Normal' > Gray, 'Error' > Red, 'Paused' > Yellow
no value needed:
- Set-WinUtilTaskbaritem -state "None"
- Set-WinUtilTaskbaritem -state "Indeterminate"
value needed:
- Set-WinUtilTaskbaritem -state "Error"
- Set-WinUtilTaskbaritem -state "Normal"
- Set-WinUtilTaskbaritem -state "Paused"
.PARAMETER overlay
Overlay icon to display on the taskbar item, there are the presets 'None', 'logo' and 'checkmark' or you can specify a path/link to an image file.
CTT logo preset:
- Set-WinUtilTaskbaritem -overlay "logo"
Checkmark preset:
- Set-WinUtilTaskbaritem -overlay "checkmark"
Warning preset:
- Set-WinUtilTaskbaritem -overlay "warning"
No overlay:
- Set-WinUtilTaskbaritem -overlay "None"
Custom icon (needs to be supported by WPF):
- Set-WinUtilTaskbaritem -overlay "C:\path\to\icon.png"
.PARAMETER description
Description to display on the taskbar item preview
Set-WinUtilTaskbaritem -description "This is a description"
#>
param (
[string]$state,
[double]$value,
[string]$overlay,
[string]$description
)
if ($value) {
$sync["Form"].taskbarItemInfo.ProgressValue = $value
}
if ($state) {
switch ($state) {
'None' { $sync["Form"].taskbarItemInfo.ProgressState = "None" }
'Indeterminate' { $sync["Form"].taskbarItemInfo.ProgressState = "Indeterminate" }
'Normal' { $sync["Form"].taskbarItemInfo.ProgressState = "Normal" }
'Error' { $sync["Form"].taskbarItemInfo.ProgressState = "Error" }
'Paused' { $sync["Form"].taskbarItemInfo.ProgressState = "Paused" }
default { throw "[Set-WinUtilTaskbarItem] Invalid state" }
}
}
if ($overlay) {
switch ($overlay) {
'logo' {
$sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\cttlogo.png"
}
'checkmark' {
$sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\checkmark.png"
}
'warning' {
$sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\warning.png"
}
'None' {
$sync["Form"].taskbarItemInfo.Overlay = $null
}
default {
if (Test-Path $overlay) {
$sync["Form"].taskbarItemInfo.Overlay = $overlay
}
}
}
}
if ($description) {
$sync["Form"].taskbarItemInfo.Description = $description
}
}

View File

@ -14,6 +14,9 @@ function Invoke-WPFButton {
# Use this to get the name of the button
#[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info")
if (-not $sync.ProcessRunning){
Set-WinUtilProgressBar -label "" -percent 0 -hide $true
}
Switch -Wildcard ($Button){

View File

@ -16,12 +16,18 @@ function Invoke-WPFFeatureInstall {
Invoke-WPFRunspace -ArgumentList $Features -DebugPreference $DebugPreference -ScriptBlock {
param($Features, $DebugPreference)
$sync.ProcessRunning = $true
if ($Features.count -eq 1){
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
} else {
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value 0.01 -overlay "logo" })
}
Invoke-WinUtilFeatureInstall $Features
$sync.ProcessRunning = $false
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" })
Write-Host "==================================="
Write-Host "--- Features are Installed ---"
Write-Host "--- A Reboot may be required ---"

View File

@ -24,6 +24,7 @@ function Invoke-WPFGetInstalled {
param($checkbox, $DebugPreference)
$sync.ProcessRunning = $true
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" })
if($checkbox -eq "winget"){
Write-Host "Getting Installed Programs..."
@ -42,5 +43,6 @@ function Invoke-WPFGetInstalled {
Write-Host "Done..."
$sync.ProcessRunning = $false
$sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "None" })
}
}

View File

@ -16,6 +16,7 @@ function Invoke-WPFGetIso {
$sync.BusyText.Text="N Busy"
Write-Host " _ __ __ _ "
Write-Host " /\/\ (_) ___ _ __ ___ / / /\ \ \(_) _ __ "
Write-Host " / \ | | / __|| '__| / _ \ \ \/ \/ /| || '_ \ "
@ -88,6 +89,8 @@ function Invoke-WPFGetIso {
return
}
Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo"
# Detect the file size of the ISO and compare it with the free space of the system drive
$isoSize = (Get-Item -Path $filePath).Length
Write-Debug "Size of ISO file: $($isoSize) bytes"
@ -104,6 +107,7 @@ function Invoke-WPFGetIso {
{
# It's critical and we can't continue. Output an error
Write-Host "You don't have enough space for this operation. You need at least $([Math]::Round(($isoSize / ([Math]::Pow(1024, 2))) * 2, 2)) MB of free space to copy the ISO files to a temp directory and to be able to perform additional operations."
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
else
@ -122,6 +126,7 @@ function Invoke-WPFGetIso {
Write-Error "Failed to mount the image. Error: $($_.Exception.Message)"
Write-Error "This is NOT winutil's problem, your ISO might be corrupt, or there is a problem on the system"
Write-Error "Please refer to this wiki for more details https://github.com/ChrisTitusTech/winutil/blob/main/wiki/Error-in-Winutil-MicroWin-during-ISO-mounting%2Cmd"
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
# storing off values in hidden fields for further steps
@ -199,6 +204,7 @@ function Invoke-WPFGetIso {
$msg = "Neither install.wim nor install.esd exist in the image, this could happen if you use unofficial Windows images. Please don't use shady images from the internet, use only official images. Here are instructions how to download ISO images if the Microsoft website is not showing the link to download and ISO. https://www.techrepublic.com/article/how-to-download-a-windows-10-iso-file-without-using-the-media-creation-tool/"
Write-Host $msg
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
throw
}
elseif ((-not (Test-Path -Path $wimFile -PathType Leaf)) -and (Test-Path -Path $wimFile.Replace(".wim", ".esd").Trim() -PathType Leaf))
@ -239,6 +245,7 @@ function Invoke-WPFGetIso {
$sync.BusyMessage.Visibility="Hidden"
$sync.ProcessRunning = $false
Set-WinUtilTaskbaritem -state "None" -overlay "checkmark"
}

View File

@ -20,17 +20,23 @@ function Invoke-WPFInstall {
return
}
Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
param($PackagesToInstall, $DebugPreference)
if ($PackagesToInstall.count -eq 1){
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
} else {
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value 0.01 -overlay "logo" })
}
$packagesWinget, $packagesChoco = {
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
$packagesWinget = [System.Collections.ArrayList]::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)
$null = $packagesWinget.add($($package.winget))
Write-Host "Queueing $($package.winget) for Winget install"
}
}
@ -42,7 +48,7 @@ function Invoke-WPFInstall {
$errorPackages = @()
if($packagesWinget.Count -gt 0){
Install-WinUtilWinget
$errorPackages += Install-WinUtilProgramWinget -ProgramsToInstall $packagesWinget
$errorPackages += Invoke-WinUtilWingetProgram -Action Install -Programs $packagesWinget
$errorPackages| ForEach-Object {if($_.choco -ne "na") {$packagesChoco += $_}}
}
if($packagesChoco.Count -gt 0){
@ -52,13 +58,14 @@ function Invoke-WPFInstall {
Write-Host "==========================================="
Write-Host "-- Installs have finished ---"
Write-Host "==========================================="
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" })
}
Catch {
Write-Host "==========================================="
Write-Host "Error: $_"
Write-Host "==========================================="
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -overlay "warning" })
}
Start-Sleep -Seconds 5
$sync.ProcessRunning = $False
}
}

View File

@ -15,6 +15,8 @@ function Invoke-WPFInstallUpgrade {
return
}
# Set-WinUtilTaskbaritem -state "Indeterminate"
Update-WinUtilProgramWinget
Write-Host "==========================================="

View File

@ -4,6 +4,7 @@ function Invoke-WPFMicrowin {
Invoke MicroWin routines...
#>
if($sync.ProcessRunning) {
$msg = "GetIso process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
@ -39,9 +40,12 @@ public class PowerManagement {
if ($SaveDialog.FileName -eq "") {
Write-Host "No file name for the target image was specified"
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo"
Write-Host "Target ISO location: $($SaveDialog.FileName)"
$index = $sync.MicrowinWindowsFlavors.SelectedValue.Split(":")[0].Trim()
@ -74,6 +78,7 @@ public class PowerManagement {
$msg = "The export process has failed and MicroWin processing cannot continue"
Write-Host "Failed to export the image"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
}
@ -87,6 +92,7 @@ public class PowerManagement {
$dlg_msg = $msg + "`n`nIf you want more information, the version of the image selected is $($imgVersion)`n`nIf an image has been incorrectly marked as incompatible, report an issue to the developers."
Write-Host $msg
[System.Windows.MessageBox]::Show($dlg_msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Exclamation)
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
@ -95,6 +101,7 @@ public class PowerManagement {
if (-not $mountDirExists -or -not $scratchDirExists)
{
Write-Error "Required directories '$mountDirExists' '$scratchDirExists' and do not exist."
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
@ -109,6 +116,7 @@ public class PowerManagement {
else
{
Write-Host "Could not mount image. Exiting..."
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
@ -378,6 +386,7 @@ public class PowerManagement {
if (-not (Test-Path -Path "$mountDir\sources\install.wim"))
{
Write-Error "Something went wrong and '$mountDir\sources\install.wim' doesn't exist. Please report this bug to the devs"
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
return
}
Write-Host "Windows image completed. Continuing with boot.wim."
@ -444,22 +453,16 @@ public class PowerManagement {
}
Write-Host "[INFO] Using oscdimg.exe from: $oscdimgPath"
#& oscdimg.exe -m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir $env:temp\microwin.iso
#Start-Process -FilePath $oscdimgPath -ArgumentList "-m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir $env:temp\microwin.iso" -NoNewWindow -Wait
#Start-Process -FilePath $oscdimgPath -ArgumentList '-m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir `"$($SaveDialog.FileName)`"' -NoNewWindow -Wait
$oscdimgProc = New-Object System.Diagnostics.Process
$oscdimgProc.StartInfo.FileName = $oscdimgPath
$oscdimgProc.StartInfo.Arguments = "-m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir `"$($SaveDialog.FileName)`""
$oscdimgProc.StartInfo.CreateNoWindow = $True
$oscdimgProc.StartInfo.WindowStyle = "Hidden"
$oscdimgProc.StartInfo.UseShellExecute = $False
$oscdimgProc.Start()
$oscdimgProc.WaitForExit()
$oscdimgProc = Start-Process -FilePath "$oscdimgPath" -ArgumentList "-m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin `"$mountDir`" `"$($SaveDialog.FileName)`"" -Wait -PassThru -NoNewWindow
$LASTEXITCODE = $oscdimgProc.ExitCode
Write-Host "OSCDIMG Error Level : $($oscdimgProc.ExitCode)"
if ($copyToUSB)
{
Write-Host "Copying target ISO to the USB drive"
#Copy-ToUSB("$env:temp\microwin.iso")
Copy-ToUSB("$($SaveDialog.FileName)")
if ($?) { Write-Host "Done Copying target ISO to USB drive!" } else { Write-Host "ISO copy failed." }
}
@ -476,12 +479,23 @@ public class PowerManagement {
Write-Host "`n`nPerforming Cleanup..."
Remove-Item -Recurse -Force "$($scratchDir)"
Remove-Item -Recurse -Force "$($mountDir)"
#$msg = "Done. ISO image is located here: $env:temp\microwin.iso"
$msg = "Done. ISO image is located here: $($SaveDialog.FileName)"
Write-Host $msg
Set-WinUtilTaskbaritem -state "None" -overlay "checkmark"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
} else {
Write-Host "ISO creation failed. The "$($mountDir)" directory has not been removed."
try
{
# This creates a new Win32 exception from which we can extract a message in the system language.
# Now, this will NOT throw an exception
$exitCode = New-Object System.ComponentModel.Win32Exception($LASTEXITCODE)
Write-Host "Reason: $($exitCode.Message)"
}
catch
{
# Could not get error description from Windows APIs
}
}
$sync.MicrowinOptionsPanel.Visibility = 'Collapsed'

View File

@ -17,8 +17,8 @@ function Invoke-WPFShortcut {
[bool]$RunAsAdmin = $false
)
# add an a Custom Icon if it's available at "$env:TEMP\cttlogo.png", else don't add a Custom Icon.
$iconPath = $null
# Preper the Shortcut Fields and add an a Custom Icon if it's available, else don't add a Custom Icon.
Switch ($ShortcutToAdd) {
"WinUtil" {
# Use Powershell 7 if installed and fallback to PS5 if not
@ -29,16 +29,10 @@ function Invoke-WPFShortcut {
$shell = "powershell.exe"
}
$shellArgs = "-ExecutionPolicy Bypass -Command `"Start-Process $shell -verb runas -ArgumentList `'-Command `"irm https://christitus.com/win | iex`"`'"
$shellArgs = "-ExecutionPolicy Bypass -Command `"Start-Process $shell -verb runas -ArgumentList `'-Command `"irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1 | iex`"`'"
$DestinationName = "WinUtil.lnk"
Invoke-WebRequest -Uri "https://christitus.com/images/logo-full.png" -OutFile "$env:TEMP\cttlogo.png"
if (Test-Path -Path "$env:TEMP\cttlogo.png") {
$iconPath = "$env:LOCALAPPDATA\winutil\cttlogo.ico"
ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath $iconPath
}
}
}
@ -58,10 +52,10 @@ function Invoke-WPFShortcut {
# Prepare the Shortcut paramter
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($FileBrowser.FileName)
$Shortcut.TargetPath = $shell
$Shortcut.Arguments = $shellArgs
if ($null -ne $iconPath) {
$shortcut.IconLocation = $iconPath
$Shortcut.TargetPath = $SourceExe
$Shortcut.Arguments = $ArgumentsToSourceExe
if (Test-Path -Path $winutildir["logo.ico"]) {
$shortcut.IconLocation = $winutildir["logo.ico"]
}
# Save the Shortcut to disk

View File

@ -32,5 +32,6 @@ function Invoke-WPFToggle {
"WPFToggleTaskView" {Invoke-WinUtilTaskView $(Get-WinUtilToggleStatus WPFToggleTaskView)}
"WPFToggleHiddenFiles" {Invoke-WinUtilHiddenFiles $(Get-WinUtilToggleStatus WPFToggleHiddenFiles)}
"WPFToggleTaskbarAlignment" {Invoke-WinUtilTaskbarAlignment $(Get-WinUtilToggleStatus WPFToggleTaskbarAlignment)}
"WPFToggleDetailedBSoD" {Invoke-WinUtilDetailedBSoD $(Get-WinUtilToggleStatus WPFToggleDetailedBSoD)}
}
}

View File

@ -17,7 +17,7 @@ function Invoke-WPFTweakPS7{
Write-Host "Powershell 7 is already installed."
} else {
Write-Host "Installing Powershell 7..."
Install-WinUtilProgramWinget -ProgramsToInstall @(@{"winget"="Microsoft.PowerShell"})
Invoke-WinUtilWingetProgram -Action Install -Programs @("Microsoft.PowerShell")
}
$targetTerminalName = "PowerShell"
}

View File

@ -0,0 +1,317 @@
function Invoke-WPFUIElements {
<#
.SYNOPSIS
Adds UI elements to a specified Grid in the WinUtil GUI based on a JSON configuration.
.PARAMETER configVariable
The variable/link containing the JSON configuration.
.PARAMETER targetGridName
The name of the grid to which the UI elements should be added.
.PARAMETER columncount
The number of columns to be used in the Grid. If not provided, a default value is used based on the panel.
.EXAMPLE
$categoryPanelMap = @{
"Essential Tweaks" = 0
"Customize Preferences" = 1
}
Invoke-WPFUIElements -configVariable $sync.configs.applications -targetGridName "install" -columncount 5
#>
param(
[Parameter(Mandatory)]
[PSCustomObject]$configVariable,
[Parameter(Mandatory)]
[string]$targetGridName,
[Parameter(Mandatory)]
[int]$columncount
)
$theme = $sync.configs.themes.$ctttheme
# Convert PSCustomObject to Hashtable
$configHashtable = @{}
$configVariable.PSObject.Properties.Name | ForEach-Object {
$configHashtable[$_] = $configVariable.$_
}
$organizedData = @{}
# Iterate through JSON data and organize by panel and category
foreach ($entry in $configHashtable.Keys) {
$entryInfo = $configHashtable[$entry]
# Create an object for the application
$entryObject = [PSCustomObject]@{
Name = $entry
Order = $entryInfo.order
Category = $entryInfo.Category
Content = $entryInfo.Content
Choco = $entryInfo.choco
Winget = $entryInfo.winget
Panel = if ($entryInfo.Panel) { $entryInfo.Panel } else { "0" }
Link = $entryInfo.link
Description = $entryInfo.description
Type = $entryInfo.type
ComboItems = $entryInfo.ComboItems
Checked = $entryInfo.Checked
ButtonWidth = $entryInfo.ButtonWidth
}
if (-not $organizedData.ContainsKey($entryObject.Panel)) {
$organizedData[$entryObject.Panel] = @{}
}
if (-not $organizedData[$entryObject.Panel].ContainsKey($entryObject.Category)) {
$organizedData[$entryObject.Panel][$entryObject.Category] = @()
}
# Store application data in an array under the category
$organizedData[$entryObject.Panel][$entryObject.Category] += $entryObject
}
# Retrieve the main window and the target Grid by name
$window = $sync["Form"]
$targetGrid = $window.FindName($targetGridName)
# Clear existing ColumnDefinitions and Children
$targetGrid.ColumnDefinitions.Clear() | Out-Null
$targetGrid.Children.Clear() | Out-Null
# Add ColumnDefinitions to the target Grid
for ($i = 0; $i -lt $columncount; $i++) {
$colDef = New-Object Windows.Controls.ColumnDefinition
$colDef.Width = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Star)
$targetGrid.ColumnDefinitions.Add($colDef) | Out-Null
}
# Only apply the logic for distributing entries across columns if the targetGridName is "appspanel"
if ($targetGridName -eq "appspanel") {
$panelcount = 0
$entrycount = $configHashtable.Keys.Count + $organizedData["0"].Keys.Count
$maxcount = [Math]::Round($entrycount / $columncount + 0.5)
}
# Iterate through 'organizedData' by panel, category, and application
$count = 0
foreach ($panelKey in ($organizedData.Keys | Sort-Object)) {
# Create a Border for each column
$border = New-Object Windows.Controls.Border
$border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
[System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
$border.style = $window.FindResource("BorderStyle")
$targetGrid.Children.Add($border) | Out-Null
# Create a StackPanel inside the Border
$stackPanel = New-Object Windows.Controls.StackPanel
$stackPanel.Background = [Windows.Media.Brushes]::Transparent
$stackPanel.SnapsToDevicePixels = $true
$stackPanel.VerticalAlignment = "Stretch" # Ensure the stack panel stretches vertically
$border.Child = $stackPanel
$panelcount++
foreach ($category in ($organizedData[$panelKey].Keys | Sort-Object)) {
$count++
if ($targetGridName -eq "appspanel" -and $columncount -gt 0) {
$panelcount2 = [Int](($count) / $maxcount - 0.5)
if ($panelcount -eq $panelcount2) {
# Create a new Border for the new column
$border = New-Object Windows.Controls.Border
$border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
[System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
$border.style = $window.FindResource("BorderStyle")
$targetGrid.Children.Add($border) | Out-Null
# Create a new StackPanel inside the Border
$stackPanel = New-Object Windows.Controls.StackPanel
$stackPanel.Background = [Windows.Media.Brushes]::Transparent
$stackPanel.SnapsToDevicePixels = $true
$stackPanel.VerticalAlignment = "Stretch" # Ensure the stack panel stretches vertically
$border.Child = $stackPanel
$panelcount++
}
}
$label = New-Object Windows.Controls.Label
$label.Content = $category -replace ".*__"
$label.FontSize = $theme.FontSizeHeading
$label.FontFamily = $theme.HeaderFontFamily
$stackPanel.Children.Add($label) | Out-Null
$sync[$category] = $label
# Sort entries by Order and then by Name, but only display Name
$entries = $organizedData[$panelKey][$category] | Sort-Object Order, Name
foreach ($entryInfo in $entries) {
$count++
if ($targetGridName -eq "appspanel" -and $columncount -gt 0) {
$panelcount2 = [Int](($count) / $maxcount - 0.5)
if ($panelcount -eq $panelcount2) {
# Create a new Border for the new column
$border = New-Object Windows.Controls.Border
$border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
[System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
$border.style = $window.FindResource("BorderStyle")
$targetGrid.Children.Add($border) | Out-Null
# Create a new StackPanel inside the Border
$stackPanel = New-Object Windows.Controls.StackPanel
$stackPanel.Background = [Windows.Media.Brushes]::Transparent
$stackPanel.SnapsToDevicePixels = $true
$stackPanel.VerticalAlignment = "Stretch" # Ensure the stack panel stretches vertically
$border.Child = $stackPanel
$panelcount++
}
}
switch ($entryInfo.Type) {
"Toggle" {
$dockPanel = New-Object Windows.Controls.DockPanel
$checkBox = New-Object Windows.Controls.CheckBox
$checkBox.Name = $entryInfo.Name
$checkBox.HorizontalAlignment = "Right"
$dockPanel.Children.Add($checkBox) | Out-Null
$checkBox.Style = $window.FindResource("ColorfulToggleSwitchStyle")
$label = New-Object Windows.Controls.Label
$label.Content = $entryInfo.Content
$label.ToolTip = $entryInfo.Description
$label.HorizontalAlignment = "Left"
$label.FontSize = $theme.FontSize
$dockPanel.Children.Add($label) | Out-Null
$stackPanel.Children.Add($dockPanel) | Out-Null
$sync[$entryInfo.Name] = $checkBox
$sync[$entryInfo.Name].IsChecked = Get-WinUtilToggleStatus $sync[$entryInfo.Name].Name
$sync[$entryInfo.Name].Add_Click({
[System.Object]$Sender = $args[0]
Invoke-WPFToggle $Sender.name
})
}
"ToggleButton" {
$toggleButton = New-Object Windows.Controls.ToggleButton
$toggleButton.Name = $entryInfo.Name
$toggleButton.Name = "WPFTab" + ($stackPanel.Children.Count + 1) + "BT"
$toggleButton.HorizontalAlignment = "Left"
$toggleButton.Height = $theme.TabButtonHeight
$toggleButton.Width = $theme.TabButtonWidth
$toggleButton.Background = $theme.ButtonInstallBackgroundColor
$toggleButton.Foreground = [Windows.Media.Brushes]::White
$toggleButton.FontWeight = [Windows.FontWeights]::Bold
$textBlock = New-Object Windows.Controls.TextBlock
$textBlock.FontSize = $theme.TabButtonFontSize
$textBlock.Background = [Windows.Media.Brushes]::Transparent
$textBlock.Foreground = $theme.ButtonInstallForegroundColor
$underline = New-Object Windows.Documents.Underline
$underline.Inlines.Add($entryInfo.name -replace "(.).*", "`$1")
$run = New-Object Windows.Documents.Run
$run.Text = $entryInfo.name -replace "^.", ""
$textBlock.Inlines.Add($underline)
$textBlock.Inlines.Add($run)
$toggleButton.Content = $textBlock
$stackPanel.Children.Add($toggleButton) | Out-Null
$sync[$entryInfo.Name] = $toggleButton
}
"Combobox" {
$horizontalStackPanel = New-Object Windows.Controls.StackPanel
$horizontalStackPanel.Orientation = "Horizontal"
$horizontalStackPanel.Margin = "0,5,0,0"
$label = New-Object Windows.Controls.Label
$label.Content = $entryInfo.Content
$label.HorizontalAlignment = "Left"
$label.VerticalAlignment = "Center"
$label.FontSize = $theme.ButtonFontSize
$horizontalStackPanel.Children.Add($label) | Out-Null
$comboBox = New-Object Windows.Controls.ComboBox
$comboBox.Name = $entryInfo.Name
$comboBox.Height = $theme.ButtonHeight
$comboBox.Width = $theme.ButtonWidth
$comboBox.HorizontalAlignment = "Left"
$comboBox.VerticalAlignment = "Center"
$comboBox.Margin = "5,5"
foreach ($comboitem in ($entryInfo.ComboItems -split " ")) {
$comboBoxItem = New-Object Windows.Controls.ComboBoxItem
$comboBoxItem.Content = $comboitem
$comboBoxItem.FontSize = $theme.ButtonFontSize
$comboBox.Items.Add($comboBoxItem) | Out-Null
}
$horizontalStackPanel.Children.Add($comboBox) | Out-Null
$stackPanel.Children.Add($horizontalStackPanel) | Out-Null
$comboBox.SelectedIndex = 0
$sync[$entryInfo.Name] = $comboBox
}
"Button" {
$button = New-Object Windows.Controls.Button
$button.Name = $entryInfo.Name
$button.Content = $entryInfo.Content
$button.HorizontalAlignment = "Left"
$button.Margin = "5"
$button.Padding = "20,5"
$button.FontSize = $theme.ButtonFontSize
if ($entryInfo.ButtonWidth) {
$button.Width = $entryInfo.ButtonWidth
}
$stackPanel.Children.Add($button) | Out-Null
$sync[$entryInfo.Name] = $button
}
default {
$horizontalStackPanel = New-Object Windows.Controls.StackPanel
$horizontalStackPanel.Orientation = "Horizontal"
$checkBox = New-Object Windows.Controls.CheckBox
$checkBox.Name = $entryInfo.Name
$checkBox.Content = $entryInfo.Content
$checkBox.FontSize = $theme.FontSize
$checkBox.ToolTip = $entryInfo.Description
$checkBox.Margin = $theme.CheckBoxMargin
if ($entryInfo.Checked) {
$checkBox.IsChecked = $entryInfo.Checked
}
$horizontalStackPanel.Children.Add($checkBox) | Out-Null
if ($entryInfo.Link) {
$textBlock = New-Object Windows.Controls.TextBlock
$textBlock.Name = $checkBox.Name + "Link"
$textBlock.Text = "(?)"
$textBlock.ToolTip = $entryInfo.Link
$textBlock.Style = $window.FindResource("HoverTextBlockStyle")
# Add event handler for click to open link
$handler = [System.Windows.Input.MouseButtonEventHandler]{
param($sender, $e)
Start-Process $sender.ToolTip.ToString()
}
$textBlock.AddHandler([Windows.Controls.TextBlock]::MouseLeftButtonUpEvent, $handler)
$horizontalStackPanel.Children.Add($textBlock) | Out-Null
$sync[$textBlock.Name] = $textBlock
}
$stackPanel.Children.Add($horizontalStackPanel) | Out-Null
$sync[$entryInfo.Name] = $checkBox
}
}
}
}
}
}

View File

@ -29,8 +29,14 @@ function Invoke-WPFUnInstall {
if($confirm -eq "No"){return}
Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
param($PackagesToInstall, $DebugPreference)
if ($PackagesToInstall.count -eq 1){
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
} else {
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value 0.01 -overlay "logo" })
}
$packagesWinget, $packagesChoco = {
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
@ -39,7 +45,7 @@ function Invoke-WPFUnInstall {
$packagesChoco.add($package)
Write-Host "Queueing $($package.choco) for Chocolatey Uninstall"
} else {
$packagesWinget.add($package)
$packagesWinget.add($($package.winget))
Write-Host "Queueing $($package.winget) for Winget Uninstall"
}
}
@ -50,28 +56,24 @@ function Invoke-WPFUnInstall {
# Install all selected programs in new window
if($packagesWinget.Count -gt 0){
Install-WinUtilProgramWinget -ProgramsToInstall $packagesWinget -Manage "Uninstalling"
Invoke-WinUtilWingetProgram -Action Uninstall -Programs $packagesWinget
}
if($packagesChoco.Count -gt 0){
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco -Manage "Uninstalling"
}
$ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Uninstalls are Finished "
$Messageboxbody = ("Done")
$MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "==========================================="
Write-Host "-- Uninstalls have finished ---"
Write-Host "==========================================="
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" })
}
Catch {
Write-Host "==========================================="
Write-Host "Error: $_"
Write-Host "==========================================="
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -overlay "warning" })
}
$sync.ProcessRunning = $False
}
}

View File

@ -30,15 +30,21 @@ function Invoke-WPFtweaksbutton {
$sync.ProcessRunning = $true
$cnt = 0
# Execute other selected tweaks
foreach ($tweak in $Tweaks) {
Write-Debug "This is a tweak to run $tweak count: $cnt"
Invoke-WinUtilTweaks $tweak
$cnt += 1
if ($Tweaks.count -eq 1){
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
} else {
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value 0.01 -overlay "logo" })
}
# Execute other selected tweaks
for ($i = 0; $i -lt $Tweaks.Count; $i++){
Set-WinUtilProgressBar -Label "Applying $($tweaks[$i])" -Percent ($i / $Tweaks.Count * 100)
Invoke-WinUtilTweaks $tweaks[$i]
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($i/$Tweaks.Count) })
}
Set-WinUtilProgressBar -Label "Tweaks finished" -Percent 100
$sync.ProcessRunning = $false
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" })
Write-Host "================================="
Write-Host "-- Tweaks are Finished ---"
Write-Host "================================="

View File

@ -12,7 +12,7 @@ function Invoke-WPFundoall {
return
}
$Tweaks = (Get-WinUtilCheckBoxes)["WPFTweaks"]
$tweaks = (Get-WinUtilCheckBoxes)["WPFtweaks"]
if ($tweaks.count -eq 0){
$msg = "Please check the tweaks you wish to undo."
@ -20,177 +20,29 @@ function Invoke-WPFundoall {
return
}
Invoke-WPFRunspace -ArgumentList $Tweaks -DebugPreference $DebugPreference -ScriptBlock {
param($Tweaks, $DebugPreference)
Invoke-WPFRunspace -ArgumentList $tweaks -DebugPreference $DebugPreference -ScriptBlock {
param($tweaks, $DebugPreference)
$sync.ProcessRunning = $true
Foreach ($tweak in $tweaks){
Invoke-WinUtilTweaks $tweak -undo $true
if ($tweaks.count -eq 1){
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
} else {
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value 0.01 -overlay "logo" })
}
for ($i = 0; $i -lt $tweaks.Count; $i++){
Set-WinUtilProgressBar -Label "Undoing $($tweaks[$i])" -Percent ($i / $tweaks.Count * 100)
Invoke-WinUtiltweaks $tweaks[$i] -undo $true
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($i/$tweaks.Count) })
}
Set-WinUtilProgressBar -Label "Undo Tweaks Finished" -Percent 100
$sync.ProcessRunning = $false
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" })
Write-Host "=================================="
Write-Host "--- Undo Tweaks are Finished ---"
Write-Host "=================================="
$ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Tweaks are Finished "
$Messageboxbody = ("Done")
$MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
}
<#
Write-Host "Creating Restore Point in case something bad happens"
Enable-ComputerRestore -Drive "$env:SystemDrive"
Checkpoint-Computer -Description "RestorePoint1" -RestorePointType "MODIFY_SETTINGS"
Write-Host "Enabling Telemetry..."
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection" -Name "AllowTelemetry" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" -Name "AllowTelemetry" -Type DWord -Value 1
Write-Host "Enabling Wi-Fi Sense"
Set-ItemProperty -Path "HKLM:\Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting" -Name "Value" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots" -Name "Value" -Type DWord -Value 1
Write-Host "Enabling Application suggestions..."
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "ContentDeliveryAllowed" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "OemPreInstalledAppsEnabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "PreInstalledAppsEnabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "PreInstalledAppsEverEnabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SilentInstalledAppsEnabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338387Enabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338388Enabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338389Enabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-353698Enabled" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SystemPaneSuggestionsEnabled" -Type DWord -Value 1
If (Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent") {
Remove-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Recurse -ErrorAction SilentlyContinue
}
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Name "DisableWindowsConsumerFeatures" -Type DWord -Value 0
Write-Host "Enabling Activity History..."
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "EnableActivityFeed" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "PublishUserActivities" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "UploadUserActivities" -Type DWord -Value 1
Write-Host "Enable Location Tracking..."
If (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location") {
Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Recurse -ErrorAction SilentlyContinue
}
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Name "Value" -Type String -Value "Allow"
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}" -Name "SensorPermissionState" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\lfsvc\Service\Configuration" -Name "Status" -Type DWord -Value 1
Write-Host "Enabling automatic Maps updates..."
Set-ItemProperty -Path "HKLM:\SYSTEM\Maps" -Name "AutoUpdateEnabled" -Type DWord -Value 1
Write-Host "Enabling Feedback..."
If (Test-Path "HKCU:\SOFTWARE\Microsoft\Siuf\Rules") {
Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Siuf\Rules" -Recurse -ErrorAction SilentlyContinue
}
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Siuf\Rules" -Name "NumberOfSIUFInPeriod" -Type DWord -Value 0
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" -Name "DoNotShowFeedbackNotifications" -Type DWord -Value 0
Write-Host "Enabling Tailored Experiences..."
If (Test-Path "HKCU:\SOFTWARE\Policies\Microsoft\Windows\CloudContent") {
Remove-Item -Path "HKCU:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Recurse -ErrorAction SilentlyContinue
}
Set-ItemProperty -Path "HKCU:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Name "DisableTailoredExperiencesWithDiagnosticData" -Type DWord -Value 0
Write-Host "Disabling Advertising ID..."
If (Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AdvertisingInfo") {
Remove-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AdvertisingInfo" -Recurse -ErrorAction SilentlyContinue
}
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AdvertisingInfo" -Name "DisabledByGroupPolicy" -Type DWord -Value 0
Write-Host "Allow Error reporting..."
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting" -Name "Disabled" -Type DWord -Value 0
Write-Host "Allowing Diagnostics Tracking Service..."
Stop-Service "DiagTrack" -WarningAction SilentlyContinue
Set-Service "DiagTrack" -StartupType Manual
Write-Host "Allowing WAP Push Service..."
Stop-Service "dmwappushservice" -WarningAction SilentlyContinue
Set-Service "dmwappushservice" -StartupType Manual
Write-Host "Allowing Home Groups services..."
Stop-Service "HomeGroupListener" -WarningAction SilentlyContinue
Set-Service "HomeGroupListener" -StartupType Manual
Stop-Service "HomeGroupProvider" -WarningAction SilentlyContinue
Set-Service "HomeGroupProvider" -StartupType Manual
Write-Host "Enabling Storage Sense..."
New-Item -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy" | Out-Null
Write-Host "Allowing Superfetch service..."
Stop-Service "SysMain" -WarningAction SilentlyContinue
Set-Service "SysMain" -StartupType Manual
Write-Host "Setting BIOS time to Local Time instead of UTC..."
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" -Name "RealTimeIsUniversal" -Type DWord -Value 0
Write-Host "Enabling Hibernation..."
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Session Manager\Power" -Name "HibernteEnabled" -Type Dword -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FlyoutMenuSettings" -Name "ShowHibernateOption" -Type Dword -Value 1
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" -Name "NoLockScreen" -ErrorAction SilentlyContinue
Write-Host "Hiding file operations details..."
If (Test-Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\OperationStatusManager") {
Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\OperationStatusManager" -Recurse -ErrorAction SilentlyContinue
}
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\OperationStatusManager" -Name "EnthusiastMode" -Type DWord -Value 0
Write-Host "Showing Task View button..."
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ShowTaskViewButton" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People" -Name "PeopleBand" -Type DWord -Value 1
Write-Host "Changing default Explorer view to Quick Access..."
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "LaunchTo" -Type DWord -Value 0
Write-Host "Unrestricting AutoLogger directory"
$autoLoggerDir = "$env:PROGRAMDATA\Microsoft\Diagnosis\ETLLogs\AutoLogger"
icacls $autoLoggerDir /grant:r SYSTEM:`(OI`)`(CI`)F | Out-Null
Write-Host "Enabling and starting Diagnostics Tracking Service"
Set-Service "DiagTrack" -StartupType Automatic
Start-Service "DiagTrack"
Write-Host "Hiding known file extensions"
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "HideFileExt" -Type DWord -Value 1
Write-Host "Reset Local Group Policies to Stock Defaults"
# cmd /c secedit /configure /cfg %windir%\inf\defltbase.inf /db defltbase.sdb /verbose
cmd /c RD /S /Q "%WinDir%\System32\GroupPolicyUsers"
cmd /c RD /S /Q "%WinDir%\System32\GroupPolicy"
cmd /c gpupdate /force
# Considered using Invoke-GPUpdate but requires module most people won't have installed
Write-Host "Adjusting visual effects for appearance..."
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "DragFullWindows" -Type String -Value 1
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "MenuShowDelay" -Type String -Value 400
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "UserPreferencesMask" -Type Binary -Value ([byte[]](158, 30, 7, 128, 18, 0, 0, 0))
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop\WindowMetrics" -Name "MinAnimate" -Type String -Value 1
Set-ItemProperty -Path "HKCU:\Control Panel\Keyboard" -Name "KeyboardDelay" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ListviewAlphaSelect" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ListviewShadow" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "TaskbarAnimations" -Type DWord -Value 1
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" -Name "VisualFXSetting" -Type DWord -Value 3
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\DWM" -Name "EnableAeroPeek" -Type DWord -Value 1
Remove-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "HungAppTimeout" -ErrorAction SilentlyContinue
Write-Host "Restoring Clipboard History..."
Remove-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Clipboard" -Name "EnableClipboardHistory" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "AllowClipboardHistory" -ErrorAction SilentlyContinue
Write-Host "Enabling Notifications and Action Center"
Remove-Item -Path HKCU:\SOFTWARE\Policies\Microsoft\Windows\Explorer -Force
Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\PushNotifications" -Name "ToastEnabled"
Write-Host "Restoring Default Right Click Menu Layout"
Remove-Item -Path "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" -Recurse -Confirm:$false -Force
Write-Host "Reset News and Interests"
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Feeds" -Name "EnableFeeds" -Type DWord -Value 1
# Remove "News and Interest" from taskbar
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Feeds" -Name "ShellFeedsTaskbarViewMode" -Type DWord -Value 0
Write-Host "Done - Reverted to Stock Settings"
Write-Host "Essential Undo Completed"
$ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Undo All"
$Messageboxbody = ("Done")
$MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "================================="
Write-Host "--- Undo All is Finished ---"
Write-Host "================================="
#>
}

View File

@ -5,7 +5,7 @@ nav:
- Introduction: 'index.md'
- User Guide: 'userguide.md'
- Contribute: 'contribute.md'
- Updates: 'updates.md'
- Changelog: 'changelog.md'
- Known Issues: 'KnownIssues.md'
- FAQ: 'faq.md'
@ -26,13 +26,22 @@ theme:
logo: assets/favicon.png
favicon: assets/favicon.png
palette:
# Palette toggle for automatic mode
- media: "(prefers-color-scheme)"
toggle:
icon: material/brightness-auto
name: Switch to light mode
# Palette toggle for light mode
- media: "(prefers-color-scheme: light)"
scheme: default
toggle:
icon: material/toggle-switch-off-outline
icon: material/brightness-7
name: Switch to dark mode
primary: black
accent: purple
# Palette toggle for dark mode
- media: "(prefers-color-scheme: dark)"
scheme: slate
toggle:
@ -40,5 +49,27 @@ theme:
name: Switch to light mode
primary: teal
accent: lime
markdown_extensions:
markdown_extensions:
- admonition
- pymdownx.details
- pymdownx.superfences
- pymdownx.superfences:
custom_fences:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format
- abbr
- attr_list
- pymdownx.snippets
- md_in_html
- pymdownx.superfences
- pymdownx.tabbed:
alternate_style: true
- pymdownx.highlight:
anchor_linenums: true
line_spans: __span
pygments_lang_class: true
- pymdownx.inlinehilite
- def_list
- pymdownx.tasklist:
custom_checkbox: true

View File

@ -1,12 +1,5 @@
{% extends "base.html" %}
{% block header %}
{{ super() }}
<div style="color: red; text-align: center; padding: 10px; font-size: 20px;">
<strong>Announcement:</strong> This documentation is still in progress.
</div>
{% endblock %}
{% block footer %}
{# Empty block to override the footer #}
{% endblock %}

View File

@ -83,6 +83,14 @@ try {
Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
}
# Load the configuration files
#Invoke-WPFUIElements -configVariable $sync.configs.nav -targetGridName "WPFMainGrid"
Invoke-WPFUIElements -configVariable $sync.configs.applications -targetGridName "appspanel" -columncount 5
Invoke-WPFUIElements -configVariable $sync.configs.tweaks -targetGridName "tweakspanel" -columncount 2
Invoke-WPFUIElements -configVariable $sync.configs.feature -targetGridName "featurespanel" -columncount 2
#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================
@ -91,16 +99,6 @@ $xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"]
$sync.keys | ForEach-Object {
if($sync.$psitem){
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "CheckBox" `
-and $sync["$psitem"].Name -like "WPFToggle*"){
$sync["$psitem"].IsChecked = Get-WinUtilToggleStatus $sync["$psitem"].Name
$sync["$psitem"].Add_Click({
[System.Object]$Sender = $args[0]
Invoke-WPFToggle $Sender.name
})
}
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "ToggleButton"){
$sync["$psitem"].Add_Click({
[System.Object]$Sender = $args[0]
@ -154,6 +152,10 @@ Invoke-WPFRunspace -ScriptBlock {
# Print the logo
Invoke-WPFFormVariables
# Progress bar in taskbaritem > Set-WinUtilProgressbar
$sync["Form"].TaskbarItemInfo = New-Object System.Windows.Shell.TaskbarItemInfo
Set-WinUtilTaskbaritem -state "None"
# Set the titlebar
$sync["Form"].title = $sync["Form"].title + " " + $sync.version
# Set the commands that will run when the form is closed
@ -288,38 +290,6 @@ Add-Type @"
}
}
# Using a TaskbarItem Overlay until someone figures out how to replace the icon correctly
# URL of the image
$imageUrl = "https://christitus.com/images/logo-full.png"
# Download the image
$imagePath = "$env:TEMP\logo-full.png"
Invoke-WebRequest -Uri $imageUrl -OutFile $imagePath
# Read the image file as a byte array
$imageBytes = [System.IO.File]::ReadAllBytes($imagePath)
# 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
[Window]::GetWindowRect($windowHandle, [ref]$rect)
$width = $rect.Right - $rect.Left
@ -402,7 +372,6 @@ $labels = @{}
$allCategories = $checkBoxes.Name | ForEach-Object {$sync.configs.applications.$_} | Select-Object -Unique -ExpandProperty category
$sync["SearchBar"].Add_TextChanged({
if ($sync.SearchBar.Text -ne "") {
$sync.SearchBarClearButton.Visibility = "Visible"
}
@ -429,33 +398,67 @@ $sync["SearchBar"].Add_TextChanged({
$CheckBox.Value.Visibility = "Visible"
$activeApplications += $sync.configs.applications.$checkboxName
# Set the corresponding text block visibility
if ($textBlock -ne $null) {
if ($textBlock -ne $null -and $textBlock -is [System.Windows.Controls.TextBlock]) {
$textBlock.Visibility = "Visible"
}
}
else {
$CheckBox.Value.Visibility = "Collapsed"
# Set the corresponding text block visibility
if ($textBlock -ne $null) {
if ($textBlock -ne $null -and $textBlock -is [System.Windows.Controls.TextBlock]) {
$textBlock.Visibility = "Collapsed"
}
}
}
$activeCategories = $activeApplications | Select-Object -ExpandProperty category -Unique
foreach ($category in $activeCategories){
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
$label.Visibility = "Visible"
foreach ($category in $activeCategories) {
$sync[$category].Visibility = "Visible"
}
if ($activeCategories){
if ($activeCategories) {
$inactiveCategories = Compare-Object -ReferenceObject $allCategories -DifferenceObject $activeCategories -PassThru
}
else{
} else {
$inactiveCategories = $allCategories
}
foreach ($category in $inactiveCategories){
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
$label.Visibility = "Collapsed"}
foreach ($category in $inactiveCategories) {
$sync[$category].Visibility = "Collapsed"}
})
# Initialize the hashtable
$winutildir = @{}
# Set the path for the winutil directory
$winutildir["path"] = "$env:LOCALAPPDATA\winutil\"
if (-NOT (Test-Path -Path $winutildir["path"])) {
New-Item -Path $winutildir["path"] -ItemType Directory
}
# Set the path for the logo and checkmark images
$winutildir["logo.png"] = $winutildir["path"] + "cttlogo.png"
$winutildir["logo.ico"] = $winutildir["path"] + "cttlogo.ico"
if (-NOT (Test-Path -Path $winutildir["logo.png"])) {
Invoke-WebRequest -Uri "https://christitus.com/images/logo-full.png" -OutFile $winutildir["logo.png"]
}
if (-NOT (Test-Path -Path $winutildir["logo.ico"])) {
ConvertTo-Icon -bitmapPath $winutildir["logo.png"] -iconPath $winutildir["logo.ico"]
}
$winutildir["checkmark.png"] = $winutildir["path"] + "checkmark.png"
$winutildir["warning.png"] = $winutildir["path"] + "warning.png"
if (-NOT (Test-Path -Path $winutildir["checkmark.png"])) {
Invoke-WebRequest -Uri "https://christitus.com/images/checkmark.png" -OutFile $winutildir["checkmark.png"]
}
if (-NOT (Test-Path -Path $winutildir["warning.png"])) {
Invoke-WebRequest -Uri "https://christitus.com/images/warning.png" -OutFile $winutildir["warning.png"]
}
Set-WinUtilTaskbaritem -overlay "logo"
$sync["Form"].Add_Activated({
Set-WinUtilTaskbaritem -overlay "logo"
})
# Define event handler for button click

File diff suppressed because it is too large Load Diff

View File

@ -502,7 +502,7 @@
</Style.Triggers>
</Style>
<Style TargetType="Border">
<Style x:Key="BorderStyle" TargetType="Border">
<Setter Property="Background" Value="{MainBackgroundColor}"/>
<Setter Property="BorderBrush" Value="{BorderColor}"/>
<Setter Property="BorderThickness" Value="1"/>
@ -632,6 +632,7 @@
</ToggleButton>
<Grid Background="{MainBackgroundColor}" ShowGridLines="False" Width="Auto" Height="Auto" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="50px"/>
<ColumnDefinition Width="50px"/>
@ -652,7 +653,7 @@
Height="{SearchBarHeight}"
FontSize="{SearchBarTextBoxFontSize}"
VerticalAlignment="Center" HorizontalAlignment="Left"
Margin="10,0,0,0" BorderThickness="1" Padding="22,2,2,2"
BorderThickness="1"
Name="SearchBar"
Foreground="{MainForegroundColor}" Background="{MainBackgroundColor}"
ToolTip="Press Ctrl-F and type app name to filter application list below. Press Esc to reset the filter">
@ -676,9 +677,38 @@
Style="{StaticResource SearchBarClearButtonStyle}"
Margin="193,0,0,0" Visibility="Collapsed"/>
<ProgressBar
Grid.Column="1"
Minimum="0"
Maximum="100"
Width="250"
Height="{SearchBarHeight}"
Foreground="{ProgressBarForegroundColor}" Background="{ProgressBarBackgroundColor}" BorderBrush="{ProgressBarForegroundColor}"
Visibility="Collapsed"
VerticalAlignment="Center" HorizontalAlignment="Left"
Margin="2,0,0,0" BorderThickness="1" Padding="6,2,2,2"
Name="ProgressBar">
</ProgressBar>
<Label
Grid.Column="1"
Width="250"
Height="{SearchBarHeight}"
VerticalAlignment="Center" HorizontalAlignment="Left"
FontSize="{SearchBarTextBoxFontSize}"
Background="Transparent"
Visibility="Collapsed"
Margin="2,0,0,0" BorderThickness="0" Padding="6,2,2,2"
Name="ProgressBarLabel">
<TextBlock
TextTrimming="CharacterEllipsis"
Background="Transparent"
Foreground="{ProgressBarTextColor}">
</TextBlock>
</Label>
<Button Name="SettingsButton"
Style="{StaticResource HoverButtonStyle}"
Grid.Column="1" BorderBrush="Transparent"
Grid.Column="2" BorderBrush="Transparent"
Background="{MainBackgroundColor}"
Foreground="{MainForegroundColor}"
FontSize="{SettingsIconFontSize}"
@ -687,7 +717,7 @@
Margin="0,5,5,0"
FontFamily="Segoe MDL2 Assets"
Content="&#xE713;"/>
<Popup Grid.Column="1" Name="SettingsPopup"
<Popup Grid.Column="2" Name="SettingsPopup"
IsOpen="False"
PlacementTarget="{Binding ElementName=SettingsButton}" Placement="Bottom"
HorizontalAlignment="Right" VerticalAlignment="Top">
@ -703,7 +733,7 @@
</Popup>
<Button
Grid.Column="2"
Grid.Column="3"
Content="&#xD7;" BorderThickness="0"
BorderBrush="Transparent"
Background="{MainBackgroundColor}"
@ -734,8 +764,7 @@
<ScrollViewer x:Name="scrollViewer" Grid.Row="1" Grid.Column="0" Padding="-1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
{{InstallPanel_applications}}
<Grid Name="appspanel" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
</Grid>
</ScrollViewer>
@ -744,14 +773,21 @@
</Grid>
</TabItem>
<TabItem Header="Tweaks" Visibility="Collapsed" Name="WPFTab2">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<Grid>
<!-- Main content area with a ScrollViewer -->
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="0">
<Grid Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="45px"/>
<RowDefinition Height=".70*"/>
<RowDefinition Height=".10*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
{{InstallPanel_tweaks}}
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="5">
<Label Content="Recommended Selections:" FontSize="{FontSize}" VerticalAlignment="Center" Margin="2"/>
<Button Name="WPFstandard" Content=" Standard " Margin="2"/>
@ -759,22 +795,41 @@
<Button Name="WPFclear" Content=" Clear " Margin="2"/>
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="2"/>
</StackPanel>
<Border Grid.ColumnSpan="2" Grid.Row="2" Grid.Column="0">
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Padding="10">
<Grid Name="tweakspanel" Grid.Row="1">
<!-- Your tweakspanel content goes here -->
</Grid>
<!-- TextBlock with note on the right half -->
<StackPanel Grid.Row="2" Orientation="Horizontal" Margin="5">
<TextBlock Padding="5">
Note: Hover over items to get a better description. Please be careful as many of these tweaks will heavily modify your system.
<LineBreak/>Recommended selections are for normal users and if you are unsure do NOT check anything else!
</TextBlock>
</StackPanel>
</Border>
</Grid>
</ScrollViewer>
<!-- Centered border with buttons and text -->
<Border Grid.Row="1" Background="{MainBackgroundColor}" BorderBrush="Gray" BorderThickness="1" CornerRadius="5" HorizontalAlignment="Stretch" Padding="10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<!-- Buttons on the left half -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0">
<Button Name="WPFApplyButton" Content="Apply" Margin="5"/>
<Button Name="WPFCancelButton" Content="Cancel" Margin="5"/>
</StackPanel>
</Grid>
</Border>
</Grid>
</TabItem>
<TabItem Header="Config" Visibility="Collapsed" Name="WPFTab3">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<Grid Background="Transparent">
{{InstallPanel_features}}
<Grid Name="featurespanel" Grid.Row="1" Background="Transparent">
</Grid>
</ScrollViewer>
</TabItem>