mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2025-07-01 02:22:34 -05:00
Compare commits
7 Commits
24.09.12
...
8b158df8c4
Author | SHA1 | Date | |
---|---|---|---|
8b158df8c4 | |||
494ad3c802 | |||
a4d1d0fd67 | |||
cb6898d835 | |||
5621b50762 | |||
b02294daf9 | |||
ae87100c61 |
128
.github/CODE_OF_CONDUCT.md
vendored
128
.github/CODE_OF_CONDUCT.md
vendored
@ -1,128 +0,0 @@
|
|||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
We as members, contributors, and leaders pledge to make participation in our
|
|
||||||
community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
||||||
identity and expression, level of experience, education, socio-economic status,
|
|
||||||
nationality, personal appearance, race, religion, or sexual identity
|
|
||||||
and orientation.
|
|
||||||
|
|
||||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
|
||||||
diverse, inclusive, and healthy community.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to a positive environment for our
|
|
||||||
community include:
|
|
||||||
|
|
||||||
* Demonstrating empathy and kindness toward other people
|
|
||||||
* Being respectful of differing opinions, viewpoints, and experiences
|
|
||||||
* Giving and gracefully accepting constructive feedback
|
|
||||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
|
||||||
and learning from the experience
|
|
||||||
* Focusing on what is best not just for us as individuals, but for the
|
|
||||||
overall community
|
|
||||||
|
|
||||||
Examples of unacceptable behavior include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery, and sexual attention or
|
|
||||||
advances of any kind
|
|
||||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or email
|
|
||||||
address, without their explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Enforcement Responsibilities
|
|
||||||
|
|
||||||
Community leaders are responsible for clarifying and enforcing our standards of
|
|
||||||
acceptable behavior and will take appropriate and fair corrective action in
|
|
||||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
||||||
or harmful.
|
|
||||||
|
|
||||||
Community leaders have the right and responsibility to remove, edit, or reject
|
|
||||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
|
||||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
|
||||||
decisions when appropriate.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies within all community spaces, and also applies when
|
|
||||||
an individual is officially representing the community in public spaces.
|
|
||||||
Examples of representing our community include using an official e-mail address,
|
|
||||||
posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported to the community leaders responsible for enforcement at
|
|
||||||
contact@christitus.com.
|
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the
|
|
||||||
reporter of any incident.
|
|
||||||
|
|
||||||
## Enforcement Guidelines
|
|
||||||
|
|
||||||
Community leaders will follow these Community Impact Guidelines in determining
|
|
||||||
the consequences for any action they deem in violation of this Code of Conduct:
|
|
||||||
|
|
||||||
### 1. Correction
|
|
||||||
|
|
||||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
|
||||||
unprofessional or unwelcome in the community.
|
|
||||||
|
|
||||||
**Consequence**: A private, written warning from community leaders, providing
|
|
||||||
clarity around the nature of the violation and an explanation of why the
|
|
||||||
behavior was inappropriate. A public apology may be requested.
|
|
||||||
|
|
||||||
### 2. Warning
|
|
||||||
|
|
||||||
**Community Impact**: A violation through a single incident or series
|
|
||||||
of actions.
|
|
||||||
|
|
||||||
**Consequence**: A warning with consequences for continued behavior. No
|
|
||||||
interaction with the people involved, including unsolicited interaction with
|
|
||||||
those enforcing the Code of Conduct, for a specified period of time. This
|
|
||||||
includes avoiding interactions in community spaces as well as external channels
|
|
||||||
like social media. Violating these terms may lead to a temporary or
|
|
||||||
permanent ban.
|
|
||||||
|
|
||||||
### 3. Temporary Ban
|
|
||||||
|
|
||||||
**Community Impact**: A serious violation of community standards, including
|
|
||||||
sustained inappropriate behavior.
|
|
||||||
|
|
||||||
**Consequence**: A temporary ban from any sort of interaction or public
|
|
||||||
communication with the community for a specified period of time. No public or
|
|
||||||
private interaction with the people involved, including unsolicited interaction
|
|
||||||
with those enforcing the Code of Conduct, is allowed during this period.
|
|
||||||
Violating these terms may lead to a permanent ban.
|
|
||||||
|
|
||||||
### 4. Permanent Ban
|
|
||||||
|
|
||||||
**Community Impact**: Demonstrating a pattern of violation of community
|
|
||||||
standards, including sustained inappropriate behavior, harassment of an
|
|
||||||
individual, or aggression toward or disparagement of classes of individuals.
|
|
||||||
|
|
||||||
**Consequence**: A permanent ban from any sort of public interaction within
|
|
||||||
the community.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
|
||||||
version 2.0, available at
|
|
||||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
|
||||||
|
|
||||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
|
||||||
enforcement ladder](https://github.com/mozilla/diversity).
|
|
||||||
|
|
||||||
[homepage]: https://www.contributor-covenant.org
|
|
||||||
|
|
||||||
For answers to common questions about this code of conduct, see the FAQ at
|
|
||||||
https://www.contributor-covenant.org/faq. Translations are available at
|
|
||||||
https://www.contributor-covenant.org/translations.
|
|
10
.github/ISSUE_TEMPLATE/bug_report.md
vendored
10
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -2,12 +2,12 @@
|
|||||||
name: Bug report
|
name: Bug report
|
||||||
about: Create a report to help us improve
|
about: Create a report to help us improve
|
||||||
title: ''
|
title: ''
|
||||||
labels: 'bug'
|
labels: ''
|
||||||
assignees: ''
|
assignees: ''
|
||||||
---
|
---
|
||||||
|
|
||||||
## Describe the bug
|
## Describe the bug
|
||||||
<!-- A clear and concise description of what the bug is. -->
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
## To Reproduce
|
## To Reproduce
|
||||||
Steps to reproduce the behavior:
|
Steps to reproduce the behavior:
|
||||||
@ -17,10 +17,10 @@ Steps to reproduce the behavior:
|
|||||||
4. See error
|
4. See error
|
||||||
|
|
||||||
## Expected behavior
|
## Expected behavior
|
||||||
<!-- A clear and concise description of what you expected to happen. -->
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
## Additional context
|
## Additional context
|
||||||
<!-- Add any other context about the problem here. -->
|
Add any other context about the problem here.
|
||||||
|
10
.github/ISSUE_TEMPLATE/feature_request.md
vendored
10
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -2,19 +2,19 @@
|
|||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest an idea for this project
|
about: Suggest an idea for this project
|
||||||
title: ''
|
title: ''
|
||||||
labels: 'enhancement'
|
labels: ''
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
**Is your feature request related to a problem? Please describe.**
|
||||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
**Describe the solution you'd like**
|
||||||
<!-- A clear and concise description of what you want to happen. -->
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
**Describe alternatives you've considered**
|
||||||
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
<!-- Add any other context or screenshots about the feature request here. -->
|
Add any other context or screenshots about the feature request here.
|
||||||
|
2
LICENSE → .github/LICENSE
vendored
2
LICENSE → .github/LICENSE
vendored
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2022 CT Tech Group LLC
|
Copyright (c) 2022 Chris Titus
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
15
.github/PULL_REQUEST_TEMPLATE.md
vendored
15
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,4 +1,7 @@
|
|||||||
<!--Before you make this PR have you followed the docs here? - https://christitustech.github.io/winutil/contribute/ -->
|
# Pull Request
|
||||||
|
|
||||||
|
## Title
|
||||||
|
[Provide a succinct and descriptive title for the pull request.]
|
||||||
|
|
||||||
## Type of Change
|
## Type of Change
|
||||||
- [ ] New feature
|
- [ ] New feature
|
||||||
@ -10,20 +13,20 @@
|
|||||||
- [ ] UI/UX improvement
|
- [ ] UI/UX improvement
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
<!--[Provide a detailed explanation of the changes you have made. Include the reasons behind these changes and any relevant context. Link any related issues.]-->
|
[Provide a detailed explanation of the changes you have made. Include the reasons behind these changes and any relevant context. Link any related issues.]
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
<!--[Detail the testing you have performed to ensure that these changes function as intended. Include information about any added tests.]-->
|
[Detail the testing you have performed to ensure that these changes function as intended. Include information about any added tests.]
|
||||||
|
|
||||||
## Impact
|
## Impact
|
||||||
<!--[Discuss the impact of your changes on the project. This might include effects on performance, new dependencies, or changes in behaviour.]-->
|
[Discuss the impact of your changes on the project. This might include effects on performance, new dependencies, or changes in behaviour.]
|
||||||
|
|
||||||
## Issue related to PR
|
## Issue related to PR
|
||||||
<!--[What issue/discussion is related to this PR (if any)]-->
|
[What issue/discussion is related to this PR (if any)]
|
||||||
- Resolves #
|
- Resolves #
|
||||||
|
|
||||||
## Additional Information
|
## Additional Information
|
||||||
<!--[Any additional information that reviewers should be aware of.]-->
|
[Any additional information that reviewers should be aware of.]
|
||||||
|
|
||||||
## Checklist
|
## Checklist
|
||||||
- [ ] My code adheres to the coding and style guidelines of the project.
|
- [ ] My code adheres to the coding and style guidelines of the project.
|
||||||
|
2
.github/SECURITY.md
vendored
2
.github/SECURITY.md
vendored
@ -1,5 +1,5 @@
|
|||||||
# Security Policy
|
# Security Policy
|
||||||
|
|
||||||
If you find a security issue please make post it in the issues tab. If you think it should be private you can email me at contact@christitus.com.
|
If you find a security issue please make post it in the issues tab. If you think it should be private you can email me at contact@christitus.com.
|
||||||
|
|
||||||
For immediate response check out our discord server @ [](https://discord.gg/RUbZUZyByQ)
|
For immediate response check out our discord server @ [](https://discord.gg/RUbZUZyByQ)
|
||||||
|
58
.github/release-drafter.yml
vendored
58
.github/release-drafter.yml
vendored
@ -1,58 +0,0 @@
|
|||||||
tag-prefix: ''
|
|
||||||
categories:
|
|
||||||
- title: '🚀 Features'
|
|
||||||
labels:
|
|
||||||
- 'feature'
|
|
||||||
- 'enhancement'
|
|
||||||
- title: '🐛 Bug Fixes'
|
|
||||||
labels:
|
|
||||||
- 'fix'
|
|
||||||
- 'bugfix'
|
|
||||||
- 'bug'
|
|
||||||
- title: '📚 Documentation'
|
|
||||||
label: 'documentation'
|
|
||||||
- title: '🔒 Security'
|
|
||||||
label: 'security'
|
|
||||||
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
|
|
||||||
template: |
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
$CHANGES
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
$CONTRIBUTORS
|
|
||||||
|
|
||||||
change-title-escapes: '\<*_&"'''
|
|
||||||
autolabeler:
|
|
||||||
- label: 'documentation'
|
|
||||||
files:
|
|
||||||
- '*.md'
|
|
||||||
branch:
|
|
||||||
- '/docs{0,1}\/.+/'
|
|
||||||
- label: 'bug'
|
|
||||||
branch:
|
|
||||||
- '/fix\/.+/'
|
|
||||||
title:
|
|
||||||
- '/fix/i'
|
|
||||||
- label: 'enhancement'
|
|
||||||
branch:
|
|
||||||
- '/feature\/.+/'
|
|
||||||
body:
|
|
||||||
- '/[A-Z]+-[0-9]+/'
|
|
||||||
- label: 'documentation'
|
|
||||||
files:
|
|
||||||
- '**/*.md'
|
|
||||||
- 'docs/**/*'
|
|
||||||
- label: 'security'
|
|
||||||
branch:
|
|
||||||
- '/security\/.+/'
|
|
||||||
replacers:
|
|
||||||
- search: /"/g
|
|
||||||
replace: ''
|
|
||||||
- search: /'/g
|
|
||||||
replace: ''
|
|
||||||
exclude-labels:
|
|
||||||
- 'skip-changelog'
|
|
||||||
|
|
||||||
filter-by-commitish: true
|
|
4
.github/workflows/close-old-issues.yaml
vendored
4
.github/workflows/close-old-issues.yaml
vendored
@ -22,8 +22,8 @@ jobs:
|
|||||||
exempt-issue-labels: "Keep Issue Open"
|
exempt-issue-labels: "Keep Issue Open"
|
||||||
# Split it into two weeks, after one week the issue will be marked as stale,
|
# Split it into two weeks, after one week the issue will be marked as stale,
|
||||||
# after another week have pasted without any update.. the issue will then be closed.
|
# after another week have pasted without any update.. the issue will then be closed.
|
||||||
days-before-issue-stale: 90
|
days-before-issue-stale: 7
|
||||||
days-before-issue-close: 365
|
days-before-issue-close: 7
|
||||||
# NEVER mark PRs as Stale or Close + this workflow should never have write permissions on PRs, EVER!
|
# NEVER mark PRs as Stale or Close + this workflow should never have write permissions on PRs, EVER!
|
||||||
days-before-pr-stale: -1
|
days-before-pr-stale: -1
|
||||||
days-before-pr-close: -1
|
days-before-pr-close: -1
|
||||||
|
1
.github/workflows/github-pages.yaml
vendored
1
.github/workflows/github-pages.yaml
vendored
@ -7,7 +7,6 @@ on:
|
|||||||
- '.github/requirements.txt'
|
- '.github/requirements.txt'
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- 'overrides/**'
|
- 'overrides/**'
|
||||||
- '.github/CONTRIBUTING.md'
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
15
.github/workflows/pre-release.yaml
vendored
15
.github/workflows/pre-release.yaml
vendored
@ -74,27 +74,16 @@ jobs:
|
|||||||
name: winutil
|
name: winutil
|
||||||
path: ./winutil.ps1
|
path: ./winutil.ps1
|
||||||
|
|
||||||
- name: Generate Release Notes
|
|
||||||
id: generate_notes
|
|
||||||
uses: release-drafter/release-drafter@v6
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
config-name: release-drafter.yml
|
|
||||||
version: ${{ env.VERSION }} # Pass the version variable
|
|
||||||
|
|
||||||
- name: Create and Upload Release
|
- name: Create and Upload Release
|
||||||
id: create_release
|
id: create_release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ env.VERSION }}
|
tag_name: ${{ env.VERSION }}
|
||||||
name: Pre-Release ${{ env.VERSION }}
|
name: Pre-Release ${{ env.VERSION }}
|
||||||
body: |
|
body: ""
|
||||||
${{ steps.generate_notes.outputs.body }}
|
|
||||||
|
|
||||||

|
|
||||||
append_body: false
|
append_body: false
|
||||||
files: ./winutil.ps1
|
files: ./winutil.ps1
|
||||||
prerelease: true
|
prerelease: true
|
||||||
|
generate_release_notes: true
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
104
Compile.ps1
104
Compile.ps1
@ -1,21 +1,12 @@
|
|||||||
param (
|
param (
|
||||||
[switch]$Debug,
|
[switch]$Debug,
|
||||||
[switch]$Run,
|
[switch]$Run,
|
||||||
[switch]$SkipPreprocessing,
|
[switch]$SkipPreprocessing
|
||||||
[string]$Arguments
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if ((Get-Item ".\winutil.ps1" -ErrorAction SilentlyContinue).IsReadOnly) {
|
|
||||||
Remove-Item ".\winutil.ps1" -Force
|
|
||||||
}
|
|
||||||
|
|
||||||
$OFS = "`r`n"
|
$OFS = "`r`n"
|
||||||
$scriptname = "winutil.ps1"
|
$scriptname = "winutil.ps1"
|
||||||
$workingdir = $PSScriptRoot
|
$workingdir = $PSScriptRoot
|
||||||
|
|
||||||
Push-Location
|
|
||||||
Set-Location $workingdir
|
|
||||||
|
|
||||||
# Variable to sync between runspaces
|
# Variable to sync between runspaces
|
||||||
$sync = [Hashtable]::Synchronized(@{})
|
$sync = [Hashtable]::Synchronized(@{})
|
||||||
$sync.PSScriptRoot = $workingdir
|
$sync.PSScriptRoot = $workingdir
|
||||||
@ -50,11 +41,11 @@ if (-NOT $SkipPreprocessing) {
|
|||||||
|
|
||||||
# Dot source the 'Invoke-Preprocessing' Function from 'tools/Invoke-Preprocessing.ps1' Script
|
# Dot source the 'Invoke-Preprocessing' Function from 'tools/Invoke-Preprocessing.ps1' Script
|
||||||
$preprocessingFilePath = ".\tools\Invoke-Preprocessing.ps1"
|
$preprocessingFilePath = ".\tools\Invoke-Preprocessing.ps1"
|
||||||
. $preprocessingFilePath
|
. "$(($workingdir -replace ('\\$', '')) + '\' + ($preprocessingFilePath -replace ('\.\\', '')))"
|
||||||
|
|
||||||
$excludedFiles = @('.\.git\', '.\.gitignore', '.\.gitattributes', '.\.github\CODEOWNERS', '.\LICENSE', "$preprocessingFilePath", '*.png', '*.exe')
|
$excludedFiles = @('.\.git\', '.\.gitignore', '.\.gitattributes', '.\.github\CODEOWNERS', '.\LICENSE', "$preprocessingFilePath", '*.png', '*.exe')
|
||||||
$msg = "Pre-req: Code Formatting"
|
$msg = "Pre-req: Code Formatting"
|
||||||
Invoke-Preprocessing -WorkingDir "$workingdir" -ExcludedFiles $excludedFiles -ProgressStatusMessage $msg -ThrowExceptionOnEmptyFilesList
|
Invoke-Preprocessing -WorkingDir "$workingdir" -ExcludedFiles $excludedFiles -ProgressStatusMessage $msg
|
||||||
}
|
}
|
||||||
|
|
||||||
# Create the script in memory.
|
# Create the script in memory.
|
||||||
@ -65,22 +56,46 @@ Update-Progress "Adding: Header" 5
|
|||||||
$script_content.Add($header)
|
$script_content.Add($header)
|
||||||
|
|
||||||
Update-Progress "Adding: Version" 10
|
Update-Progress "Adding: Version" 10
|
||||||
$script_content.Add($(Get-Content "scripts\start.ps1").replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)"))
|
$script_content.Add($(Get-Content "$workingdir\scripts\start.ps1").replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)"))
|
||||||
|
|
||||||
Update-Progress "Adding: Functions" 20
|
Update-Progress "Adding: Functions" 20
|
||||||
Get-ChildItem "functions" -Recurse -File | ForEach-Object {
|
Get-ChildItem "$workingdir\functions" -Recurse -File | ForEach-Object {
|
||||||
$script_content.Add($(Get-Content $psitem.FullName))
|
$script_content.Add($(Get-Content $psitem.FullName))
|
||||||
}
|
}
|
||||||
Update-Progress "Adding: Config *.json" 40
|
Update-Progress "Adding: Config *.json" 40
|
||||||
Get-ChildItem "config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
|
Get-ChildItem "$workingdir\config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
|
||||||
|
|
||||||
$json = (Get-Content $psitem.FullName).replace("'","''")
|
$json = (Get-Content $psitem.FullName).replace("'","''")
|
||||||
$jsonAsObject = $json | convertfrom-json
|
|
||||||
|
# Replace every XML Special Character so it'll render correctly in final build
|
||||||
|
# Only do so if json files has content to be displayed (for example the applications, tweaks, features json files)
|
||||||
|
# Make an Array List containing every name at first level of Json File
|
||||||
|
$jsonAsObject = $json | convertfrom-json
|
||||||
|
$firstLevelJsonList = [System.Collections.ArrayList]::new()
|
||||||
|
$jsonAsObject.PSObject.Properties.Name | ForEach-Object {$null = $firstLevelJsonList.Add($_)}
|
||||||
|
# Note:
|
||||||
|
# Avoid using HTML Entity Codes, for example '”' (stands for "Right Double Quotation Mark"),
|
||||||
|
# Use **HTML decimal/hex codes instead**, as using HTML Entity Codes will result in XML parse Error when running the compiled script.
|
||||||
|
for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) {
|
||||||
|
$firstLevelName = $firstLevelJsonList[$i]
|
||||||
|
if ($jsonAsObject.$firstLevelName.content -ne $null) {
|
||||||
|
$jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('&','&').replace('“','“').replace('”','”').replace("'",''').replace('<','<').replace('>','>').replace('—','—')
|
||||||
|
$jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('''',"'") # resolves the Double Apostrophe caused by the first replace function in the main loop
|
||||||
|
}
|
||||||
|
if ($jsonAsObject.$firstLevelName.description -ne $null) {
|
||||||
|
$jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('&','&').replace('“','“').replace('”','”').replace("'",''').replace('<','<').replace('>','>').replace('—','—')
|
||||||
|
$jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('''',"'") # resolves the Double Apostrophe caused by the first replace function in the main loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Add 'WPFInstall' as a prefix to every entry-name in 'applications.json' file
|
# Add 'WPFInstall' as a prefix to every entry-name in 'applications.json' file
|
||||||
if ($psitem.Name -eq "applications.json") {
|
if ($psitem.Name -eq "applications.json") {
|
||||||
foreach ($appEntryName in $jsonAsObject.PSObject.Properties.Name) {
|
for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) {
|
||||||
|
$appEntryName = $firstLevelJsonList[$i]
|
||||||
$appEntryContent = $jsonAsObject.$appEntryName
|
$appEntryContent = $jsonAsObject.$appEntryName
|
||||||
|
# Remove the entire app entry, so we could add it later with a different name
|
||||||
$jsonAsObject.PSObject.Properties.Remove($appEntryName)
|
$jsonAsObject.PSObject.Properties.Remove($appEntryName)
|
||||||
|
# Add the app entry, but with a different name (WPFInstall + The App Entry Name)
|
||||||
$jsonAsObject | Add-Member -MemberType NoteProperty -Name "WPFInstall$appEntryName" -Value $appEntryContent
|
$jsonAsObject | Add-Member -MemberType NoteProperty -Name "WPFInstall$appEntryName" -Value $appEntryContent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,52 +108,57 @@ Get-ChildItem "config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-
|
|||||||
$script_content.Add($(Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" ))
|
$script_content.Add($(Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" ))
|
||||||
}
|
}
|
||||||
|
|
||||||
# Read the entire XAML file as a single string, preserving line breaks
|
$xaml = (Get-Content "$workingdir\xaml\inputXML.xaml").replace("'","''")
|
||||||
$xaml = Get-Content "$workingdir\xaml\inputXML.xaml" -Raw
|
|
||||||
|
# Dot-source the Get-TabXaml function
|
||||||
|
. "$workingdir\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
|
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
|
||||||
|
|
||||||
# Add the XAML content to $script_content using a here-string
|
$script_content.Add($(Write-output "`$inputXML = '$xaml'"))
|
||||||
$script_content.Add(@"
|
|
||||||
`$inputXML = @'
|
|
||||||
$xaml
|
|
||||||
'@
|
|
||||||
"@)
|
|
||||||
|
|
||||||
$script_content.Add($(Get-Content "scripts\main.ps1"))
|
$script_content.Add($(Get-Content "$workingdir\scripts\main.ps1"))
|
||||||
|
|
||||||
if ($Debug) {
|
if ($Debug) {
|
||||||
Update-Progress "Writing debug files" 95
|
Update-Progress "Writing debug files" 95
|
||||||
$appXamlContent | Out-File -FilePath "xaml\inputApp.xaml" -Encoding ascii
|
$appXamlContent | Out-File -FilePath "$workingdir\xaml\inputApp.xaml" -Encoding ascii
|
||||||
$tweaksXamlContent | Out-File -FilePath "xaml\inputTweaks.xaml" -Encoding ascii
|
$tweaksXamlContent | Out-File -FilePath "$workingdir\xaml\inputTweaks.xaml" -Encoding ascii
|
||||||
$featuresXamlContent | Out-File -FilePath "xaml\inputFeatures.xaml" -Encoding ascii
|
$featuresXamlContent | Out-File -FilePath "$workingdir\xaml\inputFeatures.xaml" -Encoding ascii
|
||||||
} else {
|
} else {
|
||||||
Update-Progress "Removing temporary files" 99
|
Update-Progress "Removing temporary files" 99
|
||||||
Remove-Item "xaml\inputApp.xaml" -ErrorAction SilentlyContinue
|
Remove-Item "$workingdir\xaml\inputApp.xaml" -ErrorAction SilentlyContinue
|
||||||
Remove-Item "xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue
|
Remove-Item "$workingdir\xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue
|
||||||
Remove-Item "xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue
|
Remove-Item "$workingdir\xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue
|
||||||
}
|
}
|
||||||
|
|
||||||
Set-Content -Path "$scriptname" -Value ($script_content -join "`r`n") -Encoding ascii
|
Set-Content -Path "$workingdir\$scriptname" -Value ($script_content -join "`r`n") -Encoding ascii
|
||||||
Write-Progress -Activity "Compiling" -Completed
|
Write-Progress -Activity "Compiling" -Completed
|
||||||
|
|
||||||
Update-Progress -Activity "Validating" -StatusMessage "Checking winutil.ps1 Syntax" -Percent 0
|
Update-Progress -Activity "Validating" -StatusMessage "Checking winutil.ps1 Syntax" -Percent 0
|
||||||
try {
|
try {
|
||||||
$null = Get-Command -Syntax .\winutil.ps1
|
$null = Get-Command -Syntax .\winutil.ps1
|
||||||
} catch {
|
}
|
||||||
|
catch {
|
||||||
Write-Warning "Syntax Validation for 'winutil.ps1' has failed"
|
Write-Warning "Syntax Validation for 'winutil.ps1' has failed"
|
||||||
Write-Host "$($Error[0])" -ForegroundColor Red
|
Write-Host "$($Error[0])" -ForegroundColor Red
|
||||||
}
|
}
|
||||||
Write-Progress -Activity "Validating" -Completed
|
Write-Progress -Activity "Validating" -Completed
|
||||||
|
|
||||||
if ($run) {
|
if ($run) {
|
||||||
$script = "& '$workingdir\$scriptname' $Arguments"
|
try {
|
||||||
|
Start-Process -FilePath "pwsh" -ArgumentList "$workingdir\$scriptname"
|
||||||
|
} catch {
|
||||||
|
Start-Process -FilePath "powershell" -ArgumentList "$workingdir\$scriptname"
|
||||||
|
}
|
||||||
|
|
||||||
$powershellcmd = if (Get-Command pwsh -ErrorAction SilentlyContinue) { "pwsh" } else { "powershell" }
|
|
||||||
$processCmd = if (Get-Command wt.exe -ErrorAction SilentlyContinue) { "wt.exe" } else { $powershellcmd }
|
|
||||||
|
|
||||||
Start-Process $processCmd -ArgumentList "$powershellcmd -NoProfile -Command $script"
|
|
||||||
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
Pop-Location
|
|
||||||
|
@ -87,6 +87,14 @@
|
|||||||
"link": "https://anydesk.com/",
|
"link": "https://anydesk.com/",
|
||||||
"winget": "AnyDeskSoftwareGmbH.AnyDesk"
|
"winget": "AnyDeskSoftwareGmbH.AnyDesk"
|
||||||
},
|
},
|
||||||
|
"ATLauncher": {
|
||||||
|
"category": "Games",
|
||||||
|
"choco": "na",
|
||||||
|
"content": "ATLauncher",
|
||||||
|
"description": "ATLauncher is a Launcher for Minecraft which integrates multiple different ModPacks to allow you to download and install ModPacks easily and quickly.",
|
||||||
|
"link": "https://github.com/ATLauncher/ATLauncher",
|
||||||
|
"winget": "ATLauncher.ATLauncher"
|
||||||
|
},
|
||||||
"audacity": {
|
"audacity": {
|
||||||
"category": "Multimedia Tools",
|
"category": "Multimedia Tools",
|
||||||
"choco": "audacity",
|
"choco": "audacity",
|
||||||
@ -503,6 +511,14 @@
|
|||||||
"link": "https://www.epicgames.com/store/en-US/",
|
"link": "https://www.epicgames.com/store/en-US/",
|
||||||
"winget": "EpicGames.EpicGamesLauncher"
|
"winget": "EpicGames.EpicGamesLauncher"
|
||||||
},
|
},
|
||||||
|
"errorlookup": {
|
||||||
|
"category": "Utilities",
|
||||||
|
"choco": "na",
|
||||||
|
"content": "Windows Error Code Lookup",
|
||||||
|
"description": "ErrorLookup is a tool for looking up Windows error codes and their descriptions.",
|
||||||
|
"link": "https://github.com/HenryPP/ErrorLookup",
|
||||||
|
"winget": "Henry++.ErrorLookup"
|
||||||
|
},
|
||||||
"esearch": {
|
"esearch": {
|
||||||
"category": "Utilities",
|
"category": "Utilities",
|
||||||
"choco": "everything",
|
"choco": "everything",
|
||||||
@ -797,7 +813,7 @@
|
|||||||
"content": "Google Drive",
|
"content": "Google Drive",
|
||||||
"description": "File syncing across devices all tied to your google account",
|
"description": "File syncing across devices all tied to your google account",
|
||||||
"link": "https://www.google.com/drive/",
|
"link": "https://www.google.com/drive/",
|
||||||
"winget": "Google.GoogleDrive"
|
"winget": "Google.Drive"
|
||||||
},
|
},
|
||||||
"gpuz": {
|
"gpuz": {
|
||||||
"category": "Utilities",
|
"category": "Utilities",
|
||||||
|
@ -293,7 +293,7 @@
|
|||||||
<Extensions xmlns="https://schneegans.de/windows/unattend-generator/">
|
<Extensions xmlns="https://schneegans.de/windows/unattend-generator/">
|
||||||
<ExtractScript>
|
<ExtractScript>
|
||||||
param(
|
param(
|
||||||
[xml]$Document
|
[xml] $Document
|
||||||
);
|
);
|
||||||
|
|
||||||
$scriptsDir = 'C:\Windows\Setup\Scripts\';
|
$scriptsDir = 'C:\Windows\Setup\Scripts\';
|
||||||
|
@ -282,14 +282,6 @@
|
|||||||
"ButtonWidth": "300",
|
"ButtonWidth": "300",
|
||||||
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/sound"
|
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/sound"
|
||||||
},
|
},
|
||||||
"WPFPanelprinter": {
|
|
||||||
"Content": "Printer Panel",
|
|
||||||
"category": "Legacy Windows Panels",
|
|
||||||
"panel": "2",
|
|
||||||
"Type": "Button",
|
|
||||||
"ButtonWidth": "300",
|
|
||||||
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/printer"
|
|
||||||
},
|
|
||||||
"WPFPanelsystem": {
|
"WPFPanelsystem": {
|
||||||
"Content": "System Properties",
|
"Content": "System Properties",
|
||||||
"category": "Legacy Windows Panels",
|
"category": "Legacy Windows Panels",
|
||||||
@ -305,13 +297,5 @@
|
|||||||
"Type": "Button",
|
"Type": "Button",
|
||||||
"ButtonWidth": "300",
|
"ButtonWidth": "300",
|
||||||
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/user"
|
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/user"
|
||||||
},
|
|
||||||
"WPFWinUtilPSProfile": {
|
|
||||||
"Content": "Install CTT PowerShell Profile",
|
|
||||||
"category": "Powershell Profile",
|
|
||||||
"panel": "2",
|
|
||||||
"Order": "a083_",
|
|
||||||
"Type": "Button",
|
|
||||||
"ButtonWidth": "300"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
"WPFTweaksDeleteTempFiles",
|
"WPFTweaksDeleteTempFiles",
|
||||||
"WPFTweaksEndTaskOnTaskbar",
|
"WPFTweaksEndTaskOnTaskbar",
|
||||||
"WPFTweaksRestorePoint",
|
"WPFTweaksRestorePoint",
|
||||||
"WPFTweaksIPv46",
|
"WPFTweaksTeredo",
|
||||||
"WPFTweaksPowershell7Tele"
|
"WPFTweaksPowershell7Tele"
|
||||||
],
|
],
|
||||||
"Minimal": [
|
"Minimal": [
|
||||||
|
@ -1,169 +1,220 @@
|
|||||||
{
|
{
|
||||||
"_default": {
|
"Classic": {
|
||||||
"CustomDialogFontSize": "12",
|
"CustomDialogFontSize": "12",
|
||||||
"CustomDialogFontSizeHeader": "14",
|
"CustomDialogFontSizeHeader": "14",
|
||||||
"CustomDialogIconSize": "25",
|
"CustomDialogIconSize": "25",
|
||||||
"CustomDialogWidth": "400",
|
"CustomDialogWidth": "400",
|
||||||
"CustomDialogHeight": "200",
|
"CustomDialogHeight": "200",
|
||||||
|
|
||||||
"FontSize": "12",
|
"FontSize": "12",
|
||||||
"FontFamily": "Arial",
|
"FontFamily": "Arial",
|
||||||
"FontSizeHeading": "16",
|
"FontSizeHeading": "14",
|
||||||
"HeaderFontFamily": "Consolas, Monaco",
|
"HeaderFontFamily": "Consolas, Monaco",
|
||||||
|
|
||||||
"CheckBoxBulletDecoratorSize": "14",
|
"CheckBoxBulletDecoratorFontSize": "14",
|
||||||
"CheckBoxMargin": "15,0,0,2",
|
"CheckBoxMargin": "15,0,0,2",
|
||||||
|
|
||||||
"TabContentMargin": "5",
|
"TabButtonFontSize": "14",
|
||||||
"TabButtonFontSize": "14",
|
"TabButtonWidth": "100",
|
||||||
"TabButtonWidth": "100",
|
"TabButtonHeight": "25",
|
||||||
"TabButtonHeight": "25",
|
"TabRowHeightInPixels": "50",
|
||||||
"TabRowHeightInPixels": "50",
|
"IconFontSize": "14",
|
||||||
"IconFontSize": "14",
|
"IconButtonSize": "35",
|
||||||
"IconButtonSize": "35",
|
"WinUtilIconSize": "Auto",
|
||||||
"SettingsIconFontSize": "18",
|
"SettingsIconFontSize": "18",
|
||||||
"CloseIconFontSize": "18",
|
|
||||||
|
|
||||||
"MicroWinLogoSize": "10",
|
"MicroWinLogoSize": "10",
|
||||||
"MicrowinCheckBoxMargin": "-10,5,0,0",
|
|
||||||
|
|
||||||
"ProgressBarForegroundColor": "#2e77ff",
|
"ProgressBarForegroundColor": "#FFAC1C",
|
||||||
"ProgressBarBackgroundColor": "Transparent",
|
"ProgressBarBackgroundColor": "Transparent",
|
||||||
"ProgressBarTextColor": "#232629",
|
"ProgressBarTextColor": "#000000",
|
||||||
|
|
||||||
"ComboBoxBackgroundColor": "#F7F7F7",
|
"ComboBoxBackgroundColor": "#FFFFFF",
|
||||||
"LabelboxForegroundColor": "#232629",
|
"LabelboxForegroundColor": "#000000",
|
||||||
"MainForegroundColor": "#232629",
|
"MainForegroundColor": "#000000",
|
||||||
"MainBackgroundColor": "#F7F7F7",
|
"MainBackgroundColor": "#FFFFFF",
|
||||||
"LabelBackgroundColor": "#F7F7F7",
|
"LabelBackgroundColor": "#FAFAFA",
|
||||||
"LinkForegroundColor": "#232629",
|
"LinkForegroundColor": "#000000",
|
||||||
"LinkHoverForegroundColor": "#232629",
|
"LinkHoverForegroundColor": "#000000",
|
||||||
"GroupBorderBackgroundColor": "#232629",
|
"GroupBorderBackgroundColor": "#000000",
|
||||||
"ComboBoxForegroundColor": "#232629",
|
"ComboBoxForegroundColor": "#000000",
|
||||||
|
|
||||||
"ButtonFontSize": "12",
|
"ButtonFontSize": "12",
|
||||||
"ButtonFontFamily": "Arial",
|
"ButtonFontFamily": "Arial",
|
||||||
"ButtonWidth": "200",
|
"ButtonWidth": "200",
|
||||||
"ButtonHeight": "25",
|
"ButtonHeight": "25",
|
||||||
"ConfigTabButtonFontSize": "16",
|
"ConfigTabButtonFontSize": "16",
|
||||||
|
|
||||||
"SearchBarWidth": "200",
|
"SearchBarWidth": "200",
|
||||||
"SearchBarHeight": "25",
|
"SearchBarHeight": "25",
|
||||||
"SearchBarTextBoxFontSize": "12",
|
"SearchBarTextBoxFontSize": "16",
|
||||||
"SearchBarClearButtonFontSize": "14",
|
"SearchBarClearButtonFontSize": "14",
|
||||||
|
|
||||||
"ButtonInstallBackgroundColor": "#F7F7F7",
|
"ButtonInstallBackgroundColor": "#FFFFFF",
|
||||||
"ButtonTweaksBackgroundColor": "#F7F7F7",
|
"ButtonTweaksBackgroundColor": "#FFFFFF",
|
||||||
"ButtonConfigBackgroundColor": "#F7F7F7",
|
"ButtonConfigBackgroundColor": "#FFFFFF",
|
||||||
"ButtonUpdatesBackgroundColor": "#F7F7F7",
|
"ButtonUpdatesBackgroundColor": "#FFFFFF",
|
||||||
"ButtonInstallForegroundColor": "#232629",
|
"ButtonInstallForegroundColor": "#000000",
|
||||||
"ButtonTweaksForegroundColor": "#232629",
|
"ButtonTweaksForegroundColor": "#000000",
|
||||||
"ButtonConfigForegroundColor": "#232629",
|
"ButtonConfigForegroundColor": "#000000",
|
||||||
"ButtonUpdatesForegroundColor": "#232629",
|
"ButtonUpdatesForegroundColor": "#000000",
|
||||||
"ButtonBackgroundColor": "#F5F5F5",
|
"ButtonBackgroundColor": "#F5F5F5",
|
||||||
"ButtonBackgroundPressedColor": "#1A1A1A",
|
"ButtonBackgroundPressedColor": "#1A1A1A",
|
||||||
"CheckboxMouseOverColor": "#999999",
|
"CheckboxMouseOverColor": "#999999",
|
||||||
"ButtonBackgroundMouseoverColor": "#C2C2C2",
|
"ButtonBackgroundMouseoverColor": "#C2C2C2",
|
||||||
"ButtonBackgroundSelectedColor": "#F0F0F0",
|
"ButtonBackgroundSelectedColor": "#F0F0F0",
|
||||||
"ButtonForegroundColor": "#232629",
|
"ButtonForegroundColor": "#000000",
|
||||||
"ToggleButtonOnColor": "#2e77ff",
|
"ToggleButtonOnColor": "#2e77ff",
|
||||||
|
|
||||||
"ButtonBorderThickness": "1",
|
"ButtonBorderThickness": "1",
|
||||||
"ButtonMargin": "1",
|
"ButtonMargin": "1",
|
||||||
"ButtonCornerRadius": "2",
|
"ButtonCornerRadius": "2",
|
||||||
"BorderColor": "#232629",
|
"BorderColor": "#000000",
|
||||||
"BorderOpacity": "0.2",
|
"BorderOpacity": "0.2",
|
||||||
"ShadowPulse": "Forever"
|
"ShadowPulse": "Forever"
|
||||||
},
|
},
|
||||||
"Classic": {
|
"Matrix": {
|
||||||
"ComboBoxBackgroundColor": "#F7F7F7",
|
"CustomDialogFontSize": "12",
|
||||||
"LabelboxForegroundColor": "#232629",
|
"CustomDialogFontSizeHeader": "14",
|
||||||
"MainForegroundColor": "#232629",
|
"CustomDialogIconSize": "25",
|
||||||
"MainBackgroundColor": "#F7F7F7",
|
"CustomDialogWidth": "400",
|
||||||
"LabelBackgroundColor": "#F7F7F7",
|
"CustomDialogHeight": "200",
|
||||||
"LinkForegroundColor": "#232629",
|
|
||||||
"LinkHoverForegroundColor": "#232629",
|
|
||||||
"GroupBorderBackgroundColor": "#232629",
|
|
||||||
"ComboBoxForegroundColor": "#232629",
|
|
||||||
|
|
||||||
"ButtonInstallBackgroundColor": "#F7F7F7",
|
"FontSize": "12",
|
||||||
"ButtonTweaksBackgroundColor": "#F7F7F7",
|
"FontFamily": "Arial",
|
||||||
"ButtonConfigBackgroundColor": "#F7F7F7",
|
"FontSizeHeading": "14",
|
||||||
"ButtonUpdatesBackgroundColor": "#F7F7F7",
|
"HeaderFontFamily": "Consolas, Monaco",
|
||||||
"ButtonInstallForegroundColor": "#232629",
|
|
||||||
"ButtonTweaksForegroundColor": "#232629",
|
|
||||||
"ButtonConfigForegroundColor": "#232629",
|
|
||||||
"ButtonUpdatesForegroundColor": "#232629",
|
|
||||||
"ButtonBackgroundColor": "#F5F5F5",
|
|
||||||
"ButtonBackgroundPressedColor": "#1A1A1A",
|
|
||||||
"CheckboxMouseOverColor": "#999999",
|
|
||||||
"ButtonBackgroundMouseoverColor": "#C2C2C2",
|
|
||||||
"ButtonBackgroundSelectedColor": "#F0F0F0",
|
|
||||||
"ButtonForegroundColor": "#232629",
|
|
||||||
"ToggleButtonOnColor": "#2e77ff"
|
|
||||||
},
|
|
||||||
"Matrix": {
|
|
||||||
"ComboBoxBackgroundColor": "#232629",
|
|
||||||
"LabelboxForegroundColor": "#f7f7f7",
|
|
||||||
"MainForegroundColor": "#F7F7F7",
|
|
||||||
"MainBackgroundColor": "#232629",
|
|
||||||
"LabelBackgroundColor": "#232629",
|
|
||||||
"LinkForegroundColor": "#add8e6",
|
|
||||||
"LinkHoverForegroundColor": "#F7F7F7",
|
|
||||||
"ComboBoxForegroundColor": "#81a1c1",
|
|
||||||
|
|
||||||
"ProgressBarForegroundColor": "#222222",
|
"CheckBoxBulletDecoratorFontSize": "14",
|
||||||
"ProgressBarBackgroundColor": "Transparent",
|
"CheckBoxMargin": "15,0,0,2",
|
||||||
"ProgressBarTextColor": "#cccccc",
|
|
||||||
|
|
||||||
"ButtonInstallBackgroundColor": "#222222",
|
"TabButtonFontSize": "14",
|
||||||
"ButtonTweaksBackgroundColor": "#333333",
|
"TabButtonWidth": "100",
|
||||||
"ButtonConfigBackgroundColor": "#444444",
|
"TabButtonHeight": "25",
|
||||||
"ButtonUpdatesBackgroundColor": "#555555",
|
"TabRowHeightInPixels": "50",
|
||||||
"ButtonInstallForegroundColor": "#F7F7F7",
|
"IconFontSize": "14",
|
||||||
"ButtonTweaksForegroundColor": "#F7F7F7",
|
"IconButtonSize": "35",
|
||||||
"ButtonConfigForegroundColor": "#F7F7F7",
|
"WinUtilIconSize": "Auto",
|
||||||
"ButtonUpdatesForegroundColor": "#F7F7F7",
|
"SettingsIconFontSize": "18",
|
||||||
"ButtonBackgroundColor": "#1E3747",
|
|
||||||
"ButtonBackgroundPressedColor": "#F7F7F7",
|
|
||||||
"ButtonBackgroundMouseoverColor": "#3B4252",
|
|
||||||
"ButtonBackgroundSelectedColor": "#5E81AC",
|
|
||||||
"ButtonForegroundColor": "#F7F7F7",
|
|
||||||
"ToggleButtonOnColor": "#2e77ff",
|
|
||||||
|
|
||||||
"BorderColor": "#0060CC",
|
"MicroWinLogoSize": "10",
|
||||||
"BorderOpacity": "0.2",
|
|
||||||
"ShadowPulse": "0:0:3"
|
|
||||||
},
|
|
||||||
"Dark": {
|
|
||||||
"ComboBoxBackgroundColor": "#1e3747",
|
|
||||||
"LabelboxForegroundColor": "#0567ff",
|
|
||||||
"MainForegroundColor": "#F7F7F7",
|
|
||||||
"MainBackgroundColor": "#121212",
|
|
||||||
"LabelBackgroundColor": "#121212",
|
|
||||||
"LinkForegroundColor": "#add8e6",
|
|
||||||
"LinkHoverForegroundColor": "#F7F7F7",
|
|
||||||
"ComboBoxForegroundColor": "#f7f7f7",
|
|
||||||
|
|
||||||
"ProgressBarForegroundColor": "#222222",
|
"ProgressBarForegroundColor": "#222222",
|
||||||
"ProgressBarBackgroundColor": "Transparent",
|
"ProgressBarBackgroundColor": "Transparent",
|
||||||
"ProgressBarTextColor": "#cccccc",
|
"ProgressBarTextColor": "#cccccc",
|
||||||
|
|
||||||
"ButtonInstallBackgroundColor": "#222222",
|
"ComboBoxBackgroundColor": "#000000",
|
||||||
"ButtonTweaksBackgroundColor": "#333333",
|
"LabelboxForegroundColor": "#FFEE58",
|
||||||
"ButtonConfigBackgroundColor": "#444444",
|
"MainForegroundColor": "#9CCC65",
|
||||||
"ButtonUpdatesBackgroundColor": "#555555",
|
"MainBackgroundColor": "#000000",
|
||||||
"ButtonInstallForegroundColor": "#F7F7F7",
|
"LabelBackgroundColor": "#000000",
|
||||||
"ButtonTweaksForegroundColor": "#F7F7F7",
|
"LinkForegroundColor": "#add8e6",
|
||||||
"ButtonConfigForegroundColor": "#F7F7F7",
|
"LinkHoverForegroundColor": "#FFFFFF",
|
||||||
"ButtonUpdatesForegroundColor": "#F7F7F7",
|
"ComboBoxForegroundColor": "#FFEE58",
|
||||||
"ButtonBackgroundColor": "#1E3747",
|
|
||||||
"ButtonBackgroundPressedColor": "#00CFFF",
|
|
||||||
"ButtonBackgroundMouseoverColor": "#5E81AC",
|
|
||||||
"ButtonBackgroundSelectedColor": "#5E81AC",
|
|
||||||
"ButtonForegroundColor": "#F7F7F7",
|
|
||||||
"ToggleButtonOnColor": "#2e77ff",
|
|
||||||
|
|
||||||
"BorderColor": "#2F373D"
|
"ButtonFontSize": "12",
|
||||||
}
|
"ButtonFontFamily": "Arial",
|
||||||
|
"ButtonWidth": "200",
|
||||||
|
"ButtonHeight": "25",
|
||||||
|
"ConfigTabButtonFontSize": "16",
|
||||||
|
|
||||||
|
"SearchBarWidth": "200",
|
||||||
|
"SearchBarHeight": "25",
|
||||||
|
"SearchBarTextBoxFontSize": "16",
|
||||||
|
"SearchBarClearButtonFontSize": "14",
|
||||||
|
|
||||||
|
"ButtonInstallBackgroundColor": "#222222",
|
||||||
|
"ButtonTweaksBackgroundColor": "#333333",
|
||||||
|
"ButtonConfigBackgroundColor": "#444444",
|
||||||
|
"ButtonUpdatesBackgroundColor": "#555555",
|
||||||
|
"ButtonInstallForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonTweaksForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonConfigForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonUpdatesForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonBackgroundColor": "#000019",
|
||||||
|
"ButtonBackgroundPressedColor": "#FFFFFF",
|
||||||
|
"ButtonBackgroundMouseoverColor": "#A55A64",
|
||||||
|
"ButtonBackgroundSelectedColor": "#FF5733",
|
||||||
|
"ButtonForegroundColor": "#9CCC65",
|
||||||
|
"ToggleButtonOnColor": "#2e77ff",
|
||||||
|
|
||||||
|
"ButtonBorderThickness": "1",
|
||||||
|
"ButtonMargin": "1",
|
||||||
|
"ButtonCornerRadius": "2",
|
||||||
|
"BorderColor": "#FFAC1C",
|
||||||
|
"BorderOpacity": "0.8",
|
||||||
|
"ShadowPulse": "0:0:3"
|
||||||
|
},
|
||||||
|
"Dark": {
|
||||||
|
"CustomDialogFontSize": "12",
|
||||||
|
"CustomDialogFontSizeHeader": "14",
|
||||||
|
"CustomDialogIconSize": "25",
|
||||||
|
"CustomDialogWidth": "400",
|
||||||
|
"CustomDialogHeight": "200",
|
||||||
|
|
||||||
|
"FontSize": "12",
|
||||||
|
"FontFamily": "Arial",
|
||||||
|
"FontSizeHeading": "14",
|
||||||
|
"HeaderFontFamily": "Consolas, Monaco",
|
||||||
|
|
||||||
|
"CheckBoxBulletDecoratorFontSize": "14",
|
||||||
|
"CheckBoxMargin": "15,0,0,2",
|
||||||
|
|
||||||
|
"TabButtonFontSize": "14",
|
||||||
|
"TabButtonWidth": "100",
|
||||||
|
"TabButtonHeight": "25",
|
||||||
|
"TabRowHeightInPixels": "50",
|
||||||
|
"IconFontSize": "14",
|
||||||
|
"IconButtonSize": "35",
|
||||||
|
"WinUtilIconSize": "Auto",
|
||||||
|
"SettingsIconFontSize": "18",
|
||||||
|
|
||||||
|
"MicroWinLogoSize": "10",
|
||||||
|
|
||||||
|
"ProgressBarForegroundColor": "#222222",
|
||||||
|
"ProgressBarBackgroundColor": "Transparent",
|
||||||
|
"ProgressBarTextColor": "#FFFFFF",
|
||||||
|
|
||||||
|
"ComboBoxBackgroundColor": "#000000",
|
||||||
|
"LabelboxForegroundColor": "#FFEE58",
|
||||||
|
"MainForegroundColor": "#9CCC65",
|
||||||
|
"MainBackgroundColor": "#000000",
|
||||||
|
"LabelBackgroundColor": "#000000",
|
||||||
|
"LinkForegroundColor": "#add8e6",
|
||||||
|
"LinkHoverForegroundColor": "#FFFFFF",
|
||||||
|
"ComboBoxForegroundColor": "#FFEE58",
|
||||||
|
|
||||||
|
"ButtonFontSize": "12",
|
||||||
|
"ButtonFontFamily": "Arial",
|
||||||
|
"ButtonWidth": "200",
|
||||||
|
"ButtonHeight": "25",
|
||||||
|
"ConfigTabButtonFontSize": "16",
|
||||||
|
|
||||||
|
"SearchBarWidth": "200",
|
||||||
|
"SearchBarHeight": "25",
|
||||||
|
"SearchBarTextBoxFontSize": "16",
|
||||||
|
"SearchBarClearButtonFontSize": "14",
|
||||||
|
|
||||||
|
"ButtonInstallBackgroundColor": "#222222",
|
||||||
|
"ButtonTweaksBackgroundColor": "#333333",
|
||||||
|
"ButtonConfigBackgroundColor": "#444444",
|
||||||
|
"ButtonUpdatesBackgroundColor": "#555555",
|
||||||
|
"ButtonInstallForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonTweaksForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonConfigForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonUpdatesForegroundColor": "#FFFFFF",
|
||||||
|
"ButtonBackgroundColor": "#000019",
|
||||||
|
"ButtonBackgroundPressedColor": "#9CCC65",
|
||||||
|
"ButtonBackgroundMouseoverColor": "#FF5733",
|
||||||
|
"ButtonBackgroundSelectedColor": "#FF5733",
|
||||||
|
"ButtonForegroundColor": "#9CCC65",
|
||||||
|
"ToggleButtonOnColor": "#2e77ff",
|
||||||
|
|
||||||
|
"ButtonBorderThickness": "1",
|
||||||
|
"ButtonMargin": "1",
|
||||||
|
"ButtonCornerRadius": "2",
|
||||||
|
"BorderColor": "#FFAC1C",
|
||||||
|
"BorderOpacity": "0.2",
|
||||||
|
"ShadowPulse": "Forever"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2430,12 +2430,6 @@
|
|||||||
"Order": "a001_",
|
"Order": "a001_",
|
||||||
"InvokeScript": [
|
"InvokeScript": [
|
||||||
"
|
"
|
||||||
# Check if the user has administrative privileges
|
|
||||||
if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
|
||||||
Write-Host \"Please run this script as an administrator.\"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if System Restore is enabled for the main drive
|
# Check if System Restore is enabled for the main drive
|
||||||
try {
|
try {
|
||||||
# Try getting restore points to check if System Restore is enabled
|
# Try getting restore points to check if System Restore is enabled
|
||||||
@ -2713,9 +2707,6 @@
|
|||||||
reg delete \"HKEY_USERS\\Default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"OneDriveSetup\" /f
|
reg delete \"HKEY_USERS\\Default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"OneDriveSetup\" /f
|
||||||
reg unload \"hku\\Default\"
|
reg unload \"hku\\Default\"
|
||||||
|
|
||||||
Write-Host \"Removing autostart key\"
|
|
||||||
reg delete \"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"OneDrive\" /f
|
|
||||||
|
|
||||||
Write-Host \"Removing startmenu entry\"
|
Write-Host \"Removing startmenu entry\"
|
||||||
Remove-Item -Force -ErrorAction SilentlyContinue \"$env:userprofile\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\OneDrive.lnk\"
|
Remove-Item -Force -ErrorAction SilentlyContinue \"$env:userprofile\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\OneDrive.lnk\"
|
||||||
|
|
||||||
@ -3094,8 +3085,8 @@
|
|||||||
"panel": "1",
|
"panel": "1",
|
||||||
"Order": "a002_",
|
"Order": "a002_",
|
||||||
"InvokeScript": [
|
"InvokeScript": [
|
||||||
"Get-ChildItem -Path \"C:\\Windows\\Temp\" *.* -Recurse | Remove-Item -Force -Recurse
|
"Get-ChildItem -Path \"C:\\Windows\\Temp\" *.* -Recurse | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
|
||||||
Get-ChildItem -Path $env:TEMP *.* -Recurse | Remove-Item -Force -Recurse"
|
Get-ChildItem -Path $env:TEMP *.* -Recurse | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue"
|
||||||
],
|
],
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/DeleteTempFiles"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/DeleteTempFiles"
|
||||||
},
|
},
|
||||||
@ -3144,29 +3135,12 @@
|
|||||||
],
|
],
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/DVR"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/DVR"
|
||||||
},
|
},
|
||||||
"WPFTweaksIPv46": {
|
"WPFTweaksTeredo": {
|
||||||
"Content": "Prefer IPv4 over IPv6",
|
"Content": "Disable Teredo",
|
||||||
"Description": "To set the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
|
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency.",
|
||||||
"category": "Essential Tweaks",
|
"category": "Essential Tweaks",
|
||||||
"panel": "1",
|
"panel": "1",
|
||||||
"Order": "a005_",
|
"Order": "a005_",
|
||||||
"registry": [
|
|
||||||
{
|
|
||||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
|
||||||
"Name": "DisabledComponents",
|
|
||||||
"Value": "32",
|
|
||||||
"OriginalValue": "0",
|
|
||||||
"Type": "DWord"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/IPv46"
|
|
||||||
},
|
|
||||||
"WPFTweaksTeredo": {
|
|
||||||
"Content": "Disable Teredo",
|
|
||||||
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency, but may cause problems with some games",
|
|
||||||
"category": "z__Advanced Tweaks - CAUTION",
|
|
||||||
"panel": "1",
|
|
||||||
"Order": "a023_",
|
|
||||||
"registry": [
|
"registry": [
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
||||||
@ -3182,7 +3156,7 @@
|
|||||||
"UndoScript": [
|
"UndoScript": [
|
||||||
"netsh interface teredo set state default"
|
"netsh interface teredo set state default"
|
||||||
],
|
],
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/Teredo"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/Teredo"
|
||||||
},
|
},
|
||||||
"WPFTweaksDisableipsix": {
|
"WPFTweaksDisableipsix": {
|
||||||
"Content": "Disable IPv6",
|
"Content": "Disable IPv6",
|
||||||
@ -3402,6 +3376,22 @@
|
|||||||
"ComboItems": "Default DHCP Google Cloudflare Cloudflare_Malware Cloudflare_Malware_Adult Open_DNS Quad9 AdGuard_Ads_Trackers AdGuard_Ads_Trackers_Malware_Adult",
|
"ComboItems": "Default DHCP Google Cloudflare Cloudflare_Malware Cloudflare_Malware_Adult Open_DNS Quad9 AdGuard_Ads_Trackers AdGuard_Ads_Trackers_Malware_Adult",
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/changedns"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/changedns"
|
||||||
},
|
},
|
||||||
|
"WPFTweaksbutton": {
|
||||||
|
"Content": "Run Tweaks",
|
||||||
|
"category": "z__Advanced Tweaks - CAUTION",
|
||||||
|
"panel": "1",
|
||||||
|
"Order": "a041_",
|
||||||
|
"Type": "Button",
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/button"
|
||||||
|
},
|
||||||
|
"WPFUndoall": {
|
||||||
|
"Content": "Undo Selected Tweaks",
|
||||||
|
"category": "z__Advanced Tweaks - CAUTION",
|
||||||
|
"panel": "1",
|
||||||
|
"Order": "a042_",
|
||||||
|
"Type": "Button",
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/Undoall"
|
||||||
|
},
|
||||||
"WPFAddUltPerf": {
|
"WPFAddUltPerf": {
|
||||||
"Content": "Add and Activate Ultimate Performance Profile",
|
"Content": "Add and Activate Ultimate Performance Profile",
|
||||||
"category": "Performance Plans",
|
"category": "Performance Plans",
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 152 KiB |
@ -1,65 +0,0 @@
|
|||||||
# Printer Settings
|
|
||||||
|
|
||||||
Last Updated: 2024-08-31
|
|
||||||
|
|
||||||
|
|
||||||
!!! info
|
|
||||||
The Development Documentation is auto generated for every compilation of WinUtil, meaning a part of it will always stay up-to-date. **Developers do have the ability to add custom content, which won't be updated automatically.**
|
|
||||||
|
|
||||||
|
|
||||||
<!-- BEGIN CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<!-- END CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Preview Code</summary>
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Content": "Printer Settings",
|
|
||||||
"category": "Legacy Windows Panels",
|
|
||||||
"panel": "2",
|
|
||||||
"Type": "Button",
|
|
||||||
"ButtonWidth": "300"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Function: Invoke-WPFControlPanel
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
function Invoke-WPFControlPanel {
|
|
||||||
<#
|
|
||||||
|
|
||||||
.SYNOPSIS
|
|
||||||
Opens the requested legacy panel
|
|
||||||
|
|
||||||
.PARAMETER Panel
|
|
||||||
The panel to open
|
|
||||||
|
|
||||||
#>
|
|
||||||
param($Panel)
|
|
||||||
|
|
||||||
switch ($Panel) {
|
|
||||||
"WPFPanelcontrol" {cmd /c control}
|
|
||||||
"WPFPanelnetwork" {cmd /c ncpa.cpl}
|
|
||||||
"WPFPanelpower" {cmd /c powercfg.cpl}
|
|
||||||
"WPFPanelregion" {cmd /c intl.cpl}
|
|
||||||
"WPFPanelsound" {cmd /c mmsys.cpl}
|
|
||||||
"WPFPanelprinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
|
||||||
"WPFPanelsystem" {cmd /c sysdm.cpl}
|
|
||||||
"WPFPaneluser" {cmd /c "control userpasswords2"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
<!-- BEGIN SECOND CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<!-- END SECOND CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
|
|
||||||
[View the JSON file](https://github.com/ChrisTitusTech/winutil/tree/main/../config/feature.json)
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
|||||||
# Prefer IPv4 over IPv6
|
|
||||||
|
|
||||||
Last Updated: 2024-08-27
|
|
||||||
|
|
||||||
|
|
||||||
!!! info
|
|
||||||
The Development Documentation is auto generated for every compilation of WinUtil, meaning a part of it will always stay up-to-date. **Developers do have the ability to add custom content, which won't be updated automatically.**
|
|
||||||
## Description
|
|
||||||
|
|
||||||
To set the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.
|
|
||||||
|
|
||||||
<!-- BEGIN CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<!-- END CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Preview Code</summary>
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Content": "Prefer IPv4 over IPv6",
|
|
||||||
"Description": "To set the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
|
|
||||||
"category": "Essential Tweaks",
|
|
||||||
"panel": "1",
|
|
||||||
"Order": "a005_",
|
|
||||||
"registry": [
|
|
||||||
{
|
|
||||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
|
||||||
"Name": "DisabledComponents",
|
|
||||||
"Value": "32",
|
|
||||||
"OriginalValue": "0",
|
|
||||||
"Type": "DWord"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/IPv46"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Registry Changes
|
|
||||||
Applications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.
|
|
||||||
|
|
||||||
|
|
||||||
You can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).
|
|
||||||
|
|
||||||
### Registry Key: DisabledComponents
|
|
||||||
|
|
||||||
**Type:** DWord
|
|
||||||
|
|
||||||
**Original Value:** 0
|
|
||||||
|
|
||||||
**New Value:** 32
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- BEGIN SECOND CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<!-- END SECOND CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
|
|
||||||
[View the JSON file](https://github.com/ChrisTitusTech/winutil/tree/main/config/tweaks.json)
|
|
||||||
|
|
@ -69,7 +69,7 @@ function Invoke-WPFTweakPS7{
|
|||||||
Write-Host "Powershell 7 is already installed."
|
Write-Host "Powershell 7 is already installed."
|
||||||
} else {
|
} else {
|
||||||
Write-Host "Installing Powershell 7..."
|
Write-Host "Installing Powershell 7..."
|
||||||
Install-WinUtilProgramWinget -Action Install -Programs @("Microsoft.PowerShell")
|
Invoke-WinUtilWingetProgram -Action Install -Programs @("Microsoft.PowerShell")
|
||||||
}
|
}
|
||||||
$targetTerminalName = "PowerShell"
|
$targetTerminalName = "PowerShell"
|
||||||
}
|
}
|
||||||
@ -105,10 +105,10 @@ function Invoke-WPFTweakPS7{
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
## Function: Install-WinUtilProgramWinget
|
## Function: Invoke-WinUtilWingetProgram
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
Function Install-WinUtilProgramWinget {
|
Function Invoke-WinUtilWingetProgram {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Runs the designated action on the provided programs using Winget
|
Runs the designated action on the provided programs using Winget
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# Disable Teredo
|
# Disable Teredo
|
||||||
|
|
||||||
Last Updated: 2024-08-27
|
Last Updated: 2024-08-07
|
||||||
|
|
||||||
|
|
||||||
!!! info
|
!!! info
|
||||||
The Development Documentation is auto generated for every compilation of WinUtil, meaning a part of it will always stay up-to-date. **Developers do have the ability to add custom content, which won't be updated automatically.**
|
The Development Documentation is auto generated for every compilation of WinUtil, meaning a part of it will always stay up-to-date. **Developers do have the ability to add custom content, which won't be updated automatically.**
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
Teredo network tunneling is a ipv6 feature that can cause additional latency, but may cause problems with some games
|
Teredo network tunneling is a ipv6 feature that can cause additional latency.
|
||||||
|
|
||||||
<!-- BEGIN CUSTOM CONTENT -->
|
<!-- BEGIN CUSTOM CONTENT -->
|
||||||
|
|
||||||
@ -19,10 +19,10 @@ Teredo network tunneling is a ipv6 feature that can cause additional latency, bu
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"Content": "Disable Teredo",
|
"Content": "Disable Teredo",
|
||||||
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency, but may cause problems with some games",
|
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency.",
|
||||||
"category": "z__Advanced Tweaks - CAUTION",
|
"category": "Essential Tweaks",
|
||||||
"panel": "1",
|
"panel": "1",
|
||||||
"Order": "a023_",
|
"Order": "a005_",
|
||||||
"registry": [
|
"registry": [
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
||||||
@ -38,7 +38,7 @@ Teredo network tunneling is a ipv6 feature that can cause additional latency, bu
|
|||||||
"UndoScript": [
|
"UndoScript": [
|
||||||
"netsh interface teredo set state default"
|
"netsh interface teredo set state default"
|
||||||
],
|
],
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/Teredo"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/Teredo"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
176
docs/devdocs.md
176
docs/devdocs.md
@ -3,106 +3,106 @@
|
|||||||
|
|
||||||
## Tweaks
|
## Tweaks
|
||||||
|
|
||||||
### Essential-Tweaks
|
|
||||||
|
|
||||||
- [Change Windows Terminal default: PowerShell 5 -> PowerShell 7](../docs/dev/tweaks/Essential-Tweaks/Powershell7.md)
|
|
||||||
- [Create Restore Point](../docs/dev/tweaks/Essential-Tweaks/RestorePoint.md)
|
|
||||||
- [Debloat Edge](../docs/dev/tweaks/Essential-Tweaks/EdgeDebloat.md)
|
|
||||||
- [Delete Temporary Files](../docs/dev/tweaks/Essential-Tweaks/DeleteTempFiles.md)
|
|
||||||
- [Disable Activity History](../docs/dev/tweaks/Essential-Tweaks/AH.md)
|
|
||||||
- [Disable ConsumerFeatures](../docs/dev/tweaks/Essential-Tweaks/ConsumerFeatures.md)
|
|
||||||
- [Disable GameDVR](../docs/dev/tweaks/Essential-Tweaks/DVR.md)
|
|
||||||
- [Disable Hibernation](../docs/dev/tweaks/Essential-Tweaks/Hiber.md)
|
|
||||||
- [Disable Homegroup](../docs/dev/tweaks/Essential-Tweaks/Home.md)
|
|
||||||
- [Disable Location Tracking](../docs/dev/tweaks/Essential-Tweaks/Loc.md)
|
|
||||||
- [Disable Powershell 7 Telemetry](../docs/dev/tweaks/Essential-Tweaks/Powershell7Tele.md)
|
|
||||||
- [Disable Storage Sense](../docs/dev/tweaks/Essential-Tweaks/Storage.md)
|
|
||||||
- [Disable Telemetry](../docs/dev/tweaks/Essential-Tweaks/Tele.md)
|
|
||||||
- [Disable Wifi-Sense](../docs/dev/tweaks/Essential-Tweaks/Wifi.md)
|
|
||||||
- [Enable End Task With Right Click](../docs/dev/tweaks/Essential-Tweaks/EndTaskOnTaskbar.md)
|
|
||||||
- [Prefer IPv4 over IPv6](../docs/dev/tweaks/Essential-Tweaks/IPv46.md)
|
|
||||||
- [Run Disk Cleanup](../docs/dev/tweaks/Essential-Tweaks/DiskCleanup.md)
|
|
||||||
- [Set Hibernation as default (good for laptops)](../docs/dev/tweaks/Essential-Tweaks/LaptopHibernation.md)
|
|
||||||
- [Set Services to Manual](../docs/dev/tweaks/Essential-Tweaks/Services.md)
|
|
||||||
### Shortcuts
|
|
||||||
|
|
||||||
- [Create WinUtil Shortcut](../docs/dev/tweaks/Shortcuts/Shortcut.md)
|
|
||||||
### z--Advanced-Tweaks---CAUTION
|
### z--Advanced-Tweaks---CAUTION
|
||||||
|
|
||||||
- [Adobe Debloat](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/DebloatAdobe.md)
|
- [Adobe Debloat](dev/tweaks/z--Advanced-Tweaks---CAUTION/DebloatAdobe.md)
|
||||||
- [Adobe Network Block](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/BlockAdobeNet.md)
|
- [Adobe Network Block](dev/tweaks/z--Advanced-Tweaks---CAUTION/BlockAdobeNet.md)
|
||||||
- [Disable Background Apps](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableBGapps.md)
|
- [Disable Background Apps](dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableBGapps.md)
|
||||||
- [Disable Fullscreen Optimizations](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableFSO.md)
|
- [Disable Fullscreen Optimizations](dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableFSO.md)
|
||||||
- [Disable Intel MM (vPro LMS)](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableLMS1.md)
|
- [Disable Intel MM (vPro LMS)](dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableLMS1.md)
|
||||||
- [Disable IPv6](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/Disableipsix.md)
|
- [Disable IPv6](dev/tweaks/z--Advanced-Tweaks---CAUTION/Disableipsix.md)
|
||||||
- [Disable Microsoft Copilot](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveCopilot.md)
|
- [Disable Microsoft Copilot](dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveCopilot.md)
|
||||||
- [Disable Notification Tray/Calendar](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableNotifications.md)
|
- [Disable Notification Tray/Calendar](dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableNotifications.md)
|
||||||
- [Disable Teredo](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/Teredo.md)
|
- [DNS](dev/tweaks/z--Advanced-Tweaks---CAUTION/changedns.md)
|
||||||
- [DNS](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/changedns.md)
|
- [Remove ALL MS Store Apps - NOT RECOMMENDED](dev/tweaks/z--Advanced-Tweaks---CAUTION/DeBloat.md)
|
||||||
- [Remove ALL MS Store Apps - NOT RECOMMENDED](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/DeBloat.md)
|
- [Remove Home and Gallery from explorer](dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveHomeGallery.md)
|
||||||
- [Remove Home and Gallery from explorer](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveHomeGallery.md)
|
- [Remove Microsoft Edge](dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveEdge.md)
|
||||||
- [Remove Microsoft Edge](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveEdge.md)
|
- [Remove OneDrive](dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveOnedrive.md)
|
||||||
- [Remove OneDrive](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveOnedrive.md)
|
- [Run OO Shutup 10](dev/tweaks/z--Advanced-Tweaks---CAUTION/OOSUbutton.md)
|
||||||
- [Run OO Shutup 10](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/OOSUbutton.md)
|
- [Run Tweaks](dev/tweaks/z--Advanced-Tweaks---CAUTION/button.md)
|
||||||
- [Set Classic Right-Click Menu ](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/RightClickMenu.md)
|
- [Set Classic Right-Click Menu ](dev/tweaks/z--Advanced-Tweaks---CAUTION/RightClickMenu.md)
|
||||||
- [Set Display for Performance](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/Display.md)
|
- [Set Display for Performance](dev/tweaks/z--Advanced-Tweaks---CAUTION/Display.md)
|
||||||
- [Set Time to UTC (Dual Boot)](../docs/dev/tweaks/z--Advanced-Tweaks---CAUTION/UTC.md)
|
- [Set Time to UTC (Dual Boot)](dev/tweaks/z--Advanced-Tweaks---CAUTION/UTC.md)
|
||||||
|
- [Undo Selected Tweaks](dev/tweaks/z--Advanced-Tweaks---CAUTION/Undoall.md)
|
||||||
|
### Essential-Tweaks
|
||||||
|
|
||||||
|
- [Change Windows Terminal default: PowerShell 5 -> PowerShell 7](dev/tweaks/Essential-Tweaks/Powershell7.md)
|
||||||
|
- [Create Restore Point](dev/tweaks/Essential-Tweaks/RestorePoint.md)
|
||||||
|
- [Debloat Edge](dev/tweaks/Essential-Tweaks/EdgeDebloat.md)
|
||||||
|
- [Delete Temporary Files](dev/tweaks/Essential-Tweaks/DeleteTempFiles.md)
|
||||||
|
- [Disable Activity History](dev/tweaks/Essential-Tweaks/AH.md)
|
||||||
|
- [Disable ConsumerFeatures](dev/tweaks/Essential-Tweaks/ConsumerFeatures.md)
|
||||||
|
- [Disable GameDVR](dev/tweaks/Essential-Tweaks/DVR.md)
|
||||||
|
- [Disable Hibernation](dev/tweaks/Essential-Tweaks/Hiber.md)
|
||||||
|
- [Disable Homegroup](dev/tweaks/Essential-Tweaks/Home.md)
|
||||||
|
- [Disable Location Tracking](dev/tweaks/Essential-Tweaks/Loc.md)
|
||||||
|
- [Disable Powershell 7 Telemetry](dev/tweaks/Essential-Tweaks/Powershell7Tele.md)
|
||||||
|
- [Disable Storage Sense](dev/tweaks/Essential-Tweaks/Storage.md)
|
||||||
|
- [Disable Telemetry](dev/tweaks/Essential-Tweaks/Tele.md)
|
||||||
|
- [Disable Teredo](dev/tweaks/Essential-Tweaks/Teredo.md)
|
||||||
|
- [Disable Wifi-Sense](dev/tweaks/Essential-Tweaks/Wifi.md)
|
||||||
|
- [Enable End Task With Right Click](dev/tweaks/Essential-Tweaks/EndTaskOnTaskbar.md)
|
||||||
|
- [Run Disk Cleanup](dev/tweaks/Essential-Tweaks/DiskCleanup.md)
|
||||||
|
- [Set Hibernation as default (good for laptops)](dev/tweaks/Essential-Tweaks/LaptopHibernation.md)
|
||||||
|
- [Set Services to Manual](dev/tweaks/Essential-Tweaks/Services.md)
|
||||||
|
### Shortcuts
|
||||||
|
|
||||||
|
- [Create WinUtil Shortcut](dev/tweaks/Shortcuts/Shortcut.md)
|
||||||
### Customize-Preferences
|
### Customize-Preferences
|
||||||
|
|
||||||
- [Bing Search in Start Menu](../docs/dev/tweaks/Customize-Preferences/BingSearch.md)
|
- [Bing Search in Start Menu](dev/tweaks/Customize-Preferences/BingSearch.md)
|
||||||
- [Center Taskbar Items](../docs/dev/tweaks/Customize-Preferences/TaskbarAlignment.md)
|
- [Center Taskbar Items](dev/tweaks/Customize-Preferences/TaskbarAlignment.md)
|
||||||
- [Dark Theme for Windows](../docs/dev/tweaks/Customize-Preferences/DarkMode.md)
|
- [Dark Theme for Windows](dev/tweaks/Customize-Preferences/DarkMode.md)
|
||||||
- [Detailed BSoD](../docs/dev/tweaks/Customize-Preferences/DetailedBSoD.md)
|
- [Detailed BSoD](dev/tweaks/Customize-Preferences/DetailedBSoD.md)
|
||||||
- [Mouse Acceleration](../docs/dev/tweaks/Customize-Preferences/MouseAcceleration.md)
|
- [Mouse Acceleration](dev/tweaks/Customize-Preferences/MouseAcceleration.md)
|
||||||
- [NumLock on Startup](../docs/dev/tweaks/Customize-Preferences/NumLock.md)
|
- [NumLock on Startup](dev/tweaks/Customize-Preferences/NumLock.md)
|
||||||
- [Search Button in Taskbar](../docs/dev/tweaks/Customize-Preferences/TaskbarSearch.md)
|
- [Search Button in Taskbar](dev/tweaks/Customize-Preferences/TaskbarSearch.md)
|
||||||
- [Show File Extensions](../docs/dev/tweaks/Customize-Preferences/ShowExt.md)
|
- [Show File Extensions](dev/tweaks/Customize-Preferences/ShowExt.md)
|
||||||
- [Show Hidden Files](../docs/dev/tweaks/Customize-Preferences/HiddenFiles.md)
|
- [Show Hidden Files](dev/tweaks/Customize-Preferences/HiddenFiles.md)
|
||||||
- [Snap Assist Flyout](../docs/dev/tweaks/Customize-Preferences/SnapFlyout.md)
|
- [Snap Assist Flyout](dev/tweaks/Customize-Preferences/SnapFlyout.md)
|
||||||
- [Snap Assist Suggestion](../docs/dev/tweaks/Customize-Preferences/SnapSuggestion.md)
|
- [Snap Assist Suggestion](dev/tweaks/Customize-Preferences/SnapSuggestion.md)
|
||||||
- [Snap Window](../docs/dev/tweaks/Customize-Preferences/SnapWindow.md)
|
- [Snap Window](dev/tweaks/Customize-Preferences/SnapWindow.md)
|
||||||
- [Sticky Keys](../docs/dev/tweaks/Customize-Preferences/StickyKeys.md)
|
- [Sticky Keys](dev/tweaks/Customize-Preferences/StickyKeys.md)
|
||||||
- [Task View Button in Taskbar](../docs/dev/tweaks/Customize-Preferences/TaskView.md)
|
- [Task View Button in Taskbar](dev/tweaks/Customize-Preferences/TaskView.md)
|
||||||
- [Verbose Messages During Logon](../docs/dev/tweaks/Customize-Preferences/VerboseLogon.md)
|
- [Verbose Messages During Logon](dev/tweaks/Customize-Preferences/VerboseLogon.md)
|
||||||
- [Widgets Button in Taskbar](../docs/dev/tweaks/Customize-Preferences/TaskbarWidgets.md)
|
- [Widgets Button in Taskbar](dev/tweaks/Customize-Preferences/TaskbarWidgets.md)
|
||||||
### Performance-Plans
|
### Performance-Plans
|
||||||
|
|
||||||
- [Add and Activate Ultimate Performance Profile](../docs/dev/tweaks/Performance-Plans/AddUltPerf.md)
|
- [Add and Activate Ultimate Performance Profile](dev/tweaks/Performance-Plans/AddUltPerf.md)
|
||||||
- [Remove Ultimate Performance Profile](../docs/dev/tweaks/Performance-Plans/RemoveUltPerf.md)
|
- [Remove Ultimate Performance Profile](dev/tweaks/Performance-Plans/RemoveUltPerf.md)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
### Fixes
|
|
||||||
|
|
||||||
- [Remove Adobe Creative Cloud](../docs/dev/features/Fixes/RunAdobeCCCleanerTool.md)
|
|
||||||
- [Reset Network](../docs/dev/features/Fixes/Network.md)
|
|
||||||
- [Reset Windows Update](../docs/dev/features/Fixes/Update.md)
|
|
||||||
- [Set Up Autologin](../docs/dev/features/Fixes/Autologin.md)
|
|
||||||
- [System Corruption Scan](../docs/dev/features/Fixes/DISM.md)
|
|
||||||
- [WinGet Reinstall](../docs/dev/features/Fixes/Winget.md)
|
|
||||||
### Legacy-Windows-Panels
|
### Legacy-Windows-Panels
|
||||||
|
|
||||||
- [Control Panel](../docs/dev/features/Legacy-Windows-Panels/control.md)
|
- [Control Panel](dev/features/Legacy-Windows-Panels/control.md)
|
||||||
- [Network Connections](../docs/dev/features/Legacy-Windows-Panels/network.md)
|
- [Network Connections](dev/features/Legacy-Windows-Panels/network.md)
|
||||||
- [Power Panel](../docs/dev/features/Legacy-Windows-Panels/power.md)
|
- [Power Panel](dev/features/Legacy-Windows-Panels/power.md)
|
||||||
- [Printer Settings](../docs/dev/features/Legacy-Windows-Panels/printer.md)
|
- [Region](dev/features/Legacy-Windows-Panels/region.md)
|
||||||
- [Region](../docs/dev/features/Legacy-Windows-Panels/region.md)
|
- [Sound Settings](dev/features/Legacy-Windows-Panels/sound.md)
|
||||||
- [Sound Settings](../docs/dev/features/Legacy-Windows-Panels/sound.md)
|
- [System Properties](dev/features/Legacy-Windows-Panels/system.md)
|
||||||
- [System Properties](../docs/dev/features/Legacy-Windows-Panels/system.md)
|
- [User Accounts](dev/features/Legacy-Windows-Panels/user.md)
|
||||||
- [User Accounts](../docs/dev/features/Legacy-Windows-Panels/user.md)
|
### Fixes
|
||||||
|
|
||||||
|
- [Remove Adobe Creative Cloud](dev/features/Fixes/RunAdobeCCCleanerTool.md)
|
||||||
|
- [Reset Network](dev/features/Fixes/Network.md)
|
||||||
|
- [Reset Windows Update](dev/features/Fixes/Update.md)
|
||||||
|
- [Set Up Autologin](dev/features/Fixes/Autologin.md)
|
||||||
|
- [System Corruption Scan](dev/features/Fixes/DISM.md)
|
||||||
|
- [WinGet Reinstall](dev/features/Fixes/Winget.md)
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- [All .Net Framework (2,3,4)](../docs/dev/features/Features/dotnet.md)
|
- [All .Net Framework (2,3,4)](dev/features/Features/dotnet.md)
|
||||||
- [Disable Legacy F8 Boot Recovery](../docs/dev/features/Features/DisableLegacyRecovery.md)
|
- [Disable Legacy F8 Boot Recovery](dev/features/Features/DisableLegacyRecovery.md)
|
||||||
- [Disable Search Box Web Suggestions in Registry(explorer restart)](../docs/dev/features/Features/DisableSearchSuggestions.md)
|
- [Disable Search Box Web Suggestions in Registry(explorer restart)](dev/features/Features/DisableSearchSuggestions.md)
|
||||||
- [Enable Daily Registry Backup Task 12.30am](../docs/dev/features/Features/RegBackup.md)
|
- [Enable Daily Registry Backup Task 12.30am](dev/features/Features/RegBackup.md)
|
||||||
- [Enable Legacy F8 Boot Recovery](../docs/dev/features/Features/EnableLegacyRecovery.md)
|
- [Enable Legacy F8 Boot Recovery](dev/features/Features/EnableLegacyRecovery.md)
|
||||||
- [Enable Search Box Web Suggestions in Registry(explorer restart)](../docs/dev/features/Features/EnableSearchSuggestions.md)
|
- [Enable Search Box Web Suggestions in Registry(explorer restart)](dev/features/Features/EnableSearchSuggestions.md)
|
||||||
- [HyperV Virtualization](../docs/dev/features/Features/hyperv.md)
|
- [HyperV Virtualization](dev/features/Features/hyperv.md)
|
||||||
- [Install Features](../docs/dev/features/Features/Install.md)
|
- [Install Features](dev/features/Features/Install.md)
|
||||||
- [Legacy Media (WMP, DirectPlay)](../docs/dev/features/Features/legacymedia.md)
|
- [Legacy Media (WMP, DirectPlay)](dev/features/Features/legacymedia.md)
|
||||||
- [NFS - Network File System](../docs/dev/features/Features/nfs.md)
|
- [NFS - Network File System](dev/features/Features/nfs.md)
|
||||||
- [Windows Sandbox](../docs/dev/features/Features/Sandbox.md)
|
- [Windows Sandbox](dev/features/Features/Sandbox.md)
|
||||||
- [Windows Subsystem for Linux](../docs/dev/features/Features/wsl.md)
|
- [Windows Subsystem for Linux](dev/features/Features/wsl.md)
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,11 +29,6 @@
|
|||||||
* Click the `Clear Selection` button.
|
* Click the `Clear Selection` button.
|
||||||
* This will unselect all checked programs.
|
* This will unselect all checked programs.
|
||||||
|
|
||||||
=== "prefer Chocolatey"
|
|
||||||
* Check the `prefer Chocolatey` checkbox
|
|
||||||
* By default Winutil will use winget to install/upgrade/remove packages and fallback to Chocolatey. This option reverses the preference.
|
|
||||||
* This preference will be used for all Buttons on the Install page and persist across Winutil restarts
|
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
!!! tip
|
!!! tip
|
||||||
|
92
functions/private/ConvertTo-Icon.ps1
Normal file
92
functions/private/ConvertTo-Icon.ps1
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
function ConvertTo-Icon {
|
||||||
|
<#
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
This function will convert BMP, GIF, EXIF, JPG, PNG and TIFF to ICO file
|
||||||
|
|
||||||
|
.PARAMETER bitmapPath
|
||||||
|
The file path to bitmap image to make '.ico' file out of.
|
||||||
|
Supported file types according to Microsoft Documentation is the following:
|
||||||
|
BMP, GIF, EXIF, JPG, PNG and TIFF.
|
||||||
|
|
||||||
|
.PARAMETER iconPath
|
||||||
|
The file path to write the new '.ico' resource.
|
||||||
|
|
||||||
|
.PARAMETER overrideIconFile
|
||||||
|
An optional boolean Parameter that makes the function overrides
|
||||||
|
the Icon File Path if the file exists. Defaults to $true.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
try {
|
||||||
|
ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath "$env:TEMP\cttlogo.ico"
|
||||||
|
} catch [System.IO.FileNotFoundException] {
|
||||||
|
# Handle the thrown exception here...
|
||||||
|
}
|
||||||
|
|
||||||
|
This Example makes a '.ico' file at "$env:TEMP\cttlogo.ico" File Path using the bitmap file
|
||||||
|
found in "$env:TEMP\cttlogo.png", the function overrides the '.ico' File if it's found.
|
||||||
|
this function will throw a FileNotFound Exception at the event of not finding the provided bitmap File Path.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
try {
|
||||||
|
ConvertTo-Icon "$env:TEMP\cttlogo.png" "$env:TEMP\cttlogo.ico"
|
||||||
|
} catch [System.IO.FileNotFoundException] {
|
||||||
|
# Handle the thrown exception here...
|
||||||
|
}
|
||||||
|
|
||||||
|
This Example is the same as Example 1, but uses Positional Parameters instead.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
if (Test-Path "$env:TEMP\cttlogo.png") {
|
||||||
|
ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath "$env:TEMP\cttlogo.ico"
|
||||||
|
}
|
||||||
|
|
||||||
|
This Example is same as Example 1, but checks if the bitmap File exists before calling 'ConvertTo-Icon' Function.
|
||||||
|
This's the recommended way of using this function, as it doesn't require any try-catch blocks.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
try {
|
||||||
|
ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath "$env:TEMP\cttlogo.ico" -overrideIconFile $false
|
||||||
|
} catch [System.IO.FileNotFoundException] {
|
||||||
|
# Handle the thrown exception here...
|
||||||
|
}
|
||||||
|
|
||||||
|
This Example make use of '-overrideIconFile' Optional Parameter, the default for this parameter is $true.
|
||||||
|
By doing '-overrideIconFile $false', the 'ConvertTo-Icon' function will raise an exception that needs to be catched throw a 'catch' Code Block,
|
||||||
|
otherwise it'll crash the running PowerShell instance/process.
|
||||||
|
|
||||||
|
#>
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory, position=0)]
|
||||||
|
[string]$bitmapPath,
|
||||||
|
[Parameter(Mandatory, position=1)]
|
||||||
|
[string]$iconPath,
|
||||||
|
[Parameter(position=2)]
|
||||||
|
[bool]$overrideIconFile = $true
|
||||||
|
)
|
||||||
|
|
||||||
|
Add-Type -AssemblyName System.Drawing
|
||||||
|
|
||||||
|
if (Test-Path $bitmapPath) {
|
||||||
|
if ((Test-Path $iconPath) -AND ($overrideIconFile -eq $false)) {
|
||||||
|
Write-Host "[ConvertTo-Icon] Icon File is found at '$iconPath', and the 'overrideIconFile' Parameter is set to '$overrideIconFile'. Skipping the bitmap to icon convertion..." -ForegroundColor Yellow
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load bitmap file into memory, and make an Icon version out of it
|
||||||
|
$b = [System.Drawing.Bitmap]::FromFile($bitmapPath)
|
||||||
|
$icon = [System.Drawing.Icon]::FromHandle($b.GetHicon())
|
||||||
|
|
||||||
|
# Create the folder for the new icon file if it doesn't exists
|
||||||
|
$iconFolder = (New-Object System.IO.FileInfo($iconPath)).Directory.FullName
|
||||||
|
[System.IO.Directory]::CreateDirectory($iconFolder) | Out-Null
|
||||||
|
|
||||||
|
# Write the Icon File and do some cleaning-up
|
||||||
|
$file = New-Object System.IO.FileStream($iconPath, 'OpenOrCreate')
|
||||||
|
$icon.Save($file)
|
||||||
|
$file.Close()
|
||||||
|
$icon.Dispose()
|
||||||
|
} else {
|
||||||
|
throw [System.IO.FileNotFoundException] "[ConvertTo-Icon] The provided bitmap File Path is not found at '$bitmapPath'."
|
||||||
|
}
|
||||||
|
}
|
221
functions/private/Get-TabXaml.ps1
Normal file
221
functions/private/Get-TabXaml.ps1
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
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
|
||||||
|
. "$($sync.PSScriptRoot)\functions\private\Get-WPFObjectName.ps1"
|
||||||
|
|
||||||
|
$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)
|
||||||
|
}
|
@ -13,11 +13,10 @@ function Install-WinUtilChoco {
|
|||||||
if((Test-WinUtilPackageManager -choco) -eq "installed") {
|
if((Test-WinUtilPackageManager -choco) -eq "installed") {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
# Install logic taken from https://chocolatey.org/install#individual
|
|
||||||
Write-Host "Seems Chocolatey is not installed, installing now."
|
Write-Host "Seems Chocolatey is not installed, installing now."
|
||||||
Set-ExecutionPolicy Bypass -Scope Process -Force;
|
Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) -ErrorAction Stop
|
||||||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
|
powershell choco feature enable -n allowGlobalConfirmation
|
||||||
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
|
|
||||||
|
|
||||||
} catch {
|
} catch {
|
||||||
Write-Host "===========================================" -Foregroundcolor Red
|
Write-Host "===========================================" -Foregroundcolor Red
|
||||||
|
@ -1,258 +1,102 @@
|
|||||||
function Install-WinUtilProgramChoco {
|
function Install-WinUtilProgramChoco {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Manages the installation or uninstallation of a list of Chocolatey packages.
|
Manages the provided programs using Chocolatey
|
||||||
|
|
||||||
.PARAMETER Programs
|
.PARAMETER ProgramsToInstall
|
||||||
A string array containing the programs to be installed or uninstalled.
|
A list of programs to manage
|
||||||
|
|
||||||
.PARAMETER Action
|
.PARAMETER manage
|
||||||
Specifies the action to perform: "Install" or "Uninstall". The default value is "Install".
|
The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
|
||||||
|
|
||||||
.DESCRIPTION
|
.NOTES
|
||||||
This function processes a list of programs to be managed using Chocolatey. Depending on the specified action, it either installs or uninstalls each program in the list, updating the taskbar progress accordingly. After all operations are completed, temporary output files are cleaned up.
|
The triple quotes are required any time you need a " in a normal script block.
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
Install-WinUtilProgramChoco -Programs @("7zip","chrome") -Action "Uninstall"
|
|
||||||
#>
|
#>
|
||||||
|
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory, Position = 0)]
|
[Parameter(Mandatory, Position=0)]
|
||||||
[string[]]$Programs,
|
[PsCustomObject]$ProgramsToInstall,
|
||||||
|
|
||||||
[Parameter(Position = 1)]
|
[Parameter(Position=1)]
|
||||||
[String]$Action = "Install"
|
[String]$manage = "Installing"
|
||||||
)
|
)
|
||||||
|
|
||||||
function Initialize-OutputFile {
|
$x = 0
|
||||||
<#
|
$count = $ProgramsToInstall.Count
|
||||||
.SYNOPSIS
|
|
||||||
Initializes an output file by removing any existing file and creating a new, empty file at the specified path.
|
|
||||||
|
|
||||||
.PARAMETER filePath
|
# This check isn't really necessary, as there's a couple of checks before this Private Function gets called, but just to make sure ;)
|
||||||
The full path to the file to be initialized.
|
if($count -le 0) {
|
||||||
|
throw "Private Function 'Install-WinUtilProgramChoco' expected Parameter 'ProgramsToInstall' to be of size 1 or greater, instead got $count,`nPlease double check your code and re-compile WinUtil."
|
||||||
.DESCRIPTION
|
|
||||||
This function ensures that the specified file is reset by removing any existing file at the provided path and then creating a new, empty file. It is useful when preparing a log or output file for subsequent operations.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
Initialize-OutputFile -filePath "C:\temp\output.txt"
|
|
||||||
#>
|
|
||||||
|
|
||||||
param ($filePath)
|
|
||||||
Remove-Item -Path $filePath -Force -ErrorAction SilentlyContinue
|
|
||||||
New-Item -ItemType File -Path $filePath | Out-Null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Run-ChocoCommand {
|
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
|
||||||
<#
|
Write-Host "==========================================="
|
||||||
.SYNOPSIS
|
Write-Host "-- Configuring Chocolatey pacakages ---"
|
||||||
Executes a Chocolatey command with the specified arguments and returns the exit code.
|
Write-Host "==========================================="
|
||||||
|
Foreach ($Program in $ProgramsToInstall) {
|
||||||
.PARAMETER arguments
|
Write-Progress -Activity "$manage Applications" -Status "$manage $($Program.choco) $($x + 1) of $count" -PercentComplete $($x/$count*100)
|
||||||
The arguments to be passed to the Chocolatey command.
|
if($manage -eq "Installing") {
|
||||||
|
write-host "Starting install of $($Program.choco) with Chocolatey."
|
||||||
.DESCRIPTION
|
|
||||||
This function runs a specified Chocolatey command by passing the provided arguments to the `choco` executable. It waits for the process to complete and then returns the exit code, allowing the caller to determine success or failure based on the exit code.
|
|
||||||
|
|
||||||
.RETURNS
|
|
||||||
[int]
|
|
||||||
The exit code of the Chocolatey command.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
$exitCode = Run-ChocoCommand -arguments "install 7zip -y"
|
|
||||||
#>
|
|
||||||
|
|
||||||
param ($arguments)
|
|
||||||
return (Start-Process -FilePath "choco" -ArgumentList $arguments -Wait -PassThru).ExitCode
|
|
||||||
}
|
|
||||||
|
|
||||||
function Check-UpgradeNeeded {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Checks if an upgrade is needed for a Chocolatey package based on the content of a log file.
|
|
||||||
|
|
||||||
.PARAMETER filePath
|
|
||||||
The path to the log file that contains the output of a Chocolatey install command.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This function reads the specified log file and checks for keywords that indicate whether an upgrade is needed. It returns a boolean value indicating whether the terms "reinstall" or "already installed" are present, which suggests that the package might need an upgrade.
|
|
||||||
|
|
||||||
.RETURNS
|
|
||||||
[bool]
|
|
||||||
True if the log file indicates that an upgrade is needed; otherwise, false.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
$isUpgradeNeeded = Check-UpgradeNeeded -filePath "C:\temp\install-output.txt"
|
|
||||||
#>
|
|
||||||
|
|
||||||
param ($filePath)
|
|
||||||
return Get-Content -Path $filePath | Select-String -Pattern "reinstall|already installed" -Quiet
|
|
||||||
}
|
|
||||||
|
|
||||||
function Update-TaskbarProgress {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Updates the taskbar progress based on the current installation progress.
|
|
||||||
|
|
||||||
.PARAMETER currentIndex
|
|
||||||
The current index of the program being installed or uninstalled.
|
|
||||||
|
|
||||||
.PARAMETER totalPrograms
|
|
||||||
The total number of programs to be installed or uninstalled.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This function calculates the progress of the installation or uninstallation process and updates the taskbar accordingly. The taskbar is set to "Normal" if all programs have been processed, otherwise, it is set to "Error" as a placeholder.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
Update-TaskbarProgress -currentIndex 3 -totalPrograms 10
|
|
||||||
#>
|
|
||||||
|
|
||||||
param (
|
|
||||||
[int]$currentIndex,
|
|
||||||
[int]$totalPrograms
|
|
||||||
)
|
|
||||||
$progressState = if ($currentIndex -eq $totalPrograms) { "Normal" } else { "Error" }
|
|
||||||
$sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state $progressState -value ($currentIndex / $totalPrograms) })
|
|
||||||
}
|
|
||||||
|
|
||||||
function Install-ChocoPackage {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Installs a Chocolatey package and optionally upgrades it if needed.
|
|
||||||
|
|
||||||
.PARAMETER Program
|
|
||||||
A string containing the name of the Chocolatey package to be installed.
|
|
||||||
|
|
||||||
.PARAMETER currentIndex
|
|
||||||
The current index of the program in the list of programs to be managed.
|
|
||||||
|
|
||||||
.PARAMETER totalPrograms
|
|
||||||
The total number of programs to be installed.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This function installs a Chocolatey package by running the `choco install` command. If the installation output indicates that an upgrade might be needed, the function will attempt to upgrade the package. The taskbar progress is updated after each package is processed.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
Install-ChocoPackage -Program $Program -currentIndex 0 -totalPrograms 5
|
|
||||||
#>
|
|
||||||
|
|
||||||
param (
|
|
||||||
[string]$Program,
|
|
||||||
[int]$currentIndex,
|
|
||||||
[int]$totalPrograms
|
|
||||||
)
|
|
||||||
|
|
||||||
$installOutputFile = "$env:TEMP\Install-WinUtilProgramChoco.install-command.output.txt"
|
|
||||||
Initialize-OutputFile $installOutputFile
|
|
||||||
|
|
||||||
Write-Host "Starting installation of $Program with Chocolatey."
|
|
||||||
|
|
||||||
try {
|
|
||||||
$installStatusCode = Run-ChocoCommand "install $Program -y --log-file $installOutputFile"
|
|
||||||
if ($installStatusCode -eq 0) {
|
|
||||||
|
|
||||||
if (Check-UpgradeNeeded $installOutputFile) {
|
|
||||||
$upgradeStatusCode = Run-ChocoCommand "upgrade $Program -y"
|
|
||||||
Write-Host "$Program was" $(if ($upgradeStatusCode -eq 0) { "upgraded successfully." } else { "not upgraded." })
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Host "$Program installed successfully."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Host "Failed to install $Program."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "Failed to install $Program due to an error: $_"
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
Update-TaskbarProgress $currentIndex $totalPrograms
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Uninstall-ChocoPackage {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Uninstalls a Chocolatey package and any related metapackages.
|
|
||||||
|
|
||||||
.PARAMETER Program
|
|
||||||
A string containing the name of the Chocolatey package to be uninstalled.
|
|
||||||
|
|
||||||
.PARAMETER currentIndex
|
|
||||||
The current index of the program in the list of programs to be managed.
|
|
||||||
|
|
||||||
.PARAMETER totalPrograms
|
|
||||||
The total number of programs to be uninstalled.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This function uninstalls a Chocolatey package and any related metapackages (e.g., .install or .portable variants). It updates the taskbar progress after processing each package.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
Uninstall-ChocoPackage -Program $Program -currentIndex 0 -totalPrograms 5
|
|
||||||
#>
|
|
||||||
|
|
||||||
param (
|
|
||||||
[string]$Program,
|
|
||||||
[int]$currentIndex,
|
|
||||||
[int]$totalPrograms
|
|
||||||
)
|
|
||||||
|
|
||||||
$uninstallOutputFile = "$env:TEMP\Install-WinUtilProgramChoco.uninstall-command.output.txt"
|
|
||||||
Initialize-OutputFile $uninstallOutputFile
|
|
||||||
|
|
||||||
Write-Host "Searching for metapackages of $Program (.install or .portable)"
|
|
||||||
$chocoPackages = ((choco list | Select-String -Pattern "$Program(\.install|\.portable)?").Matches.Value) -join " "
|
|
||||||
if ($chocoPackages) {
|
|
||||||
Write-Host "Starting uninstallation of $chocoPackages with Chocolatey."
|
|
||||||
try {
|
try {
|
||||||
$uninstallStatusCode = Run-ChocoCommand "uninstall $chocoPackages -y"
|
$tryUpgrade = $false
|
||||||
Write-Host "$Program" $(if ($uninstallStatusCode -eq 0) { "uninstalled successfully." } else { "failed to uninstall." })
|
$installOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.install-command.output.txt"
|
||||||
|
New-Item -ItemType File -Path $installOutputFilePath
|
||||||
|
$chocoInstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "install $($Program.choco) -y" -Wait -PassThru -RedirectStandardOutput $installOutputFilePath).ExitCode
|
||||||
|
if(($chocoInstallStatus -eq 0) -AND (Test-Path -Path $installOutputFilePath)) {
|
||||||
|
$keywordsFound = Get-Content -Path $installOutputFilePath | Where-Object {$_ -match "reinstall" -OR $_ -match "already installed"}
|
||||||
|
if ($keywordsFound) {
|
||||||
|
$tryUpgrade = $true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch {
|
# TODO: Implement the Upgrade part using 'choco upgrade' command, this will make choco consistent with WinGet, as WinGet tries to Upgrade when you use the install command.
|
||||||
Write-Host "Failed to uninstall $Program due to an error: $_"
|
if ($tryUpgrade) {
|
||||||
}
|
throw "Automatic Upgrade for Choco isn't implemented yet, a feature to make it consistent with WinGet, the install command using choco simply failed because $($Program.choco) is already installed."
|
||||||
finally {
|
}
|
||||||
Update-TaskbarProgress $currentIndex $totalPrograms
|
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) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Write-Host "$Program is not installed."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$totalPrograms = $Programs.Count
|
if($manage -eq "Uninstalling") {
|
||||||
if ($totalPrograms -le 0) {
|
write-host "Starting uninstall of $($Program.choco) with Chocolatey."
|
||||||
throw "Parameter 'Programs' must have at least one item."
|
try {
|
||||||
}
|
$uninstallOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.uninstall-command.output.txt"
|
||||||
|
New-Item -ItemType File -Path $uninstallOutputFilePath
|
||||||
Write-Host "==========================================="
|
$chocoUninstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "uninstall $($Program.choco) -y" -Wait -PassThru).ExitCode
|
||||||
Write-Host "-- Configuring Chocolatey packages ---"
|
if($chocoUninstallStatus -eq 0) {
|
||||||
Write-Host "==========================================="
|
Write-Host "$($Program.choco) uninstalled successfully using Chocolatey."
|
||||||
|
$x++
|
||||||
for ($currentIndex = 0; $currentIndex -lt $totalPrograms; $currentIndex++) {
|
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value ($x/$count) })
|
||||||
$Program = $Programs[$currentIndex]
|
continue
|
||||||
Set-WinUtilProgressBar -label "$Action $($Program)" -percent ($currentIndex / $totalPrograms * 100)
|
} else {
|
||||||
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($currentIndex / $totalPrograms)})
|
Write-Host "Failed to uninstall $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $uninstallOutputFilePath)."
|
||||||
|
$x++
|
||||||
switch ($Action) {
|
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) })
|
||||||
"Install" {
|
}
|
||||||
Install-ChocoPackage -Program $Program -currentIndex $currentIndex -totalPrograms $totalPrograms
|
} 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) })
|
||||||
}
|
}
|
||||||
"Uninstall" {
|
|
||||||
Uninstall-ChocoPackage -Program $Program -currentIndex $currentIndex -totalPrograms $totalPrograms
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
throw "Invalid action parameter value: '$Action'."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Set-WinUtilProgressBar -label "$($Action)ation done" -percent 100
|
|
||||||
# Cleanup Output Files
|
|
||||||
$outputFiles = @("$env:TEMP\Install-WinUtilProgramChoco.install-command.output.txt", "$env:TEMP\Install-WinUtilProgramChoco.uninstall-command.output.txt")
|
|
||||||
foreach ($filePath in $outputFiles) {
|
|
||||||
Remove-Item -Path $filePath -Force -ErrorAction SilentlyContinue
|
|
||||||
}
|
}
|
||||||
|
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
|
||||||
|
|
||||||
|
# Cleanup leftovers files
|
||||||
|
if(Test-Path -Path $installOutputFilePath) { Remove-Item -Path $installOutputFilePath }
|
||||||
|
if(Test-Path -Path $uninstallOutputFilePath) { Remove-Item -Path $uninstallOutputFilePath }
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,199 +0,0 @@
|
|||||||
function Invoke-WinUtilAssets {
|
|
||||||
param (
|
|
||||||
$type,
|
|
||||||
$Size,
|
|
||||||
[switch]$render
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create the Viewbox and set its size
|
|
||||||
$LogoViewbox = New-Object Windows.Controls.Viewbox
|
|
||||||
$LogoViewbox.Width = $Size
|
|
||||||
$LogoViewbox.Height = $Size
|
|
||||||
|
|
||||||
# Create a Canvas to hold the paths
|
|
||||||
$canvas = New-Object Windows.Controls.Canvas
|
|
||||||
$canvas.Width = 100
|
|
||||||
$canvas.Height = 100
|
|
||||||
|
|
||||||
# Define a scale factor for the content inside the Canvas
|
|
||||||
$scaleFactor = $Size / 100
|
|
||||||
|
|
||||||
# Apply a scale transform to the Canvas content
|
|
||||||
$scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor)
|
|
||||||
$canvas.LayoutTransform = $scaleTransform
|
|
||||||
|
|
||||||
switch ($type) {
|
|
||||||
'logo' {
|
|
||||||
$LogoPathData1 = @"
|
|
||||||
M 18.00,14.00
|
|
||||||
C 18.00,14.00 45.00,27.74 45.00,27.74
|
|
||||||
45.00,27.74 57.40,34.63 57.40,34.63
|
|
||||||
57.40,34.63 59.00,43.00 59.00,43.00
|
|
||||||
59.00,43.00 59.00,83.00 59.00,83.00
|
|
||||||
55.35,81.66 46.99,77.79 44.72,74.79
|
|
||||||
41.17,70.10 42.01,59.80 42.00,54.00
|
|
||||||
42.00,51.62 42.20,48.29 40.98,46.21
|
|
||||||
38.34,41.74 25.78,38.60 21.28,33.79
|
|
||||||
16.81,29.02 18.00,20.20 18.00,14.00 Z
|
|
||||||
"@
|
|
||||||
$LogoPath1 = New-Object Windows.Shapes.Path
|
|
||||||
$LogoPath1.Data = [Windows.Media.Geometry]::Parse($LogoPathData1)
|
|
||||||
$LogoPath1.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#0567ff")
|
|
||||||
|
|
||||||
$LogoPathData2 = @"
|
|
||||||
M 107.00,14.00
|
|
||||||
C 109.01,19.06 108.93,30.37 104.66,34.21
|
|
||||||
100.47,37.98 86.38,43.10 84.60,47.21
|
|
||||||
83.94,48.74 84.01,51.32 84.00,53.00
|
|
||||||
83.97,57.04 84.46,68.90 83.26,72.00
|
|
||||||
81.06,77.70 72.54,81.42 67.00,83.00
|
|
||||||
67.00,83.00 67.00,43.00 67.00,43.00
|
|
||||||
67.00,43.00 67.99,35.63 67.99,35.63
|
|
||||||
67.99,35.63 80.00,28.26 80.00,28.26
|
|
||||||
80.00,28.26 107.00,14.00 107.00,14.00 Z
|
|
||||||
"@
|
|
||||||
$LogoPath2 = New-Object Windows.Shapes.Path
|
|
||||||
$LogoPath2.Data = [Windows.Media.Geometry]::Parse($LogoPathData2)
|
|
||||||
$LogoPath2.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#0567ff")
|
|
||||||
|
|
||||||
$LogoPathData3 = @"
|
|
||||||
M 19.00,46.00
|
|
||||||
C 21.36,47.14 28.67,50.71 30.01,52.63
|
|
||||||
31.17,54.30 30.99,57.04 31.00,59.00
|
|
||||||
31.04,65.41 30.35,72.16 33.56,78.00
|
|
||||||
38.19,86.45 46.10,89.04 54.00,93.31
|
|
||||||
56.55,94.69 60.10,97.20 63.00,97.22
|
|
||||||
65.50,97.24 68.77,95.36 71.00,94.25
|
|
||||||
76.42,91.55 84.51,87.78 88.82,83.68
|
|
||||||
94.56,78.20 95.96,70.59 96.00,63.00
|
|
||||||
96.01,60.24 95.59,54.63 97.02,52.39
|
|
||||||
98.80,49.60 103.95,47.87 107.00,47.00
|
|
||||||
107.00,47.00 107.00,67.00 107.00,67.00
|
|
||||||
106.90,87.69 96.10,93.85 80.00,103.00
|
|
||||||
76.51,104.98 66.66,110.67 63.00,110.52
|
|
||||||
60.33,110.41 55.55,107.53 53.00,106.25
|
|
||||||
46.21,102.83 36.63,98.57 31.04,93.68
|
|
||||||
16.88,81.28 19.00,62.88 19.00,46.00 Z
|
|
||||||
"@
|
|
||||||
$LogoPath3 = New-Object Windows.Shapes.Path
|
|
||||||
$LogoPath3.Data = [Windows.Media.Geometry]::Parse($LogoPathData3)
|
|
||||||
$LogoPath3.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#a3a4a6")
|
|
||||||
|
|
||||||
$canvas.Children.Add($LogoPath1) | Out-Null
|
|
||||||
$canvas.Children.Add($LogoPath2) | Out-Null
|
|
||||||
$canvas.Children.Add($LogoPath3) | Out-Null
|
|
||||||
}
|
|
||||||
'checkmark' {
|
|
||||||
$canvas.Width = 512
|
|
||||||
$canvas.Height = 512
|
|
||||||
|
|
||||||
$scaleFactor = $Size / 2.54
|
|
||||||
$scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor)
|
|
||||||
$canvas.LayoutTransform = $scaleTransform
|
|
||||||
|
|
||||||
# Define the circle path
|
|
||||||
$circlePathData = "M 1.27,0 A 1.27,1.27 0 1,0 1.27,2.54 A 1.27,1.27 0 1,0 1.27,0"
|
|
||||||
$circlePath = New-Object Windows.Shapes.Path
|
|
||||||
$circlePath.Data = [Windows.Media.Geometry]::Parse($circlePathData)
|
|
||||||
$circlePath.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#39ba00")
|
|
||||||
|
|
||||||
# Define the checkmark path
|
|
||||||
$checkmarkPathData = "M 0.873 1.89 L 0.41 1.391 A 0.17 0.17 0 0 1 0.418 1.151 A 0.17 0.17 0 0 1 0.658 1.16 L 1.016 1.543 L 1.583 1.013 A 0.17 0.17 0 0 1 1.599 1 L 1.865 0.751 A 0.17 0.17 0 0 1 2.105 0.759 A 0.17 0.17 0 0 1 2.097 0.999 L 1.282 1.759 L 0.999 2.022 L 0.874 1.888 Z"
|
|
||||||
$checkmarkPath = New-Object Windows.Shapes.Path
|
|
||||||
$checkmarkPath.Data = [Windows.Media.Geometry]::Parse($checkmarkPathData)
|
|
||||||
$checkmarkPath.Fill = [Windows.Media.Brushes]::White
|
|
||||||
|
|
||||||
# Add the paths to the Canvas
|
|
||||||
$canvas.Children.Add($circlePath) | Out-Null
|
|
||||||
$canvas.Children.Add($checkmarkPath) | Out-Null
|
|
||||||
}
|
|
||||||
'warning' {
|
|
||||||
$canvas.Width = 512
|
|
||||||
$canvas.Height = 512
|
|
||||||
|
|
||||||
# Define a scale factor for the content inside the Canvas
|
|
||||||
$scaleFactor = $Size / 512 # Adjust scaling based on the canvas size
|
|
||||||
$scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor)
|
|
||||||
$canvas.LayoutTransform = $scaleTransform
|
|
||||||
|
|
||||||
# Define the circle path
|
|
||||||
$circlePathData = "M 256,0 A 256,256 0 1,0 256,512 A 256,256 0 1,0 256,0"
|
|
||||||
$circlePath = New-Object Windows.Shapes.Path
|
|
||||||
$circlePath.Data = [Windows.Media.Geometry]::Parse($circlePathData)
|
|
||||||
$circlePath.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#f41b43")
|
|
||||||
|
|
||||||
# Define the exclamation mark path
|
|
||||||
$exclamationPathData = "M 256 307.2 A 35.89 35.89 0 0 1 220.14 272.74 L 215.41 153.3 A 35.89 35.89 0 0 1 251.27 116 H 260.73 A 35.89 35.89 0 0 1 296.59 153.3 L 291.86 272.74 A 35.89 35.89 0 0 1 256 307.2 Z"
|
|
||||||
$exclamationPath = New-Object Windows.Shapes.Path
|
|
||||||
$exclamationPath.Data = [Windows.Media.Geometry]::Parse($exclamationPathData)
|
|
||||||
$exclamationPath.Fill = [Windows.Media.Brushes]::White
|
|
||||||
|
|
||||||
# Get the bounds of the exclamation mark path
|
|
||||||
$exclamationBounds = $exclamationPath.Data.Bounds
|
|
||||||
|
|
||||||
# Calculate the center position for the exclamation mark path
|
|
||||||
$exclamationCenterX = ($canvas.Width - $exclamationBounds.Width) / 2 - $exclamationBounds.X
|
|
||||||
$exclamationPath.SetValue([Windows.Controls.Canvas]::LeftProperty, $exclamationCenterX)
|
|
||||||
|
|
||||||
# Define the rounded rectangle at the bottom (dot of exclamation mark)
|
|
||||||
$roundedRectangle = New-Object Windows.Shapes.Rectangle
|
|
||||||
$roundedRectangle.Width = 80
|
|
||||||
$roundedRectangle.Height = 80
|
|
||||||
$roundedRectangle.RadiusX = 30
|
|
||||||
$roundedRectangle.RadiusY = 30
|
|
||||||
$roundedRectangle.Fill = [Windows.Media.Brushes]::White
|
|
||||||
|
|
||||||
# Calculate the center position for the rounded rectangle
|
|
||||||
$centerX = ($canvas.Width - $roundedRectangle.Width) / 2
|
|
||||||
$roundedRectangle.SetValue([Windows.Controls.Canvas]::LeftProperty, $centerX)
|
|
||||||
$roundedRectangle.SetValue([Windows.Controls.Canvas]::TopProperty, 324.34)
|
|
||||||
|
|
||||||
# Add the paths to the Canvas
|
|
||||||
$canvas.Children.Add($circlePath) | Out-Null
|
|
||||||
$canvas.Children.Add($exclamationPath) | Out-Null
|
|
||||||
$canvas.Children.Add($roundedRectangle) | Out-Null
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
Write-Host "Invalid type: $type"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add the Canvas to the Viewbox
|
|
||||||
$LogoViewbox.Child = $canvas
|
|
||||||
|
|
||||||
if ($render) {
|
|
||||||
# Measure and arrange the canvas to ensure proper rendering
|
|
||||||
$canvas.Measure([Windows.Size]::new($canvas.Width, $canvas.Height))
|
|
||||||
$canvas.Arrange([Windows.Rect]::new(0, 0, $canvas.Width, $canvas.Height))
|
|
||||||
$canvas.UpdateLayout()
|
|
||||||
|
|
||||||
# Initialize RenderTargetBitmap correctly with dimensions
|
|
||||||
$renderTargetBitmap = New-Object Windows.Media.Imaging.RenderTargetBitmap($canvas.Width, $canvas.Height, 96, 96, [Windows.Media.PixelFormats]::Pbgra32)
|
|
||||||
|
|
||||||
# Render the canvas to the bitmap
|
|
||||||
$renderTargetBitmap.Render($canvas)
|
|
||||||
|
|
||||||
# Create a BitmapFrame from the RenderTargetBitmap
|
|
||||||
$bitmapFrame = [Windows.Media.Imaging.BitmapFrame]::Create($renderTargetBitmap)
|
|
||||||
|
|
||||||
# Create a PngBitmapEncoder and add the frame
|
|
||||||
$bitmapEncoder = [Windows.Media.Imaging.PngBitmapEncoder]::new()
|
|
||||||
$bitmapEncoder.Frames.Add($bitmapFrame)
|
|
||||||
|
|
||||||
# Save to a memory stream
|
|
||||||
$imageStream = New-Object System.IO.MemoryStream
|
|
||||||
$bitmapEncoder.Save($imageStream)
|
|
||||||
$imageStream.Position = 0
|
|
||||||
|
|
||||||
# Load the stream into a BitmapImage
|
|
||||||
$bitmapImage = [Windows.Media.Imaging.BitmapImage]::new()
|
|
||||||
$bitmapImage.BeginInit()
|
|
||||||
$bitmapImage.StreamSource = $imageStream
|
|
||||||
$bitmapImage.CacheOption = [Windows.Media.Imaging.BitmapCacheOption]::OnLoad
|
|
||||||
$bitmapImage.EndInit()
|
|
||||||
|
|
||||||
return $bitmapImage
|
|
||||||
} else {
|
|
||||||
return $LogoViewbox
|
|
||||||
}
|
|
||||||
}
|
|
@ -13,16 +13,6 @@ Function Invoke-WinUtilCurrentSystem {
|
|||||||
param(
|
param(
|
||||||
$CheckBox
|
$CheckBox
|
||||||
)
|
)
|
||||||
if ($CheckBox -eq "choco") {
|
|
||||||
$apps = (choco list | Select-String -Pattern "^\S+").Matches.Value
|
|
||||||
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
|
|
||||||
$sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
|
|
||||||
$dependencies = @($sync.configs.applications.$($psitem.Key).choco -split ";")
|
|
||||||
if ($dependencies -in $apps) {
|
|
||||||
Write-Output $psitem.name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($checkbox -eq "winget") {
|
if ($checkbox -eq "winget") {
|
||||||
|
|
||||||
|
@ -7,9 +7,7 @@ function Invoke-WinUtilGPU {
|
|||||||
"*NVIDIA GeForce*Laptop*",
|
"*NVIDIA GeForce*Laptop*",
|
||||||
"*NVIDIA GeForce*GT*",
|
"*NVIDIA GeForce*GT*",
|
||||||
"*AMD Radeon(TM)*",
|
"*AMD Radeon(TM)*",
|
||||||
"*Intel(R) HD Graphics*",
|
|
||||||
"*UHD*"
|
"*UHD*"
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach ($gpu in $gpuInfo) {
|
foreach ($gpu in $gpuInfo) {
|
||||||
|
@ -37,30 +37,28 @@ function Remove-Features() {
|
|||||||
Remove-Features
|
Remove-Features
|
||||||
#>
|
#>
|
||||||
try {
|
try {
|
||||||
$featlist = (Get-WindowsOptionalFeature -Path $scratchDir)
|
$featlist = (Get-WindowsOptionalFeature -Path $scratchDir).FeatureName
|
||||||
|
|
||||||
$featlist = $featlist | Where-Object {
|
$featlist = $featlist | Where-Object {
|
||||||
$_.FeatureName -NotLike "*Defender*" -AND
|
$_ -NotLike "*Defender*" -AND
|
||||||
$_.FeatureName -NotLike "*Printing*" -AND
|
$_ -NotLike "*Printing*" -AND
|
||||||
$_.FeatureName -NotLike "*TelnetClient*" -AND
|
$_ -NotLike "*TelnetClient*" -AND
|
||||||
$_.FeatureName -NotLike "*PowerShell*" -AND
|
$_ -NotLike "*PowerShell*" -AND
|
||||||
$_.FeatureName -NotLike "*NetFx*" -AND
|
$_ -NotLike "*NetFx*" -AND
|
||||||
$_.FeatureName -NotLike "*Media*" -AND
|
$_ -NotLike "*Media*" -AND
|
||||||
$_.FeatureName -NotLike "*NFS*" -AND
|
$_ -NotLike "*NFS*"
|
||||||
$_.State -ne "Disabled"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($feature in $featlist) {
|
foreach($feature in $featlist) {
|
||||||
$status = "Removing feature $($feature.FeatureName)"
|
$status = "Removing feature $feature"
|
||||||
Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100)
|
Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100)
|
||||||
Write-Debug "Removing feature $($feature.FeatureName)"
|
Write-Debug "Removing feature $feature"
|
||||||
Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $($feature.FeatureName) -Remove -ErrorAction SilentlyContinue -NoRestart
|
Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $feature -Remove -ErrorAction SilentlyContinue -NoRestart
|
||||||
}
|
}
|
||||||
Write-Progress -Activity "Removing features" -Status "Ready" -Completed
|
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."
|
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 {
|
} catch {
|
||||||
Write-Host "Unable to get information about the features. MicroWin processing will continue, but features will not be processed"
|
Write-Host "Unable to get information about the features. MicroWin processing will continue, but features will not be processed"
|
||||||
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,8 +106,6 @@ function Remove-Packages {
|
|||||||
$_ -NotLike "*Wifi*"
|
$_ -NotLike "*Wifi*"
|
||||||
}
|
}
|
||||||
|
|
||||||
$failedCount = 0
|
|
||||||
|
|
||||||
foreach ($pkg in $pkglist) {
|
foreach ($pkg in $pkglist) {
|
||||||
try {
|
try {
|
||||||
$status = "Removing $pkg"
|
$status = "Removing $pkg"
|
||||||
@ -118,18 +114,12 @@ function Remove-Packages {
|
|||||||
} catch {
|
} catch {
|
||||||
# This can happen if the package that is being removed is a permanent one, like FodMetadata
|
# This can happen if the package that is being removed is a permanent one, like FodMetadata
|
||||||
Write-Host "Could not remove OS package $($pkg)"
|
Write-Host "Could not remove OS package $($pkg)"
|
||||||
$failedCount += 1
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Write-Progress -Activity "Removing Apps" -Status "Ready" -Completed
|
Write-Progress -Activity "Removing Apps" -Status "Ready" -Completed
|
||||||
if ($failedCount -gt 0)
|
|
||||||
{
|
|
||||||
Write-Host "Some packages could not be removed. Do not worry: your image will still work fine. This can happen if the package is permanent or has been superseded by a newer one."
|
|
||||||
}
|
|
||||||
} catch {
|
} catch {
|
||||||
Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
|
Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
|
||||||
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,7 +175,6 @@ function Remove-ProvisionedPackages() {
|
|||||||
{
|
{
|
||||||
# This can happen if getting AppX packages fails
|
# This can happen if getting AppX packages fails
|
||||||
Write-Host "Unable to get information about the AppX packages. MicroWin processing will continue, but AppX packages will not be processed"
|
Write-Host "Unable to get information about the AppX packages. MicroWin processing will continue, but AppX packages will not be processed"
|
||||||
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,8 +248,8 @@ function Remove-FileOrDirectory([string]$pathToDelete, [string]$mask = "", [swit
|
|||||||
function New-Unattend {
|
function New-Unattend {
|
||||||
|
|
||||||
param (
|
param (
|
||||||
[Parameter(Mandatory, Position = 0)] [string]$userName,
|
[Parameter(Mandatory, Position = 0)] [string] $userName,
|
||||||
[Parameter(Position = 1)] [string]$userPassword
|
[Parameter(Position = 1)] [string] $userPassword
|
||||||
)
|
)
|
||||||
|
|
||||||
$unattend = @'
|
$unattend = @'
|
||||||
|
@ -14,7 +14,7 @@ function Invoke-WinUtilSnapFlyout {
|
|||||||
Write-Host "Disabling Snap Assist Flyout On startup"
|
Write-Host "Disabling Snap Assist Flyout On startup"
|
||||||
$value = 0
|
$value = 0
|
||||||
}
|
}
|
||||||
|
# taskkill.exe /F /IM "explorer.exe"
|
||||||
$Path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
|
$Path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
|
||||||
taskkill.exe /F /IM "explorer.exe"
|
taskkill.exe /F /IM "explorer.exe"
|
||||||
Set-ItemProperty -Path $Path -Name EnableSnapAssistFlyout -Value $value
|
Set-ItemProperty -Path $Path -Name EnableSnapAssistFlyout -Value $value
|
||||||
|
@ -59,8 +59,8 @@ function Invoke-WinUtilTweaks {
|
|||||||
Write-Debug "Service $($service.Name) was changed in the past to $($service.StartType.ToString()) from it's original type of $($psitem.$($values.OriginalService)), will not change it to $($psitem.$($values.service))"
|
Write-Debug "Service $($service.Name) was changed in the past to $($service.StartType.ToString()) from it's original type of $($psitem.$($values.OriginalService)), will not change it to $($psitem.$($values.service))"
|
||||||
$changeservice = $false
|
$changeservice = $false
|
||||||
}
|
}
|
||||||
} catch [System.ServiceProcess.ServiceNotFoundException] {
|
} catch {
|
||||||
Write-Warning "Service $($psitem.Name) was not found"
|
write-host "Unable to get service $($psitem.Name)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Function Install-WinUtilProgramWinget {
|
Function Invoke-WinUtilWingetProgram {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Runs the designated action on the provided programs using Winget
|
Runs the designated action on the provided programs using Winget
|
@ -1,50 +0,0 @@
|
|||||||
function Invoke-WinUtilpsProfile {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Installs & applies the CTT Powershell Profile
|
|
||||||
#>
|
|
||||||
Invoke-WPFRunspace -Argumentlist $PROFILE -DebugPreference $DebugPreference -ScriptBlock {
|
|
||||||
param ( $psprofile)
|
|
||||||
function Invoke-PSSetup {
|
|
||||||
$url = "https://raw.githubusercontent.com/ChrisTitusTech/powershell-profile/main/Microsoft.PowerShell_profile.ps1"
|
|
||||||
$oldhash = Get-FileHash $psprofile -ErrorAction SilentlyContinue
|
|
||||||
Invoke-RestMethod $url -OutFile "$env:temp/Microsoft.PowerShell_profile.ps1"
|
|
||||||
$newhash = Get-FileHash "$env:temp/Microsoft.PowerShell_profile.ps1"
|
|
||||||
if ($newhash.Hash -ne $oldhash.Hash) {
|
|
||||||
write-host "===> Installing Profile.. <===" -ForegroundColor Yellow
|
|
||||||
# Starting new hidden shell process bc setup does not work in a runspace
|
|
||||||
Start-Process -FilePath "pwsh" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -Command `"Invoke-Expression (Invoke-WebRequest `'https://github.com/ChrisTitusTech/powershell-profile/raw/main/setup.ps1`')`"" -WindowStyle Hidden -Wait
|
|
||||||
Write-Host "Profile has been installed. Please restart your shell to reflect changes!" -ForegroundColor Magenta
|
|
||||||
write-host "===> Finished <===" -ForegroundColor Yellow
|
|
||||||
} else {
|
|
||||||
Write-Host "Profile is up to date" -ForegroundColor Green
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Get-Command "pwsh" -ErrorAction SilentlyContinue) {
|
|
||||||
if ($PSVersionTable.PSVersion.Major -ge 7) {
|
|
||||||
Invoke-PSSetup
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
write-host "Profile requires Powershell 7, which is currently installed but not used!" -ForegroundColor Red
|
|
||||||
# Load the necessary assembly for Windows Forms
|
|
||||||
Add-Type -AssemblyName System.Windows.Forms
|
|
||||||
# Display the Yes/No message box
|
|
||||||
$question = [System.Windows.Forms.MessageBox]::Show("Profile requires Powershell 7, which is currently installed but not used! Do you want to install Profile for Powershell 7?", "Question",
|
|
||||||
[System.Windows.Forms.MessageBoxButtons]::YesNo,
|
|
||||||
[System.Windows.Forms.MessageBoxIcon]::Question)
|
|
||||||
|
|
||||||
# Check the result
|
|
||||||
if ($question -eq [System.Windows.Forms.DialogResult]::Yes) {
|
|
||||||
Invoke-PSSetup
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Host "Not proceeding with the profile setup!"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
write-host "Profile requires Powershell 7, which is not installed!" -ForegroundColor Red
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,11 +26,7 @@ Function Set-WinUtilService {
|
|||||||
|
|
||||||
# Service exists, proceed with changing properties
|
# Service exists, proceed with changing properties
|
||||||
$service | Set-Service -StartupType $StartupType -ErrorAction Stop
|
$service | Set-Service -StartupType $StartupType -ErrorAction Stop
|
||||||
} catch [System.ServiceProcess.ServiceNotFoundException] {
|
|
||||||
Write-Warning "Service $Name was not found"
|
|
||||||
} catch {
|
} catch {
|
||||||
Write-Warning "Unable to set $Name due to unhandled exception"
|
write-host "Unable to get service $($Name)"
|
||||||
Write-Warning $_.Exception.Message
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -43,44 +43,48 @@ function Set-WinUtilTaskbaritem {
|
|||||||
[string]$description
|
[string]$description
|
||||||
)
|
)
|
||||||
|
|
||||||
if ($value) {
|
try {
|
||||||
$sync["Form"].taskbarItemInfo.ProgressValue = $value
|
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) {
|
if ($state) {
|
||||||
switch ($overlay) {
|
switch ($state) {
|
||||||
'logo' {
|
'None' { $sync["Form"].taskbarItemInfo.ProgressState = "None" }
|
||||||
$sync["Form"].taskbarItemInfo.Overlay = $sync["logorender"]
|
'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" }
|
||||||
}
|
}
|
||||||
'checkmark' {
|
}
|
||||||
$sync["Form"].taskbarItemInfo.Overlay = $sync["checkmarkrender"]
|
|
||||||
}
|
if ($overlay) {
|
||||||
'warning' {
|
switch ($overlay) {
|
||||||
$sync["Form"].taskbarItemInfo.Overlay = $sync["warningrender"]
|
'logo' {
|
||||||
}
|
$sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\cttlogo.png"
|
||||||
'None' {
|
}
|
||||||
$sync["Form"].taskbarItemInfo.Overlay = $null
|
'checkmark' {
|
||||||
}
|
$sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\checkmark.png"
|
||||||
default {
|
}
|
||||||
if (Test-Path $overlay) {
|
'warning' {
|
||||||
$sync["Form"].taskbarItemInfo.Overlay = $overlay
|
$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) {
|
if ($description) {
|
||||||
$sync["Form"].taskbarItemInfo.Description = $description
|
$sync["Form"].taskbarItemInfo.Description = $description
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
#do nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,83 +0,0 @@
|
|||||||
function Set-WinUtilUITheme {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Sets the theme of the XAML file
|
|
||||||
|
|
||||||
.PARAMETER inputXML
|
|
||||||
A string representing the XAML object to modify
|
|
||||||
|
|
||||||
.PARAMETER customThemeName
|
|
||||||
The name of the custom theme to set the XAML to. Defaults to 'matrix'
|
|
||||||
|
|
||||||
.PARAMETER defaultThemeName
|
|
||||||
The name of the default theme to use when setting the XAML. Defaults to '_default'
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
$returnVal = Set-WinUtilUITheme -inputXAML $inputXAML
|
|
||||||
if ($returnVal[0] -eq "") {
|
|
||||||
Write-Host "Failed to process inputXML"
|
|
||||||
} else {
|
|
||||||
$inputXML = $returnVal[0]
|
|
||||||
}
|
|
||||||
# to know which theme this function has used, access the second item in returned value.
|
|
||||||
Write-Host "Theme used in processing: $($returnVal[1])"
|
|
||||||
#>
|
|
||||||
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory, position=0)]
|
|
||||||
[string]$inputXML,
|
|
||||||
|
|
||||||
[Parameter(position=1)]
|
|
||||||
[string]$customThemeName = 'matrix',
|
|
||||||
|
|
||||||
[Parameter(position=2)]
|
|
||||||
[string]$defaultThemeName = '_default'
|
|
||||||
)
|
|
||||||
|
|
||||||
try {
|
|
||||||
# Note:
|
|
||||||
# Reason behind not caching the '$sync.configs.themes` object into a variable,
|
|
||||||
# because this code can modify the themes object.. meaning it's better to access it
|
|
||||||
# using the more verbose way, rather than introduce possible bugs into the code, just for the sake of readability.
|
|
||||||
#
|
|
||||||
if (-NOT $sync.configs.themes) {
|
|
||||||
throw [GenericException]::new("[Set-WinUtilTheme] Did not find 'config.themes' inside `$sync variable.")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-NOT $sync.configs.themes.$defaultThemeName) {
|
|
||||||
throw [GenericException]::new("[Set-WinUtilTheme] Did not find '$defaultThemeName' theme in the themes config file.")
|
|
||||||
}
|
|
||||||
|
|
||||||
$themeToUse = $customThemeName
|
|
||||||
if ($sync.configs.themes.$themeToUse) {
|
|
||||||
# Loop through every default theme option, and modify the custom theme in $sync variable,
|
|
||||||
# so that it has full options available for other functions to use.
|
|
||||||
foreach ($option in $sync.configs.themes.$defaultThemeName.PSObject.Properties) {
|
|
||||||
$optionName = $option.Name
|
|
||||||
$optionValue = $option.Value
|
|
||||||
if (-NOT $sync.configs.themes.$themeToUse.$optionName) {
|
|
||||||
$sync.configs.themes.$themeToUse | Add-Member -MemberType NoteProperty -Name $optionName -Value $optionValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Write-Debug "[Set-WinUtilTheme] Theme '$customThemeName' was not found, using '$defaultThemeName' instead."
|
|
||||||
$themeToUse = $defaultThemeName
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($property in $sync.configs.themes.$themeToUse.PSObject.Properties) {
|
|
||||||
$key = $property.Name
|
|
||||||
$value = $property.Value
|
|
||||||
# Add curly braces around the key
|
|
||||||
$formattedKey = "{$key}"
|
|
||||||
# Replace the key with the value in the input XML
|
|
||||||
$inputXML = $inputXML.Replace($formattedKey, $value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Host "[Set-WinUtilTheme] Unable to apply theme" -ForegroundColor Red
|
|
||||||
Write-Host "$($psitem.Exception.Message)" -ForegroundColor Red
|
|
||||||
$inputXML = "" # Make inputXML equal an empty string, indicating something went wrong to the function caller.
|
|
||||||
}
|
|
||||||
|
|
||||||
return @($inputXML, $themeToUse);
|
|
||||||
}
|
|
50
functions/private/Set-WinUtilUiTheme.ps1
Normal file
50
functions/private/Set-WinUtilUiTheme.ps1
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
function Set-WinUtilUITheme {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Sets the theme of the XAML file
|
||||||
|
|
||||||
|
.PARAMETER inputXML
|
||||||
|
A string representing the XAML object to modify
|
||||||
|
|
||||||
|
.PARAMETER themeName
|
||||||
|
The name of the theme to set the XAML to. Defaults to 'matrix'
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Set-WinUtilUITheme -inputXAML $inputXAML
|
||||||
|
#>
|
||||||
|
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory, position=0)]
|
||||||
|
[string]$inputXML,
|
||||||
|
[Parameter(position=1)]
|
||||||
|
[string]$themeName = 'matrix'
|
||||||
|
)
|
||||||
|
|
||||||
|
try {
|
||||||
|
# Convert the JSON to a PowerShell object
|
||||||
|
$themes = $sync.configs.themes
|
||||||
|
# Select the specified theme
|
||||||
|
$selectedTheme = $themes.$themeName
|
||||||
|
|
||||||
|
if ($selectedTheme) {
|
||||||
|
# Loop through all key-value pairs in the selected theme
|
||||||
|
foreach ($property in $selectedTheme.PSObject.Properties) {
|
||||||
|
$key = $property.Name
|
||||||
|
$value = $property.Value
|
||||||
|
# Add curly braces around the key
|
||||||
|
$formattedKey = "{$key}"
|
||||||
|
# Replace the key with the value in the input XML
|
||||||
|
$inputXML = $inputXML.Replace($formattedKey, $value)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Theme '$themeName' not found."
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch {
|
||||||
|
Write-Warning "Unable to apply theme"
|
||||||
|
Write-Warning $psitem.Exception.StackTrace
|
||||||
|
}
|
||||||
|
|
||||||
|
return $inputXML;
|
||||||
|
}
|
@ -51,7 +51,7 @@ function Show-CustomDialog {
|
|||||||
$buttonBackgroundColor = $sync.configs.themes.$ctttheme.ButtonInstallBackgroundColor
|
$buttonBackgroundColor = $sync.configs.themes.$ctttheme.ButtonInstallBackgroundColor
|
||||||
$buttonForegroundColor = $sync.configs.themes.$ctttheme.ButtonInstallForegroundColor
|
$buttonForegroundColor = $sync.configs.themes.$ctttheme.ButtonInstallForegroundColor
|
||||||
$shadowColor = [Windows.Media.ColorConverter]::ConvertFromString("#AAAAAAAA")
|
$shadowColor = [Windows.Media.ColorConverter]::ConvertFromString("#AAAAAAAA")
|
||||||
$logocolor = $sync.configs.themes.$ctttheme.LabelboxForegroundColor
|
$logocolor = $sync.configs.themes.$ctttheme.ButtonBackgroundPressedColor
|
||||||
|
|
||||||
# Create a custom dialog window
|
# Create a custom dialog window
|
||||||
$dialog = New-Object Windows.Window
|
$dialog = New-Object Windows.Window
|
||||||
@ -128,15 +128,73 @@ function Show-CustomDialog {
|
|||||||
$grid.Children.Add($stackPanel)
|
$grid.Children.Add($stackPanel)
|
||||||
[Windows.Controls.Grid]::SetRow($stackPanel, 0) # Set the row to the second row (0-based index)
|
[Windows.Controls.Grid]::SetRow($stackPanel, 0) # Set the row to the second row (0-based index)
|
||||||
|
|
||||||
|
$viewbox = New-Object Windows.Controls.Viewbox
|
||||||
|
$viewbox.Width = $IconSize
|
||||||
|
$viewbox.Height = $IconSize
|
||||||
|
|
||||||
|
# Combine the paths into a single string
|
||||||
|
# $cttLogoPath = @"
|
||||||
|
# M174 1094 c-4 -14 -4 -55 -2 -92 3 -57 9 -75 41 -122 41 -60 45 -75 22 -84 -25 -9 -17 -21 30 -44 l45 -22 0 -103 c0 -91 3 -109 26 -155 30 -60 65 -87 204 -157 l95 -48 110 58 c184 96 205 127 205 293 l0 108 45 22 c47 23 55 36 30 46 -22 8 -18 30 9 63 13 16 34 48 46 71 20 37 21 52 15 116 l-6 73 -69 -23 c-38 -12 -137 -59 -220 -103 -82 -45 -160 -81 -171 -81 -12 0 -47 15 -78 34 -85 51 -239 127 -309 151 l-62 22 -6 -23z m500 -689 c20 -8 36 -19 36 -24 0 -18 -53 -51 -80 -51 -28 0 -80 33 -80 51 0 10 55 38 76 39 6 0 28 -7 48 -15z
|
||||||
|
# M177 711 c-19 -88 4 -242 49 -318 43 -74 107 -127 232 -191 176 -90 199 -84 28 7 -169 91 -214 129 -258 220 -29 58 -32 74 -37 190 -4 90 -8 116 -14 92z
|
||||||
|
# M1069 610 c-4 -131 -5 -137 -38 -198 -43 -79 -89 -119 -210 -181 -53 -27 -116 -61 -141 -76 -74 -43 -6 -20 115 40 221 109 296 217 294 425 -1 144 -16 137 -20 -10z
|
||||||
|
# "@
|
||||||
|
$cttLogoPath = @"
|
||||||
|
M 18.00,14.00
|
||||||
|
C 18.00,14.00 45.00,27.74 45.00,27.74
|
||||||
|
45.00,27.74 57.40,34.63 57.40,34.63
|
||||||
|
57.40,34.63 59.00,43.00 59.00,43.00
|
||||||
|
59.00,43.00 59.00,83.00 59.00,83.00
|
||||||
|
55.35,81.66 46.99,77.79 44.72,74.79
|
||||||
|
41.17,70.10 42.01,59.80 42.00,54.00
|
||||||
|
42.00,51.62 42.20,48.29 40.98,46.21
|
||||||
|
38.34,41.74 25.78,38.60 21.28,33.79
|
||||||
|
16.81,29.02 18.00,20.20 18.00,14.00 Z
|
||||||
|
M 107.00,14.00
|
||||||
|
C 109.01,19.06 108.93,30.37 104.66,34.21
|
||||||
|
100.47,37.98 86.38,43.10 84.60,47.21
|
||||||
|
83.94,48.74 84.01,51.32 84.00,53.00
|
||||||
|
83.97,57.04 84.46,68.90 83.26,72.00
|
||||||
|
81.06,77.70 72.54,81.42 67.00,83.00
|
||||||
|
67.00,83.00 67.00,43.00 67.00,43.00
|
||||||
|
67.00,43.00 67.99,35.63 67.99,35.63
|
||||||
|
67.99,35.63 80.00,28.26 80.00,28.26
|
||||||
|
80.00,28.26 107.00,14.00 107.00,14.00 Z
|
||||||
|
M 19.00,46.00
|
||||||
|
C 21.36,47.14 28.67,50.71 30.01,52.63
|
||||||
|
31.17,54.30 30.99,57.04 31.00,59.00
|
||||||
|
31.04,65.41 30.35,72.16 33.56,78.00
|
||||||
|
38.19,86.45 46.10,89.04 54.00,93.31
|
||||||
|
56.55,94.69 60.10,97.20 63.00,97.22
|
||||||
|
65.50,97.24 68.77,95.36 71.00,94.25
|
||||||
|
76.42,91.55 84.51,87.78 88.82,83.68
|
||||||
|
94.56,78.20 95.96,70.59 96.00,63.00
|
||||||
|
96.01,60.24 95.59,54.63 97.02,52.39
|
||||||
|
98.80,49.60 103.95,47.87 107.00,47.00
|
||||||
|
107.00,47.00 107.00,67.00 107.00,67.00
|
||||||
|
106.90,87.69 96.10,93.85 80.00,103.00
|
||||||
|
76.51,104.98 66.66,110.67 63.00,110.52
|
||||||
|
60.33,110.41 55.55,107.53 53.00,106.25
|
||||||
|
46.21,102.83 36.63,98.57 31.04,93.68
|
||||||
|
16.88,81.28 19.00,62.88 19.00,46.00 Z
|
||||||
|
"@
|
||||||
|
|
||||||
|
# Add SVG path
|
||||||
|
$svgPath = New-Object Windows.Shapes.Path
|
||||||
|
$svgPath.Data = [Windows.Media.Geometry]::Parse($cttLogoPath)
|
||||||
|
$svgPath.Fill = $logocolor # Set fill color to white
|
||||||
|
|
||||||
|
# Add SVG path to Viewbox
|
||||||
|
$viewbox.Child = $svgPath
|
||||||
|
|
||||||
# Add SVG path to the stack panel
|
# Add SVG path to the stack panel
|
||||||
$stackPanel.Children.Add((Invoke-WinUtilAssets -Type "logo" -Size 25))
|
$stackPanel.Children.Add($viewbox)
|
||||||
|
|
||||||
# Add "Winutil" text
|
# Add "Winutil" text
|
||||||
$winutilTextBlock = New-Object Windows.Controls.TextBlock
|
$winutilTextBlock = New-Object Windows.Controls.TextBlock
|
||||||
$winutilTextBlock.Text = "Winutil"
|
$winutilTextBlock.Text = "Winutil"
|
||||||
$winutilTextBlock.FontSize = $HeaderFontSize
|
$winutilTextBlock.FontSize = $HeaderFontSize
|
||||||
$winutilTextBlock.Foreground = $logocolor
|
$winutilTextBlock.Foreground = $logocolor
|
||||||
$winutilTextBlock.Margin = New-Object Windows.Thickness(10, 10, 10, 5) # Add margins around the text block
|
$winutilTextBlock.Margin = New-Object Windows.Thickness(10, 5, 10, 5) # Add margins around the text block
|
||||||
$stackPanel.Children.Add($winutilTextBlock)
|
$stackPanel.Children.Add($winutilTextBlock)
|
||||||
# Add TextBlock for information with text wrapping and margins
|
# Add TextBlock for information with text wrapping and margins
|
||||||
$messageTextBlock = New-Object Windows.Controls.TextBlock
|
$messageTextBlock = New-Object Windows.Controls.TextBlock
|
||||||
|
@ -11,7 +11,7 @@ Function Update-WinUtilProgramWinget {
|
|||||||
|
|
||||||
$host.ui.RawUI.WindowTitle = """Winget Install"""
|
$host.ui.RawUI.WindowTitle = """Winget Install"""
|
||||||
|
|
||||||
Start-Transcript "$logdir\winget-update_$dateTime.log" -Append
|
Start-Transcript $ENV:TEMP\winget-update.log -Append
|
||||||
winget upgrade --all --accept-source-agreements --accept-package-agreements --scope=machine --silent
|
winget upgrade --all --accept-source-agreements --accept-package-agreements --scope=machine --silent
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,13 +21,13 @@ function Invoke-WPFButton {
|
|||||||
Switch -Wildcard ($Button) {
|
Switch -Wildcard ($Button) {
|
||||||
|
|
||||||
"WPFTab?BT" {Invoke-WPFTab $Button}
|
"WPFTab?BT" {Invoke-WPFTab $Button}
|
||||||
"WPFInstall" {Invoke-WPFInstall}
|
"WPFinstall" {Invoke-WPFInstall}
|
||||||
"WPFUninstall" {Invoke-WPFUnInstall}
|
"WPFuninstall" {Invoke-WPFUnInstall}
|
||||||
"WPFInstallUpgrade" {Invoke-WPFInstallUpgrade}
|
"WPFInstallUpgrade" {Invoke-WPFInstallUpgrade}
|
||||||
"WPFStandard" {Invoke-WPFPresets "Standard" -checkboxfilterpattern "WPFTweak*"}
|
"WPFstandard" {Invoke-WPFPresets "Standard"}
|
||||||
"WPFMinimal" {Invoke-WPFPresets "Minimal" -checkboxfilterpattern "WPFTweak*"}
|
"WPFminimal" {Invoke-WPFPresets "Minimal"}
|
||||||
"WPFClearTweaksSelection" {Invoke-WPFPresets -imported $true -checkboxfilterpattern "WPFTweak*"}
|
"WPFclear" {Invoke-WPFPresets -preset $null -imported $true}
|
||||||
"WPFClearInstallSelection" {Invoke-WPFPresets -imported $true -checkboxfilterpattern "WPFInstall*"}
|
"WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"}
|
||||||
"WPFtweaksbutton" {Invoke-WPFtweaksbutton}
|
"WPFtweaksbutton" {Invoke-WPFtweaksbutton}
|
||||||
"WPFOOSUbutton" {Invoke-WPFOOSU}
|
"WPFOOSUbutton" {Invoke-WPFOOSU}
|
||||||
"WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enable"}
|
"WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enable"}
|
||||||
@ -41,7 +41,6 @@ function Invoke-WPFButton {
|
|||||||
"WPFPanelpower" {Invoke-WPFControlPanel -Panel $button}
|
"WPFPanelpower" {Invoke-WPFControlPanel -Panel $button}
|
||||||
"WPFPanelregion" {Invoke-WPFControlPanel -Panel $button}
|
"WPFPanelregion" {Invoke-WPFControlPanel -Panel $button}
|
||||||
"WPFPanelsound" {Invoke-WPFControlPanel -Panel $button}
|
"WPFPanelsound" {Invoke-WPFControlPanel -Panel $button}
|
||||||
"WPFPanelprinter" {Invoke-WPFControlPanel -Panel $button}
|
|
||||||
"WPFPanelsystem" {Invoke-WPFControlPanel -Panel $button}
|
"WPFPanelsystem" {Invoke-WPFControlPanel -Panel $button}
|
||||||
"WPFPaneluser" {Invoke-WPFControlPanel -Panel $button}
|
"WPFPaneluser" {Invoke-WPFControlPanel -Panel $button}
|
||||||
"WPFUpdatesdefault" {Invoke-WPFUpdatesdefault}
|
"WPFUpdatesdefault" {Invoke-WPFUpdatesdefault}
|
||||||
@ -58,6 +57,5 @@ function Invoke-WPFButton {
|
|||||||
"WPFMicrowin" {Invoke-WPFMicrowin}
|
"WPFMicrowin" {Invoke-WPFMicrowin}
|
||||||
"WPFCloseButton" {Invoke-WPFCloseButton}
|
"WPFCloseButton" {Invoke-WPFCloseButton}
|
||||||
"MicrowinScratchDirBT" {Invoke-ScratchDialog}
|
"MicrowinScratchDirBT" {Invoke-ScratchDialog}
|
||||||
"WPFWinUtilPSProfile" {Invoke-WinUtilpsProfile}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@ function Invoke-WPFControlPanel {
|
|||||||
"WPFPanelpower" {cmd /c powercfg.cpl}
|
"WPFPanelpower" {cmd /c powercfg.cpl}
|
||||||
"WPFPanelregion" {cmd /c intl.cpl}
|
"WPFPanelregion" {cmd /c intl.cpl}
|
||||||
"WPFPanelsound" {cmd /c mmsys.cpl}
|
"WPFPanelsound" {cmd /c mmsys.cpl}
|
||||||
"WPFPanelprinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
|
||||||
"WPFPanelsystem" {cmd /c sysdm.cpl}
|
"WPFPanelsystem" {cmd /c sysdm.cpl}
|
||||||
"WPFPaneluser" {cmd /c "control userpasswords2"}
|
"WPFPaneluser" {cmd /c "control userpasswords2"}
|
||||||
}
|
}
|
||||||
|
@ -6,13 +6,21 @@ function Invoke-WPFFeatureInstall {
|
|||||||
|
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
param (
|
||||||
|
$FeatureConfig
|
||||||
|
)
|
||||||
|
|
||||||
if($sync.ProcessRunning) {
|
if($sync.ProcessRunning) {
|
||||||
$msg = "[Invoke-WPFFeatureInstall] Install process is currently running."
|
$msg = "[Invoke-WPFFeatureInstall] Install process is currently running."
|
||||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
$Features = (Get-WinUtilCheckBoxes)["WPFFeature"]
|
if ($FeatureConfig) {
|
||||||
|
$Features = $FeatureConfig
|
||||||
|
} else {
|
||||||
|
$Features = (Get-WinUtilCheckBoxes)["WPFFeature"]
|
||||||
|
}
|
||||||
|
|
||||||
Invoke-WPFRunspace -ArgumentList $Features -DebugPreference $DebugPreference -ScriptBlock {
|
Invoke-WPFRunspace -ArgumentList $Features -DebugPreference $DebugPreference -ScriptBlock {
|
||||||
param($Features, $DebugPreference)
|
param($Features, $DebugPreference)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
function Invoke-WPFGetInstalled {
|
function Invoke-WPFGetInstalled {
|
||||||
<#
|
<#
|
||||||
TODO: Add the Option to use Chocolatey as Engine
|
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Invokes the function that gets the checkboxes to check in a new runspace
|
Invokes the function that gets the checkboxes to check in a new runspace
|
||||||
|
|
||||||
@ -16,12 +16,12 @@ function Invoke-WPFGetInstalled {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if(($sync.WPFpreferChocolatey.IsChecked -eq $false) -and ((Test-WinUtilPackageManager -winget) -eq "not-installed") -and $checkbox -eq "winget") {
|
if(((Test-WinUtilPackageManager -winget) -eq "not-installed") -and $checkbox -eq "winget") {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
$preferChoco = $sync.WPFpreferChocolatey.IsChecked
|
|
||||||
Invoke-WPFRunspace -ArgumentList $checkbox, $preferChoco -DebugPreference $DebugPreference -ScriptBlock {
|
Invoke-WPFRunspace -ArgumentList $checkbox -DebugPreference $DebugPreference -ScriptBlock {
|
||||||
param($checkbox, $preferChoco, $DebugPreference)
|
param($checkbox, $DebugPreference)
|
||||||
|
|
||||||
$sync.ProcessRunning = $true
|
$sync.ProcessRunning = $true
|
||||||
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" })
|
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" })
|
||||||
@ -32,12 +32,8 @@ function Invoke-WPFGetInstalled {
|
|||||||
if($checkbox -eq "tweaks") {
|
if($checkbox -eq "tweaks") {
|
||||||
Write-Host "Getting Installed Tweaks..."
|
Write-Host "Getting Installed Tweaks..."
|
||||||
}
|
}
|
||||||
if ($preferChoco -and $checkbox -eq "winget") {
|
|
||||||
$Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox "choco"
|
$Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox
|
||||||
}
|
|
||||||
else{
|
|
||||||
$Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox
|
|
||||||
}
|
|
||||||
|
|
||||||
$sync.form.Dispatcher.invoke({
|
$sync.form.Dispatcher.invoke({
|
||||||
foreach($checkbox in $Checkboxes) {
|
foreach($checkbox in $Checkboxes) {
|
||||||
|
@ -114,7 +114,7 @@ function Invoke-WPFGetIso {
|
|||||||
# @ChrisTitusTech please copy this wiki and change the link below to your copy of the wiki
|
# @ChrisTitusTech please copy this wiki and change the link below to your copy of the wiki
|
||||||
Write-Error "Failed to mount the image. Error: $($_.Exception.Message)"
|
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 "This is NOT winutil's problem, your ISO might be corrupt, or there is a problem on the system"
|
||||||
Write-Host "Please refer to this wiki for more details: https://christitustech.github.io/winutil/KnownIssues/#troubleshoot-errors-during-microwin-usage" -ForegroundColor Red
|
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"
|
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -41,8 +41,6 @@ function Invoke-WPFImpex {
|
|||||||
if ($type -eq "export") {
|
if ($type -eq "export") {
|
||||||
$jsonFile = Get-WinUtilCheckBoxes -unCheck $false
|
$jsonFile = Get-WinUtilCheckBoxes -unCheck $false
|
||||||
$jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force
|
$jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force
|
||||||
$runscript = "iex ""& { `$(irm christitus.com/win) } -Config '$($FileBrowser.FileName)'"""
|
|
||||||
$runscript | Set-Clipboard
|
|
||||||
}
|
}
|
||||||
if ($type -eq "import") {
|
if ($type -eq "import") {
|
||||||
$jsonFile = Get-Content $Config | ConvertFrom-Json
|
$jsonFile = Get-Content $Config | ConvertFrom-Json
|
||||||
@ -57,7 +55,6 @@ function Invoke-WPFImpex {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$flattenedJson = [string]$flattenedJson
|
|
||||||
Invoke-WPFPresets -preset $flattenedJson -imported $true
|
Invoke-WPFPresets -preset $flattenedJson -imported $true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,22 +6,31 @@ function Invoke-WPFInstall {
|
|||||||
|
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
param (
|
||||||
|
$InstallConfig
|
||||||
|
)
|
||||||
|
|
||||||
if($sync.ProcessRunning) {
|
if($sync.ProcessRunning) {
|
||||||
$msg = "[Invoke-WPFInstall] An Install process is currently running."
|
$msg = "[Invoke-WPFInstall] An Install process is currently running."
|
||||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
$PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
|
if ($InstallConfig) {
|
||||||
Write-Host $PackagesToInstall
|
$PackagesToInstall = $InstallConfig
|
||||||
|
} else {
|
||||||
|
$PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
|
||||||
|
}
|
||||||
|
|
||||||
if ($PackagesToInstall.Count -eq 0) {
|
if ($PackagesToInstall.Count -eq 0) {
|
||||||
$WarningMsg = "Please select the program(s) to install or upgrade"
|
$WarningMsg = "Please select the program(s) to install or upgrade"
|
||||||
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
$ChocoPreference = $($sync.WPFpreferChocolatey.IsChecked)
|
|
||||||
$installHandle = Invoke-WPFRunspace -ParameterList @(("PackagesToInstall", $PackagesToInstall),("ChocoPreference", $ChocoPreference)) -DebugPreference $DebugPreference -ScriptBlock {
|
|
||||||
param($PackagesToInstall, $ChocoPreference, $DebugPreference)
|
Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
|
||||||
|
param($PackagesToInstall, $DebugPreference)
|
||||||
if ($PackagesToInstall.count -eq 1) {
|
if ($PackagesToInstall.count -eq 1) {
|
||||||
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
|
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
|
||||||
} else {
|
} else {
|
||||||
@ -29,29 +38,17 @@ function Invoke-WPFInstall {
|
|||||||
}
|
}
|
||||||
$packagesWinget, $packagesChoco = {
|
$packagesWinget, $packagesChoco = {
|
||||||
$packagesWinget = [System.Collections.ArrayList]::new()
|
$packagesWinget = [System.Collections.ArrayList]::new()
|
||||||
$packagesChoco = [System.Collections.ArrayList]::new()
|
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
|
||||||
|
foreach ($package in $PackagesToInstall) {
|
||||||
foreach ($package in $PackagesToInstall) {
|
|
||||||
if ($ChocoPreference) {
|
|
||||||
if ($package.choco -eq "na") {
|
|
||||||
$packagesWinget.add($package.winget)
|
|
||||||
Write-Host "Queueing $($package.winget) for Winget install"
|
|
||||||
} else {
|
|
||||||
$null = $packagesChoco.add($package.choco)
|
|
||||||
Write-Host "Queueing $($package.choco) for Chocolatey install"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ($package.winget -eq "na") {
|
if ($package.winget -eq "na") {
|
||||||
$packagesChoco.add($package.choco)
|
$packagesChoco.add($package)
|
||||||
Write-Host "Queueing $($package.choco) for Chocolatey install"
|
Write-Host "Queueing $($package.choco) for Chocolatey install"
|
||||||
} else {
|
} else {
|
||||||
$null = $packagesWinget.add($($package.winget))
|
$null = $packagesWinget.add($($package.winget))
|
||||||
Write-Host "Queueing $($package.winget) for Winget install"
|
Write-Host "Queueing $($package.winget) for Winget install"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return $packagesWinget, $packagesChoco
|
||||||
return $packagesWinget, $packagesChoco
|
|
||||||
}.Invoke($PackagesToInstall)
|
}.Invoke($PackagesToInstall)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -59,12 +56,12 @@ function Invoke-WPFInstall {
|
|||||||
$errorPackages = @()
|
$errorPackages = @()
|
||||||
if($packagesWinget.Count -gt 0) {
|
if($packagesWinget.Count -gt 0) {
|
||||||
Install-WinUtilWinget
|
Install-WinUtilWinget
|
||||||
Install-WinUtilProgramWinget -Action Install -Programs $packagesWinget
|
$errorPackages += Invoke-WinUtilWingetProgram -Action Install -Programs $packagesWinget
|
||||||
|
$errorPackages| ForEach-Object {if($_.choco -ne "na") {$packagesChoco += $_}}
|
||||||
}
|
}
|
||||||
if($packagesChoco.Count -gt 0) {
|
if($packagesChoco.Count -gt 0) {
|
||||||
Install-WinUtilChoco
|
Install-WinUtilChoco
|
||||||
Install-WinUtilProgramChoco -Action Install -Programs $packagesChoco
|
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco
|
||||||
}
|
}
|
||||||
Write-Host "==========================================="
|
Write-Host "==========================================="
|
||||||
Write-Host "-- Installs have finished ---"
|
Write-Host "-- Installs have finished ---"
|
||||||
|
@ -2,35 +2,25 @@ function Invoke-WPFInstallUpgrade {
|
|||||||
<#
|
<#
|
||||||
|
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Invokes the function that upgrades all installed programs
|
Invokes the function that upgrades all installed programs using winget
|
||||||
|
|
||||||
#>
|
#>
|
||||||
if ($sync.WPFpreferChocolatey.IsChecked) {
|
if((Test-WinUtilPackageManager -winget) -eq "not-installed") {
|
||||||
Install-WinUtilChoco
|
return
|
||||||
$chocoUpgradeStatus = (Start-Process "choco" -ArgumentList "upgrade all -y" -Wait -PassThru -NoNewWindow).ExitCode
|
|
||||||
if ($chocoUpgradeStatus -eq 0) {
|
|
||||||
Write-Host "Upgrade Successful"
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
Write-Host "Error Occured. Return Code: $chocoUpgradeStatus"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
if((Test-WinUtilPackageManager -winget) -eq "not-installed") {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Get-WinUtilInstallerProcess -Process $global:WinGetInstall) {
|
if(Get-WinUtilInstallerProcess -Process $global:WinGetInstall) {
|
||||||
$msg = "[Invoke-WPFInstallUpgrade] Install process is currently running. Please check for a powershell window labeled 'Winget Install'"
|
$msg = "[Invoke-WPFInstallUpgrade] Install process is currently running. Please check for a powershell window labeled 'Winget Install'"
|
||||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||||
return
|
return
|
||||||
}
|
|
||||||
|
|
||||||
Update-WinUtilProgramWinget
|
|
||||||
|
|
||||||
Write-Host "==========================================="
|
|
||||||
Write-Host "-- Updates started ---"
|
|
||||||
Write-Host "-- You can close this window if desired ---"
|
|
||||||
Write-Host "==========================================="
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Set-WinUtilTaskbaritem -state "Indeterminate"
|
||||||
|
|
||||||
|
Update-WinUtilProgramWinget
|
||||||
|
|
||||||
|
Write-Host "==========================================="
|
||||||
|
Write-Host "-- Updates started ---"
|
||||||
|
Write-Host "-- You can close this window if desired ---"
|
||||||
|
Write-Host "==========================================="
|
||||||
}
|
}
|
||||||
|
@ -10,36 +10,29 @@ function Invoke-WPFPresets {
|
|||||||
.PARAMETER imported
|
.PARAMETER imported
|
||||||
If the preset is imported from a file, defaults to false
|
If the preset is imported from a file, defaults to false
|
||||||
|
|
||||||
.PARAMETER checkboxfilterpattern
|
.PARAMETER checkbox
|
||||||
The Pattern to use when filtering through CheckBoxes, defaults to "**"
|
The checkbox to set the options to, defaults to 'WPFTweaks'
|
||||||
|
|
||||||
#>
|
#>
|
||||||
|
|
||||||
param (
|
param(
|
||||||
[Parameter(position=0)]
|
$preset,
|
||||||
[string]$preset = "",
|
[bool]$imported = $false
|
||||||
|
|
||||||
[Parameter(position=1)]
|
|
||||||
[bool]$imported = $false,
|
|
||||||
|
|
||||||
[Parameter(position=2)]
|
|
||||||
[string]$checkboxfilterpattern = "**"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if ($imported -eq $true) {
|
if($imported -eq $true) {
|
||||||
$CheckBoxesToCheck = $preset
|
$CheckBoxesToCheck = $preset
|
||||||
} else {
|
} else {
|
||||||
$CheckBoxesToCheck = $sync.configs.preset.$preset
|
$CheckBoxesToCheck = $sync.configs.preset.$preset
|
||||||
}
|
}
|
||||||
|
|
||||||
$CheckBoxes = ($sync.GetEnumerator()).where{ $_.Value -is [System.Windows.Controls.CheckBox] -and $_.Name -notlike "WPFToggle*" -and $_.Name -like "$checkboxfilterpattern"}
|
$CheckBoxes = $sync.GetEnumerator() | Where-Object { $_.Value -is [System.Windows.Controls.CheckBox] -and $_.Name -notlike "WPFToggle*" }
|
||||||
Write-Debug "Getting checkboxes to set, number of checkboxes: $($CheckBoxes.Count)"
|
Write-Debug "Getting checkboxes to set $($CheckBoxes.Count)"
|
||||||
|
|
||||||
if ($CheckBoxesToCheck -ne "") {
|
$CheckBoxesToCheck | ForEach-Object {
|
||||||
$debugMsg = "CheckBoxes to Check are: "
|
if ($_ -ne $null) {
|
||||||
$CheckBoxesToCheck | ForEach-Object { $debugMsg += "$_, " }
|
Write-Debug $_
|
||||||
$debugMsg = $debugMsg -replace (',\s*$', '')
|
}
|
||||||
Write-Debug "$debugMsg"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($CheckBox in $CheckBoxes) {
|
foreach ($CheckBox in $CheckBoxes) {
|
||||||
|
@ -11,50 +11,44 @@ function Invoke-WPFRunspace {
|
|||||||
.PARAMETER ArgumentList
|
.PARAMETER ArgumentList
|
||||||
A list of arguments to pass to the runspace
|
A list of arguments to pass to the runspace
|
||||||
|
|
||||||
.PARAMETER ParameterList
|
|
||||||
A list of named parameters that should be provided.
|
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
Invoke-WPFRunspace `
|
Invoke-WPFRunspace `
|
||||||
-ScriptBlock $sync.ScriptsInstallPrograms `
|
-ScriptBlock $sync.ScriptsInstallPrograms `
|
||||||
-ArgumentList "Installadvancedip,Installbitwarden" `
|
-ArgumentList "Installadvancedip,Installbitwarden" `
|
||||||
|
|
||||||
Invoke-WPFRunspace`
|
|
||||||
-ScriptBlock $sync.ScriptsInstallPrograms `
|
|
||||||
-ParameterList @(("PackagesToInstall", @("Installadvancedip,Installbitwarden")),("ChocoPreference", $true))
|
|
||||||
#>
|
#>
|
||||||
|
|
||||||
[CmdletBinding()]
|
[CmdletBinding()]
|
||||||
Param (
|
Param (
|
||||||
$ScriptBlock,
|
$ScriptBlock,
|
||||||
$ArgumentList,
|
$ArgumentList,
|
||||||
$ParameterList,
|
|
||||||
$DebugPreference
|
$DebugPreference
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create a PowerShell instance
|
if ($PARAM_RUN) {
|
||||||
$script:powershell = [powershell]::Create()
|
write-host "Running in Main Thread"
|
||||||
|
& $ScriptBlock @ArgumentList @DebugPreference
|
||||||
|
} else {
|
||||||
|
write-host "Running in Runspace"
|
||||||
|
# Create a PowerShell instance
|
||||||
|
$script:powershell = [powershell]::Create()
|
||||||
|
|
||||||
# Add Scriptblock and Arguments to runspace
|
# Add Scriptblock and Arguments to runspace
|
||||||
$script:powershell.AddScript($ScriptBlock)
|
$script:powershell.AddScript($ScriptBlock)
|
||||||
$script:powershell.AddArgument($ArgumentList)
|
$script:powershell.AddArgument($ArgumentList)
|
||||||
|
$script:powershell.AddArgument($DebugPreference) # Pass DebugPreference to the script block
|
||||||
|
$script:powershell.RunspacePool = $sync.runspace
|
||||||
|
|
||||||
foreach ($parameter in $ParameterList) {
|
# Execute the RunspacePool
|
||||||
$script:powershell.AddParameter($parameter[0], $parameter[1])
|
$script:handle = $script:powershell.BeginInvoke()
|
||||||
|
|
||||||
|
# Clean up the RunspacePool threads when they are complete, and invoke the garbage collector to clean up the memory
|
||||||
|
if ($script:handle.IsCompleted) {
|
||||||
|
$script:powershell.EndInvoke($script:handle)
|
||||||
|
$script:powershell.Dispose()
|
||||||
|
$sync.runspace.Dispose()
|
||||||
|
$sync.runspace.Close()
|
||||||
|
[System.GC]::Collect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$script:powershell.AddArgument($DebugPreference) # Pass DebugPreference to the script block
|
|
||||||
$script:powershell.RunspacePool = $sync.runspace
|
|
||||||
|
|
||||||
# Execute the RunspacePool
|
|
||||||
$script:handle = $script:powershell.BeginInvoke()
|
|
||||||
|
|
||||||
# Clean up the RunspacePool threads when they are complete, and invoke the garbage collector to clean up the memory
|
|
||||||
if ($script:handle.IsCompleted) {
|
|
||||||
$script:powershell.EndInvoke($script:handle)
|
|
||||||
$script:powershell.Dispose()
|
|
||||||
$sync.runspace.Dispose()
|
|
||||||
$sync.runspace.Close()
|
|
||||||
[System.GC]::Collect()
|
|
||||||
}
|
|
||||||
# Return the handle
|
|
||||||
return $handle
|
|
||||||
}
|
}
|
||||||
|
@ -51,9 +51,6 @@ function Invoke-WPFShortcut {
|
|||||||
$Shortcut = $WshShell.CreateShortcut($FileBrowser.FileName)
|
$Shortcut = $WshShell.CreateShortcut($FileBrowser.FileName)
|
||||||
$Shortcut.TargetPath = $shell
|
$Shortcut.TargetPath = $shell
|
||||||
$Shortcut.Arguments = $shellArgs
|
$Shortcut.Arguments = $shellArgs
|
||||||
if (-NOT (Test-Path -Path $winutildir["logo.ico"])) {
|
|
||||||
Invoke-WebRequest -Uri "https://christitus.com/images/logo-full.ico" -OutFile $winutildir["logo.ico"]
|
|
||||||
}
|
|
||||||
if (Test-Path -Path $winutildir["logo.ico"]) {
|
if (Test-Path -Path $winutildir["logo.ico"]) {
|
||||||
$shortcut.IconLocation = $winutildir["logo.ico"]
|
$shortcut.IconLocation = $winutildir["logo.ico"]
|
||||||
}
|
}
|
||||||
|
@ -15,25 +15,23 @@ function Invoke-WPFToggle {
|
|||||||
# Use this to get the name of the button
|
# Use this to get the name of the button
|
||||||
#[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info")
|
#[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info")
|
||||||
|
|
||||||
$ToggleStatus = (Get-WinUtilToggleStatus $Button)
|
|
||||||
|
|
||||||
Switch -Wildcard ($Button) {
|
Switch -Wildcard ($Button) {
|
||||||
|
|
||||||
"WPFToggleDarkMode" {Invoke-WinUtilDarkMode $ToggleStatus}
|
"WPFToggleDarkMode" {Invoke-WinUtilDarkMode -DarkMoveEnabled $(Get-WinUtilToggleStatus WPFToggleDarkMode)}
|
||||||
"WPFToggleBingSearch" {Invoke-WinUtilBingSearch $ToggleStatus}
|
"WPFToggleBingSearch" {Invoke-WinUtilBingSearch $(Get-WinUtilToggleStatus WPFToggleBingSearch)}
|
||||||
"WPFToggleNumLock" {Invoke-WinUtilNumLock $ToggleStatus}
|
"WPFToggleNumLock" {Invoke-WinUtilNumLock $(Get-WinUtilToggleStatus WPFToggleNumLock)}
|
||||||
"WPFToggleVerboseLogon" {Invoke-WinUtilVerboseLogon $ToggleStatus}
|
"WPFToggleVerboseLogon" {Invoke-WinUtilVerboseLogon $(Get-WinUtilToggleStatus WPFToggleVerboseLogon)}
|
||||||
"WPFToggleShowExt" {Invoke-WinUtilShowExt $ToggleStatus}
|
"WPFToggleShowExt" {Invoke-WinUtilShowExt $(Get-WinUtilToggleStatus WPFToggleShowExt)}
|
||||||
"WPFToggleSnapWindow" {Invoke-WinUtilSnapWindow $ToggleStatus}
|
"WPFToggleSnapWindow" {Invoke-WinUtilSnapWindow $(Get-WinUtilToggleStatus WPFToggleSnapWindow)}
|
||||||
"WPFToggleSnapFlyout" {Invoke-WinUtilSnapFlyout $ToggleStatus}
|
"WPFToggleSnapFlyout" {Invoke-WinUtilSnapFlyout $(Get-WinUtilToggleStatus WPFToggleSnapFlyout)}
|
||||||
"WPFToggleSnapSuggestion" {Invoke-WinUtilSnapSuggestion $ToggleStatus}
|
"WPFToggleSnapSuggestion" {Invoke-WinUtilSnapSuggestion $(Get-WinUtilToggleStatus WPFToggleSnapSuggestion)}
|
||||||
"WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $ToggleStatus}
|
"WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $(Get-WinUtilToggleStatus WPFToggleMouseAcceleration)}
|
||||||
"WPFToggleStickyKeys" {Invoke-WinUtilStickyKeys $ToggleStatus}
|
"WPFToggleStickyKeys" {Invoke-WinUtilStickyKeys $(Get-WinUtilToggleStatus WPFToggleStickyKeys)}
|
||||||
"WPFToggleTaskbarWidgets" {Invoke-WinUtilTaskbarWidgets $ToggleStatus}
|
"WPFToggleTaskbarWidgets" {Invoke-WinUtilTaskbarWidgets $(Get-WinUtilToggleStatus WPFToggleTaskbarWidgets)}
|
||||||
"WPFToggleTaskbarSearch" {Invoke-WinUtilTaskbarSearch $ToggleStatus}
|
"WPFToggleTaskbarSearch" {Invoke-WinUtilTaskbarSearch $(Get-WinUtilToggleStatus WPFToggleTaskbarSearch)}
|
||||||
"WPFToggleTaskView" {Invoke-WinUtilTaskView $ToggleStatus}
|
"WPFToggleTaskView" {Invoke-WinUtilTaskView $(Get-WinUtilToggleStatus WPFToggleTaskView)}
|
||||||
"WPFToggleHiddenFiles" {Invoke-WinUtilHiddenFiles $ToggleStatus}
|
"WPFToggleHiddenFiles" {Invoke-WinUtilHiddenFiles $(Get-WinUtilToggleStatus WPFToggleHiddenFiles)}
|
||||||
"WPFToggleTaskbarAlignment" {Invoke-WinUtilTaskbarAlignment $ToggleStatus}
|
"WPFToggleTaskbarAlignment" {Invoke-WinUtilTaskbarAlignment $(Get-WinUtilToggleStatus WPFToggleTaskbarAlignment)}
|
||||||
"WPFToggleDetailedBSoD" {Invoke-WinUtilDetailedBSoD $ToggleStatus}
|
"WPFToggleDetailedBSoD" {Invoke-WinUtilDetailedBSoD $(Get-WinUtilToggleStatus WPFToggleDetailedBSoD)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ function Invoke-WPFTweakPS7{
|
|||||||
Write-Host "Powershell 7 is already installed."
|
Write-Host "Powershell 7 is already installed."
|
||||||
} else {
|
} else {
|
||||||
Write-Host "Installing Powershell 7..."
|
Write-Host "Installing Powershell 7..."
|
||||||
Install-WinUtilProgramWinget -Action Install -Programs @("Microsoft.PowerShell")
|
Invoke-WinUtilWingetProgram -Action Install -Programs @("Microsoft.PowerShell")
|
||||||
}
|
}
|
||||||
$targetTerminalName = "PowerShell"
|
$targetTerminalName = "PowerShell"
|
||||||
}
|
}
|
||||||
|
@ -1,319 +0,0 @@
|
|||||||
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
|
|
||||||
Invoke-WPFUIElements -configVariable $sync.configs.applications -targetGridName "install" -columncount 5
|
|
||||||
.NOTES
|
|
||||||
Future me/contributer: If possible please wrap this into a runspace to make it load all panels at the same time.
|
|
||||||
#>
|
|
||||||
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory, position=0)]
|
|
||||||
[PSCustomObject]$configVariable,
|
|
||||||
|
|
||||||
[Parameter(Mandatory, position=1)]
|
|
||||||
[string]$targetGridName,
|
|
||||||
|
|
||||||
[Parameter(Mandatory, position=2)]
|
|
||||||
[int]$columncount
|
|
||||||
)
|
|
||||||
|
|
||||||
$window = $sync["Form"]
|
|
||||||
|
|
||||||
$theme = $sync.configs.themes.$ctttheme
|
|
||||||
$borderstyle = $window.FindResource("BorderStyle")
|
|
||||||
$HoverTextBlockStyle = $window.FindResource("HoverTextBlockStyle")
|
|
||||||
$ColorfulToggleSwitchStyle = $window.FindResource("ColorfulToggleSwitchStyle")
|
|
||||||
|
|
||||||
if (!$borderstyle -or !$HoverTextBlockStyle -or !$ColorfulToggleSwitchStyle) {
|
|
||||||
throw "Failed to retrieve Styles using 'FindResource' from main window element."
|
|
||||||
}
|
|
||||||
|
|
||||||
$targetGrid = $window.FindName($targetGridName)
|
|
||||||
|
|
||||||
if (!$targetGrid) {
|
|
||||||
throw "Failed to retrieve Target Grid by name, provided name: $targetGrid"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# 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 = $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 = $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 = $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 = $ColorfulToggleSwitchStyle
|
|
||||||
|
|
||||||
$label = New-Object Windows.Controls.Label
|
|
||||||
$label.Content = $entryInfo.Content
|
|
||||||
$label.ToolTip = $entryInfo.Description
|
|
||||||
$label.HorizontalAlignment = "Left"
|
|
||||||
$label.FontSize = $theme.FontSize
|
|
||||||
$label.Foreground = $theme.MainForegroundColor
|
|
||||||
$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 = $theme.ButtonMargin
|
|
||||||
|
|
||||||
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 = $theme.ButtonMargin
|
|
||||||
$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 = $HoverTextBlockStyle
|
|
||||||
|
|
||||||
$horizontalStackPanel.Children.Add($textBlock) | Out-Null
|
|
||||||
|
|
||||||
$sync[$textBlock.Name] = $textBlock
|
|
||||||
}
|
|
||||||
|
|
||||||
$stackPanel.Children.Add($horizontalStackPanel) | Out-Null
|
|
||||||
$sync[$entryInfo.Name] = $checkBox
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,65 +2,43 @@ Function Invoke-WPFUltimatePerformance {
|
|||||||
<#
|
<#
|
||||||
|
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Enables or disables the Ultimate Performance power scheme based on its GUID.
|
Creates or removes the Ultimate Performance power scheme
|
||||||
|
|
||||||
.PARAMETER State
|
.PARAMETER State
|
||||||
Specifies whether to "Enable" or "Disable" the Ultimate Performance power scheme.
|
Indicates whether to enable or disable the Ultimate Performance power scheme
|
||||||
|
|
||||||
#>
|
#>
|
||||||
param($State)
|
param($State)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
# GUID of the Ultimate Performance power plan
|
# Check if Ultimate Performance plan is installed
|
||||||
$ultimateGUID = "e9a42b02-d5df-448d-aa00-03f14749eb61"
|
$ultimatePlan = powercfg -list | Select-String -Pattern "Ultimate Performance"
|
||||||
|
if($state -eq "Enable") {
|
||||||
if ($State -eq "Enable") {
|
if ($ultimatePlan) {
|
||||||
# Duplicate the Ultimate Performance power plan using its GUID
|
Write-Host "Ultimate Performance plan is already installed."
|
||||||
$duplicateOutput = powercfg /duplicatescheme $ultimateGUID
|
} else {
|
||||||
|
Write-Host "Installing Ultimate Performance plan..."
|
||||||
$guid = $null
|
powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61
|
||||||
$nameFromFile = "ChrisTitus - Ultimate Power Plan"
|
Write-Host "> Ultimate Performance plan installed."
|
||||||
$description = "Ultimate Power Plan, added via WinUtils"
|
|
||||||
|
|
||||||
# Extract the new GUID from the duplicateOutput
|
|
||||||
foreach ($line in $duplicateOutput) {
|
|
||||||
if ($line -match "\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b") {
|
|
||||||
$guid = $matches[0] # $matches[0] will contain the first match, which is the GUID
|
|
||||||
Write-Output "GUID: $guid has been extracted and stored in the variable."
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-not $guid) {
|
# Set the Ultimate Performance plan as active
|
||||||
Write-Output "No GUID found in the duplicateOutput. Check the output format."
|
$ultimatePlanGUID = (powercfg -list | Select-String -Pattern "Ultimate Performance").Line.Split()[3]
|
||||||
exit 1
|
powercfg -setactive $ultimatePlanGUID
|
||||||
}
|
|
||||||
|
|
||||||
# Change the name of the power plan and set its description
|
Write-Host "Ultimate Performance plan is now active."
|
||||||
$changeNameOutput = powercfg /changename $guid "$nameFromFile" "$description"
|
|
||||||
Write-Output "The power plan name and description have been changed. Output:"
|
|
||||||
Write-Output $changeNameOutput
|
|
||||||
|
|
||||||
# Set the duplicated Ultimate Performance plan as active
|
|
||||||
$setActiveOutput = powercfg /setactive $guid
|
|
||||||
Write-Output "The power plan has been set as active. Output:"
|
|
||||||
Write-Output $setActiveOutput
|
|
||||||
|
|
||||||
Write-Host "> Ultimate Performance plan installed and set as active."
|
}
|
||||||
|
elseif($state -eq "Disable") {
|
||||||
} elseif ($State -eq "Disable") {
|
if ($ultimatePlan) {
|
||||||
# Check if the Ultimate Performance plan is installed by GUID
|
# Extract the GUID of the Ultimate Performance plan
|
||||||
$installedPlan = powercfg -list | Select-String -Pattern $ultimateGUID
|
$ultimatePlanGUID = $ultimatePlan.Line.Split()[3]
|
||||||
|
|
||||||
if ($installedPlan) {
|
|
||||||
# Extract the GUID of the installed Ultimate Performance plan
|
|
||||||
$ultimatePlanGUID = $installedPlan.Line.Split()[3]
|
|
||||||
|
|
||||||
# Set a different power plan as active before deleting the Ultimate Performance plan
|
# Set a different power plan as active before deleting the Ultimate Performance plan
|
||||||
$balancedPlanGUID = (powercfg -list | Select-String -Pattern "Balanced").Line.Split()[3]
|
$balancedPlanGUID = (powercfg -list | Select-String -Pattern "Balanced").Line.Split()[3]
|
||||||
powercfg -setactive $balancedPlanGUID
|
powercfg -setactive $balancedPlanGUID
|
||||||
|
|
||||||
# Delete the Ultimate Performance plan by GUID
|
# Delete the Ultimate Performance plan
|
||||||
powercfg -delete $ultimatePlanGUID
|
powercfg -delete $ultimatePlanGUID
|
||||||
|
|
||||||
Write-Host "Ultimate Performance plan has been uninstalled."
|
Write-Host "Ultimate Performance plan has been uninstalled."
|
||||||
@ -70,6 +48,6 @@ Function Invoke-WPFUltimatePerformance {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
Write-Error "Error occurred: $_"
|
Write-Warning $psitem.Exception.Message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,51 +28,38 @@ function Invoke-WPFUnInstall {
|
|||||||
$confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
|
$confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
|
||||||
|
|
||||||
if($confirm -eq "No") {return}
|
if($confirm -eq "No") {return}
|
||||||
$ChocoPreference = $($sync.WPFpreferChocolatey.IsChecked)
|
|
||||||
|
|
||||||
Invoke-WPFRunspace -ArgumentList @(("PackagesToInstall", $PackagesToInstall),("ChocoPreference", $ChocoPreference)) -DebugPreference $DebugPreference -ScriptBlock {
|
|
||||||
param($PackagesToInstall, $ChocoPreference, $DebugPreference)
|
Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
|
||||||
|
param($PackagesToInstall, $DebugPreference)
|
||||||
if ($PackagesToInstall.count -eq 1) {
|
if ($PackagesToInstall.count -eq 1) {
|
||||||
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
|
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" })
|
||||||
} else {
|
} else {
|
||||||
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value 0.01 -overlay "logo" })
|
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value 0.01 -overlay "logo" })
|
||||||
}
|
}
|
||||||
$packagesWinget, $packagesChoco = {
|
$packagesWinget, $packagesChoco = {
|
||||||
$packagesWinget = [System.Collections.ArrayList]::new()
|
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
|
||||||
$packagesChoco = [System.Collections.ArrayList]::new()
|
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
|
||||||
|
foreach ($package in $PackagesToInstall) {
|
||||||
foreach ($package in $PackagesToInstall) {
|
|
||||||
if ($ChocoPreference) {
|
|
||||||
if ($package.choco -eq "na") {
|
|
||||||
$packagesWinget.add($package.winget)
|
|
||||||
Write-Host "Queueing $($package.winget) for Winget uninstall"
|
|
||||||
} else {
|
|
||||||
$null = $packagesChoco.add($package.choco)
|
|
||||||
Write-Host "Queueing $($package.choco) for Chocolatey uninstall"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ($package.winget -eq "na") {
|
if ($package.winget -eq "na") {
|
||||||
$packagesChoco.add($package.choco)
|
$packagesChoco.add($package)
|
||||||
Write-Host "Queueing $($package.choco) for Chocolatey uninstall"
|
Write-Host "Queueing $($package.choco) for Chocolatey Uninstall"
|
||||||
} else {
|
} else {
|
||||||
$null = $packagesWinget.add($($package.winget))
|
$packagesWinget.add($($package.winget))
|
||||||
Write-Host "Queueing $($package.winget) for Winget uninstall"
|
Write-Host "Queueing $($package.winget) for Winget Uninstall"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return $packagesWinget, $packagesChoco
|
||||||
return $packagesWinget, $packagesChoco
|
|
||||||
}.Invoke($PackagesToInstall)
|
}.Invoke($PackagesToInstall)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$sync.ProcessRunning = $true
|
$sync.ProcessRunning = $true
|
||||||
|
|
||||||
# Install all selected programs in new window
|
# Install all selected programs in new window
|
||||||
if($packagesWinget.Count -gt 0) {
|
if($packagesWinget.Count -gt 0) {
|
||||||
Install-WinUtilProgramWinget -Action Uninstall -Programs $packagesWinget
|
Invoke-WinUtilWingetProgram -Action Uninstall -Programs $packagesWinget
|
||||||
}
|
}
|
||||||
if($packagesChoco.Count -gt 0) {
|
if($packagesChoco.Count -gt 0) {
|
||||||
Install-WinUtilProgramChoco -Action Uninstall -Programs $packagesChoco
|
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco -Manage "Uninstalling"
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "==========================================="
|
Write-Host "==========================================="
|
||||||
|
@ -6,13 +6,21 @@ function Invoke-WPFtweaksbutton {
|
|||||||
|
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
param (
|
||||||
|
$TweaksConfig
|
||||||
|
)
|
||||||
|
|
||||||
if($sync.ProcessRunning) {
|
if($sync.ProcessRunning) {
|
||||||
$msg = "[Invoke-WPFtweaksbutton] Install process is currently running."
|
$msg = "[Invoke-WPFtweaksbutton] Install process is currently running."
|
||||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
$Tweaks = (Get-WinUtilCheckBoxes)["WPFTweaks"]
|
if ($TweaksConfig) {
|
||||||
|
$Tweaks = $TweaksConfig
|
||||||
|
} else {
|
||||||
|
$Tweaks = (Get-WinUtilCheckBoxes)["WPFTweaks"]
|
||||||
|
}
|
||||||
|
|
||||||
Set-WinUtilDNS -DNSProvider $sync["WPFchangedns"].text
|
Set-WinUtilDNS -DNSProvider $sync["WPFchangedns"].text
|
||||||
|
|
||||||
@ -24,12 +32,8 @@ function Invoke-WPFtweaksbutton {
|
|||||||
|
|
||||||
Write-Debug "Number of tweaks to process: $($Tweaks.Count)"
|
Write-Debug "Number of tweaks to process: $($Tweaks.Count)"
|
||||||
|
|
||||||
# The leading "," in the ParameterList is nessecary because we only provide one argument and powershell cannot be convinced that we want a nested loop with only one argument otherwise
|
Invoke-WPFRunspace -ArgumentList $Tweaks -DebugPreference $DebugPreference -ScriptBlock {
|
||||||
$tweaksHandle = Invoke-WPFRunspace -ParameterList @(,("tweaks",$tweaks)) -DebugPreference $DebugPreference -ScriptBlock {
|
param($Tweaks, $DebugPreference)
|
||||||
param(
|
|
||||||
$tweaks,
|
|
||||||
$DebugPreference
|
|
||||||
)
|
|
||||||
Write-Debug "Inside Number of tweaks to process: $($Tweaks.Count)"
|
Write-Debug "Inside Number of tweaks to process: $($Tweaks.Count)"
|
||||||
|
|
||||||
$sync.ProcessRunning = $true
|
$sync.ProcessRunning = $true
|
||||||
@ -42,9 +46,8 @@ function Invoke-WPFtweaksbutton {
|
|||||||
# Execute other selected tweaks
|
# Execute other selected tweaks
|
||||||
|
|
||||||
for ($i = 0; $i -lt $Tweaks.Count; $i++) {
|
for ($i = 0; $i -lt $Tweaks.Count; $i++) {
|
||||||
Set-WinUtilProgressBar -Label "Applying $($tweaks[$i])" -Percent ($i / $tweaks.Count * 100)
|
Set-WinUtilProgressBar -Label "Applying $($tweaks[$i])" -Percent ($i / $Tweaks.Count * 100)
|
||||||
Invoke-WinUtilTweaks $tweaks[$i]
|
Invoke-WinUtilTweaks $tweaks[$i]$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($i/$Tweaks.Count) })
|
||||||
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($i/$Tweaks.Count) })
|
|
||||||
}
|
}
|
||||||
Set-WinUtilProgressBar -Label "Tweaks finished" -Percent 100
|
Set-WinUtilProgressBar -Label "Tweaks finished" -Percent 100
|
||||||
$sync.ProcessRunning = $false
|
$sync.ProcessRunning = $false
|
||||||
|
@ -1,12 +1,5 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
|
||||||
{% block header %}
|
|
||||||
{{ super() }}
|
|
||||||
<div style="color: red; text-align: center; padding: 10px; font-size: 20px;">
|
|
||||||
<strong>Announcement:</strong> We are currently not adding any applications to WinUtil and any apps that will be added through a PR will be declined by the maintainer.
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block footer %}
|
{% block footer %}
|
||||||
{# Empty block to override the footer #}
|
{# Empty block to override the footer #}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -37,12 +37,6 @@ Describe "Config Files" -ForEach @(
|
|||||||
$result = New-Object System.Collections.Generic.List[System.Object]
|
$result = New-Object System.Collections.Generic.List[System.Object]
|
||||||
Foreach ($application in $applications) {
|
Foreach ($application in $applications) {
|
||||||
$compare = $global:importedconfigs.$name.$application | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty name
|
$compare = $global:importedconfigs.$name.$application | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty name
|
||||||
if (-not $compare) {
|
|
||||||
throw "Comparison object for application '$application' is null."
|
|
||||||
}
|
|
||||||
if (-not $template) {
|
|
||||||
throw "Template object for application '$application' is null."
|
|
||||||
}
|
|
||||||
if ($(Compare-Object $compare $template) -ne $null) {
|
if ($(Compare-Object $compare $template) -ne $null) {
|
||||||
$result.Add($application)
|
$result.Add($application)
|
||||||
}
|
}
|
||||||
|
228
scripts/main.ps1
228
scripts/main.ps1
@ -32,19 +32,19 @@ $sync.runspace.Open()
|
|||||||
# Create classes for different exceptions
|
# Create classes for different exceptions
|
||||||
|
|
||||||
class WingetFailedInstall : Exception {
|
class WingetFailedInstall : Exception {
|
||||||
[string]$additionalData
|
[string] $additionalData
|
||||||
|
|
||||||
WingetFailedInstall($Message) : base($Message) {}
|
WingetFailedInstall($Message) : base($Message) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ChocoFailedInstall : Exception {
|
class ChocoFailedInstall : Exception {
|
||||||
[string]$additionalData
|
[string] $additionalData
|
||||||
|
|
||||||
ChocoFailedInstall($Message) : base($Message) {}
|
ChocoFailedInstall($Message) : base($Message) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GenericException : Exception {
|
class GenericException : Exception {
|
||||||
[string]$additionalData
|
[string] $additionalData
|
||||||
|
|
||||||
GenericException($Message) : base($Message) {}
|
GenericException($Message) : base($Message) {}
|
||||||
}
|
}
|
||||||
@ -52,7 +52,6 @@ $sync.runspace.Open()
|
|||||||
|
|
||||||
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
|
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
|
||||||
|
|
||||||
$defaulttheme = '_default'
|
|
||||||
if ((Get-WinUtilToggleStatus WPFToggleDarkMode) -eq $True) {
|
if ((Get-WinUtilToggleStatus WPFToggleDarkMode) -eq $True) {
|
||||||
if (Invoke-WinUtilGPU -eq $True) {
|
if (Invoke-WinUtilGPU -eq $True) {
|
||||||
$ctttheme = 'Matrix'
|
$ctttheme = 'Matrix'
|
||||||
@ -62,70 +61,44 @@ if ((Get-WinUtilToggleStatus WPFToggleDarkMode) -eq $True) {
|
|||||||
} else {
|
} else {
|
||||||
$ctttheme = 'Classic'
|
$ctttheme = 'Classic'
|
||||||
}
|
}
|
||||||
|
$inputXML = Set-WinUtilUITheme -inputXML $inputXML -themeName $ctttheme
|
||||||
$returnVal = Set-WinUtilUITheme -inputXML $inputXML -customThemeName $ctttheme -defaultThemeName $defaulttheme
|
|
||||||
if ($returnVal[0] -eq "") {
|
|
||||||
Write-Host "Failed to statically apply theming to xaml content using Set-WinUtilTheme, please check previous Error/Warning messages." -ForegroundColor Red
|
|
||||||
Write-Host "Quitting winutil..." -ForegroundColor Red
|
|
||||||
$sync.runspace.Dispose()
|
|
||||||
$sync.runspace.Close()
|
|
||||||
[System.GC]::Collect()
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
$inputXML = $returnVal[0]
|
|
||||||
$ctttheme = $returnVal[1]
|
|
||||||
|
|
||||||
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
|
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
|
||||||
[xml]$XAML = $inputXML
|
[xml]$XAML = $inputXML
|
||||||
|
|
||||||
# Read the XAML file
|
# Read the XAML file
|
||||||
$readerOperationSuccessful = $false # There's more cases of failure then success.
|
|
||||||
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
|
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
|
||||||
try {
|
try {
|
||||||
$sync["Form"] = [Windows.Markup.XamlReader]::Load( $reader )
|
$sync["Form"] = [Windows.Markup.XamlReader]::Load( $reader )
|
||||||
$readerOperationSuccessful = $true
|
|
||||||
} catch [System.Management.Automation.MethodInvocationException] {
|
} catch [System.Management.Automation.MethodInvocationException] {
|
||||||
Write-Host "We ran into a problem with the XAML code. Check the syntax for this control..." -ForegroundColor Red
|
Write-Warning "We ran into a problem with the XAML code. Check the syntax for this control..."
|
||||||
Write-Host $error[0].Exception.Message -ForegroundColor Red
|
Write-Host $error[0].Exception.Message -ForegroundColor Red
|
||||||
|
|
||||||
If ($error[0].Exception.Message -like "*button*") {
|
If ($error[0].Exception.Message -like "*button*") {
|
||||||
write-Host "Ensure your <button in the `$inputXML does NOT have a Click=ButtonClick property. PS can't handle this`n`n`n`n" -ForegroundColor Red
|
write-warning "Ensure your <button in the `$inputXML does NOT have a Click=ButtonClick property. PS can't handle this`n`n`n`n"
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed." -ForegroundColor Red
|
Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-NOT ($readerOperationSuccessful)) {
|
|
||||||
Write-Host "Failed to parse xaml content using Windows.Markup.XamlReader's Load Method." -ForegroundColor Red
|
|
||||||
Write-Host "Quitting winutil..." -ForegroundColor Red
|
|
||||||
$sync.runspace.Dispose()
|
|
||||||
$sync.runspace.Close()
|
|
||||||
[System.GC]::Collect()
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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
|
# Store Form Objects In PowerShell
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
|
|
||||||
$xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"] = $sync["Form"].FindName($psitem.Name)}
|
$xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"] = $sync["Form"].FindName($psitem.Name)}
|
||||||
|
|
||||||
#Persist the Chocolatey preference across winutil restarts
|
|
||||||
$ChocoPreferencePath = "$env:LOCALAPPDATA\winutil\preferChocolatey.ini"
|
|
||||||
$sync.WPFpreferChocolatey.Add_Checked({New-Item -Path $ChocoPreferencePath -Force })
|
|
||||||
$sync.WPFpreferChocolatey.Add_Unchecked({Remove-Item $ChocoPreferencePath -Force})
|
|
||||||
if (Test-Path $ChocoPreferencePath) {
|
|
||||||
$sync.WPFpreferChocolatey.IsChecked = $true
|
|
||||||
}
|
|
||||||
|
|
||||||
$sync.keys | ForEach-Object {
|
$sync.keys | ForEach-Object {
|
||||||
if($sync.$psitem) {
|
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") {
|
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "ToggleButton") {
|
||||||
$sync["$psitem"].Add_Click({
|
$sync["$psitem"].Add_Click({
|
||||||
[System.Object]$Sender = $args[0]
|
[System.Object]$Sender = $args[0]
|
||||||
@ -173,12 +146,60 @@ Invoke-WPFRunspace -ScriptBlock {
|
|||||||
} | Out-Null
|
} | Out-Null
|
||||||
|
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
# Setup and Show the Form
|
# Print Logo into Console
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
|
|
||||||
# Print the logo
|
|
||||||
Invoke-WPFFormVariables
|
Invoke-WPFFormVariables
|
||||||
|
|
||||||
|
#===========================================================================
|
||||||
|
# Run Automation
|
||||||
|
#===========================================================================
|
||||||
|
|
||||||
|
if ($PARAM_CONFIG) {
|
||||||
|
if ($PARAM_RUN) {
|
||||||
|
$installConfig = Get-Content $PARAM_CONFIG -Raw | ConvertFrom-Json
|
||||||
|
if ($installConfig.WPFInstall) {
|
||||||
|
write-host "Installing Programs"
|
||||||
|
|
||||||
|
# Create a new array to hold the combined install configurations
|
||||||
|
$combinedInstallConfig = @()
|
||||||
|
|
||||||
|
# Iterate over each WPFInstall entry
|
||||||
|
for ($i = 0; $i -lt $installConfig.WPFInstall.Count; $i++) {
|
||||||
|
$wpfInstallEntry = $installConfig.WPFInstall[$i]
|
||||||
|
$installEntry = $installConfig.Install[$i]
|
||||||
|
|
||||||
|
# Create a new object with the combined values
|
||||||
|
$combinedEntry = @{
|
||||||
|
Name = $wpfInstallEntry
|
||||||
|
Winget = $installEntry.winget
|
||||||
|
Choco = $installEntry.choco
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the combined entry to the array
|
||||||
|
$combinedInstallConfig += $combinedEntry
|
||||||
|
}
|
||||||
|
|
||||||
|
# Invoke the WPFInstall function with the combined configuration
|
||||||
|
Invoke-WPFInstall -InstallConfig $combinedInstallConfig
|
||||||
|
}
|
||||||
|
if ($installConfig.WPFTweaks) {
|
||||||
|
write-host "Running Tweaks"
|
||||||
|
Invoke-WPFtweaksbutton -TweaksConfig $installConfig.WPFTweaks
|
||||||
|
}
|
||||||
|
if ($installConfig.WPFFeature) {
|
||||||
|
write-host "Installing Features"
|
||||||
|
Invoke-WPFFeatureInstall -FeatureConfig $installConfig.WPFFeature
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Invoke-WPFImpex -type "import" -Config $PARAM_CONFIG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#===========================================================================
|
||||||
|
# Setup and Show the Form
|
||||||
|
#===========================================================================
|
||||||
|
|
||||||
# Progress bar in taskbaritem > Set-WinUtilProgressbar
|
# Progress bar in taskbaritem > Set-WinUtilProgressbar
|
||||||
$sync["Form"].TaskbarItemInfo = New-Object System.Windows.Shell.TaskbarItemInfo
|
$sync["Form"].TaskbarItemInfo = New-Object System.Windows.Shell.TaskbarItemInfo
|
||||||
Set-WinUtilTaskbaritem -state "None"
|
Set-WinUtilTaskbaritem -state "None"
|
||||||
@ -345,42 +366,6 @@ Add-Type @"
|
|||||||
|
|
||||||
Invoke-WPFTab "WPFTab1BT"
|
Invoke-WPFTab "WPFTab1BT"
|
||||||
$sync["Form"].Focus()
|
$sync["Form"].Focus()
|
||||||
|
|
||||||
# maybe this is not the best place to load and execute config file?
|
|
||||||
# maybe community can help?
|
|
||||||
if ($PARAM_CONFIG) {
|
|
||||||
Invoke-WPFImpex -type "import" -Config $PARAM_CONFIG
|
|
||||||
if ($PARAM_RUN) {
|
|
||||||
while ($sync.ProcessRunning) {
|
|
||||||
Start-Sleep -Seconds 5
|
|
||||||
}
|
|
||||||
Start-Sleep -Seconds 5
|
|
||||||
|
|
||||||
Write-Host "Applying tweaks..."
|
|
||||||
Invoke-WPFtweaksbutton
|
|
||||||
while ($sync.ProcessRunning) {
|
|
||||||
Start-Sleep -Seconds 5
|
|
||||||
}
|
|
||||||
Start-Sleep -Seconds 5
|
|
||||||
|
|
||||||
Write-Host "Installing features..."
|
|
||||||
Invoke-WPFFeatureInstall
|
|
||||||
while ($sync.ProcessRunning) {
|
|
||||||
Start-Sleep -Seconds 5
|
|
||||||
}
|
|
||||||
|
|
||||||
Start-Sleep -Seconds 5
|
|
||||||
Write-Host "Installing applications..."
|
|
||||||
while ($sync.ProcessRunning) {
|
|
||||||
Start-Sleep -Seconds 1
|
|
||||||
}
|
|
||||||
Invoke-WPFInstall
|
|
||||||
Start-Sleep -Seconds 5
|
|
||||||
|
|
||||||
Write-Host "Done."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
# Load Checkboxes and Labels outside of the Filter function only once on startup for performance reasons
|
# Load Checkboxes and Labels outside of the Filter function only once on startup for performance reasons
|
||||||
@ -394,6 +379,7 @@ $labels = @{}
|
|||||||
$allCategories = $checkBoxes.Name | ForEach-Object {$sync.configs.applications.$_} | Select-Object -Unique -ExpandProperty category
|
$allCategories = $checkBoxes.Name | ForEach-Object {$sync.configs.applications.$_} | Select-Object -Unique -ExpandProperty category
|
||||||
|
|
||||||
$sync["SearchBar"].Add_TextChanged({
|
$sync["SearchBar"].Add_TextChanged({
|
||||||
|
|
||||||
if ($sync.SearchBar.Text -ne "") {
|
if ($sync.SearchBar.Text -ne "") {
|
||||||
$sync.SearchBarClearButton.Visibility = "Visible"
|
$sync.SearchBarClearButton.Visibility = "Visible"
|
||||||
} else {
|
} else {
|
||||||
@ -402,40 +388,39 @@ $sync["SearchBar"].Add_TextChanged({
|
|||||||
|
|
||||||
$activeApplications = @()
|
$activeApplications = @()
|
||||||
|
|
||||||
$textToSearch = $sync.SearchBar.Text.ToLower()
|
|
||||||
|
|
||||||
foreach ($CheckBox in $CheckBoxes) {
|
foreach ($CheckBox in $CheckBoxes) {
|
||||||
# Check if the checkbox is null or if it doesn't have content
|
# Check if the checkbox is null or if it doesn't have content
|
||||||
if ($CheckBox -eq $null -or $CheckBox.Value -eq $null -or $CheckBox.Value.Content -eq $null) {
|
if ($CheckBox -eq $null -or $CheckBox.Value -eq $null -or $CheckBox.Value.Content -eq $null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$textToSearch = $sync.SearchBar.Text.ToLower()
|
||||||
$checkBoxName = $CheckBox.Key
|
$checkBoxName = $CheckBox.Key
|
||||||
$textBlockName = $checkBoxName + "Link"
|
$textBlockName = $checkBoxName + "Link"
|
||||||
|
|
||||||
# Retrieve the corresponding text block based on the generated name
|
# Retrieve the corresponding text block based on the generated name
|
||||||
$textBlock = $sync[$textBlockName]
|
$textBlock = $sync[$textBlockName]
|
||||||
|
|
||||||
if ($CheckBox.Value.Content.ToString().ToLower().Contains($textToSearch)) {
|
if ($CheckBox.Value.Content.ToLower().Contains($textToSearch)) {
|
||||||
$CheckBox.Value.Visibility = "Visible"
|
$CheckBox.Value.Visibility = "Visible"
|
||||||
$activeApplications += $sync.configs.applications.$checkboxName
|
$activeApplications += $sync.configs.applications.$checkboxName
|
||||||
# Set the corresponding text block visibility
|
# Set the corresponding text block visibility
|
||||||
if ($textBlock -ne $null -and $textBlock -is [System.Windows.Controls.TextBlock]) {
|
if ($textBlock -ne $null) {
|
||||||
$textBlock.Visibility = "Visible"
|
$textBlock.Visibility = "Visible"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$CheckBox.Value.Visibility = "Collapsed"
|
$CheckBox.Value.Visibility = "Collapsed"
|
||||||
# Set the corresponding text block visibility
|
# Set the corresponding text block visibility
|
||||||
if ($textBlock -ne $null -and $textBlock -is [System.Windows.Controls.TextBlock]) {
|
if ($textBlock -ne $null) {
|
||||||
$textBlock.Visibility = "Collapsed"
|
$textBlock.Visibility = "Collapsed"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$activeCategories = $activeApplications | Select-Object -ExpandProperty category -Unique
|
$activeCategories = $activeApplications | Select-Object -ExpandProperty category -Unique
|
||||||
|
|
||||||
foreach ($category in $activeCategories) {
|
foreach ($category in $activeCategories) {
|
||||||
$sync[$category].Visibility = "Visible"
|
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
|
||||||
|
$label.Visibility = "Visible"
|
||||||
}
|
}
|
||||||
if ($activeCategories) {
|
if ($activeCategories) {
|
||||||
$inactiveCategories = Compare-Object -ReferenceObject $allCategories -DifferenceObject $activeCategories -PassThru
|
$inactiveCategories = Compare-Object -ReferenceObject $allCategories -DifferenceObject $activeCategories -PassThru
|
||||||
@ -443,35 +428,39 @@ $sync["SearchBar"].Add_TextChanged({
|
|||||||
$inactiveCategories = $allCategories
|
$inactiveCategories = $allCategories
|
||||||
}
|
}
|
||||||
foreach ($category in $inactiveCategories) {
|
foreach ($category in $inactiveCategories) {
|
||||||
$sync[$category].Visibility = "Collapsed"
|
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
|
||||||
}
|
$label.Visibility = "Collapsed"}
|
||||||
})
|
})
|
||||||
|
|
||||||
$sync["Form"].Add_Loaded({
|
|
||||||
param($e)
|
|
||||||
$sync["Form"].MaxWidth = [Double]::PositiveInfinity
|
|
||||||
$sync["Form"].MaxHeight = [Double]::PositiveInfinity
|
|
||||||
})
|
|
||||||
|
|
||||||
$NavLogoPanel = $sync["Form"].FindName("NavLogoPanel")
|
|
||||||
$NavLogoPanel.Children.Add((Invoke-WinUtilAssets -Type "logo" -Size 25)) | Out-Null
|
|
||||||
|
|
||||||
# Initialize the hashtable
|
# Initialize the hashtable
|
||||||
$winutildir = @{}
|
$winutildir = @{}
|
||||||
|
|
||||||
# Set the path for the winutil directory
|
# Set the path for the winutil directory
|
||||||
$winutildir["path"] = "$env:LOCALAPPDATA\winutil\"
|
$winutildir["path"] = "$env:LOCALAPPDATA\winutil\"
|
||||||
[System.IO.Directory]::CreateDirectory($winutildir["path"]) | Out-Null
|
if (-NOT (Test-Path -Path $winutildir["path"])) {
|
||||||
|
New-Item -Path $winutildir["path"] -ItemType Directory
|
||||||
$winutildir["logo.ico"] = $winutildir["path"] + "cttlogo.ico"
|
|
||||||
|
|
||||||
if (Test-Path $winutildir["logo.ico"]) {
|
|
||||||
$sync["logorender"] = $winutildir["logo.ico"]
|
|
||||||
} else {
|
|
||||||
$sync["logorender"] = (Invoke-WinUtilAssets -Type "Logo" -Size 90 -Render)
|
|
||||||
}
|
}
|
||||||
$sync["checkmarkrender"] = (Invoke-WinUtilAssets -Type "checkmark" -Size 512 -Render)
|
|
||||||
$sync["warningrender"] = (Invoke-WinUtilAssets -Type "warning" -Size 512 -Render)
|
# 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"
|
Set-WinUtilTaskbaritem -overlay "logo"
|
||||||
|
|
||||||
@ -520,10 +509,10 @@ Version : <a href="https://github.com/ChrisTitusTech/winutil/releases/tag/$($sy
|
|||||||
"@
|
"@
|
||||||
$FontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSize
|
$FontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSize
|
||||||
$HeaderFontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSizeHeader
|
$HeaderFontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSizeHeader
|
||||||
$LogoSize = $sync.configs.themes.$ctttheme.CustomDialogLogoSize
|
$IconSize = $sync.configs.themes.$ctttheme.CustomDialogIconSize
|
||||||
$Width = $sync.configs.themes.$ctttheme.CustomDialogWidth
|
$Width = $sync.configs.themes.$ctttheme.CustomDialogWidth
|
||||||
$Height = $sync.configs.themes.$ctttheme.CustomDialogHeight
|
$Height = $sync.configs.themes.$ctttheme.CustomDialogHeight
|
||||||
Show-CustomDialog -Message $authorInfo -Width $Width -Height $Height -FontSize $FontSize -HeaderFontSize $HeaderFontSize -LogoSize $LogoSize
|
Show-CustomDialog -Message $authorInfo -Width $Width -Height $Height -FontSize $FontSize -HeaderFontSize $HeaderFontSize -IconSize $IconSize
|
||||||
})
|
})
|
||||||
|
|
||||||
$sync["SponsorMenuItem"].Add_Click({
|
$sync["SponsorMenuItem"].Add_Click({
|
||||||
@ -546,10 +535,13 @@ $sync["SponsorMenuItem"].Add_Click({
|
|||||||
|
|
||||||
$FontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSize
|
$FontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSize
|
||||||
$HeaderFontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSizeHeader
|
$HeaderFontSize = $sync.configs.themes.$ctttheme.CustomDialogFontSizeHeader
|
||||||
$LogoSize = $sync.configs.themes.$ctttheme.CustomDialogLogoSize
|
$IconSize = $sync.configs.themes.$ctttheme.CustomDialogIconSize
|
||||||
$Width = $sync.configs.themes.$ctttheme.CustomDialogWidth
|
$Width = $sync.configs.themes.$ctttheme.CustomDialogWidth
|
||||||
$Height = $sync.configs.themes.$ctttheme.CustomDialogHeight
|
$Height = $sync.configs.themes.$ctttheme.CustomDialogHeight
|
||||||
Show-CustomDialog -Message $authorInfo -Width $Width -Height $Height -FontSize $FontSize -HeaderFontSize $HeaderFontSize -LogoSize $LogoSize -EnableScroll $true
|
Show-CustomDialog -Message $authorInfo -Width $Width -Height $Height -FontSize $FontSize -HeaderFontSize $HeaderFontSize -IconSize $IconSize -EnableScroll $true
|
||||||
})
|
})
|
||||||
$sync["Form"].ShowDialog() | out-null
|
|
||||||
Stop-Transcript
|
if (!$PARAM_RUN) {
|
||||||
|
$sync["Form"].ShowDialog() | out-null
|
||||||
|
Stop-Transcript
|
||||||
|
}
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
GitHub : https://github.com/ChrisTitusTech
|
GitHub : https://github.com/ChrisTitusTech
|
||||||
Version : #{replaceme}
|
Version : #{replaceme}
|
||||||
#>
|
#>
|
||||||
|
|
||||||
param (
|
param (
|
||||||
[switch]$Debug,
|
[switch]$Debug,
|
||||||
[string]$Config,
|
[string]$Config,
|
||||||
@ -28,6 +27,12 @@ if ($Run) {
|
|||||||
$PARAM_RUN = $true
|
$PARAM_RUN = $true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(Test-Path -Path $ENV:TEMP)) {
|
||||||
|
New-Item -ItemType Directory -Force -Path $ENV:TEMP
|
||||||
|
}
|
||||||
|
|
||||||
|
Start-Transcript $ENV:TEMP\Winutil.log -Append
|
||||||
|
|
||||||
# Load DLLs
|
# Load DLLs
|
||||||
Add-Type -AssemblyName PresentationFramework
|
Add-Type -AssemblyName PresentationFramework
|
||||||
Add-Type -AssemblyName System.Windows.Forms
|
Add-Type -AssemblyName System.Windows.Forms
|
||||||
@ -39,38 +44,15 @@ $sync.version = "#{replaceme}"
|
|||||||
$sync.configs = @{}
|
$sync.configs = @{}
|
||||||
$sync.ProcessRunning = $false
|
$sync.ProcessRunning = $false
|
||||||
|
|
||||||
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
# If script isn't running as admin, show error message and quit
|
||||||
Write-Output "Winutil needs to be run as Administrator. Attempting to relaunch."
|
If (([Security.Principal.WindowsIdentity]::GetCurrent()).Owner.Value -ne "S-1-5-32-544") {
|
||||||
$argList = @()
|
Write-Host "===========================================" -Foregroundcolor Red
|
||||||
|
Write-Host "-- Scripts must be run as Administrator ---" -Foregroundcolor Red
|
||||||
$PSBoundParameters.GetEnumerator() | ForEach-Object {
|
Write-Host "-- Right-Click Start -> Terminal(Admin) ---" -Foregroundcolor Red
|
||||||
$argList += if ($_.Value -is [switch] -and $_.Value) {
|
Write-Host "===========================================" -Foregroundcolor Red
|
||||||
"-$($_.Key)"
|
|
||||||
} elseif ($_.Value) {
|
|
||||||
"-$($_.Key) `"$($_.Value)`""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$script = if ($MyInvocation.MyCommand.Path) {
|
|
||||||
"& { & '$($MyInvocation.MyCommand.Path)' $argList }"
|
|
||||||
} else {
|
|
||||||
"iex '& { $(irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1) } $argList'"
|
|
||||||
}
|
|
||||||
|
|
||||||
$powershellcmd = if (Get-Command pwsh -ErrorAction SilentlyContinue) { "pwsh" } else { "powershell" }
|
|
||||||
$processCmd = if (Get-Command wt.exe -ErrorAction SilentlyContinue) { "wt.exe" } else { $powershellcmd }
|
|
||||||
|
|
||||||
Start-Process $processCmd -ArgumentList "$powershellcmd -ExecutionPolicy Bypass -NoProfile -Command $script" -Verb RunAs
|
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
$dateTime = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
|
|
||||||
|
|
||||||
$logdir = "$env:localappdata\winutil\logs"
|
|
||||||
[System.IO.Directory]::CreateDirectory("$logdir") | Out-Null
|
|
||||||
Start-Transcript -Path "$logdir\winutil_$dateTime.log" -Append -NoClobber | Out-Null
|
|
||||||
|
|
||||||
# Set PowerShell window title
|
# Set PowerShell window title
|
||||||
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
|
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
|
||||||
clear-host
|
clear-host
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
function Invoke-Preprocessing {
|
function Invoke-Preprocessing {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
A function that does Code Formatting using RegEx, useful when trying to force specific coding standard(s) to a project.
|
A function that does Code Formatting using RegEx, useful when trying to force specific coding standard(s) to a project.
|
||||||
@ -39,7 +39,7 @@ function Invoke-Preprocessing {
|
|||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
Invoke-Preprocessing -ThrowExceptionOnEmptyFilesList -WorkingDir "DRIVE:\Path\To\Folder\" -ExcludedFiles @('file.txt', '.\.git\', '*.png') -ProgressStatusMessage "Doing Preprocessing"
|
Invoke-Preprocessing -ThrowExceptionOnEmptyFilesList -WorkingDir "DRIVE:\Path\To\Folder\" -ExcludedFiles @('file.txt', '.\.git\', '*.png') -ProgressStatusMessage "Doing Preprocessing"
|
||||||
|
|
||||||
Same as Example No. 1, but uses '-ThrowExceptionOnEmptyFilesList', which's an optional parameter that'll make 'Invoke-Preprocessing' throw an exception when no files are found in 'WorkingDir' (not including the ExcludedFiles, of course), useful when you want to double check your parameters & you're sure there's files to process in the 'WorkingDir'.
|
Same as Example No. 1, but will throw an exception when 'Invoke-Preprocessing' function doesn't find any files in 'WorkingDir' (not including 'ExcludedFiles' list).
|
||||||
|
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
Invoke-Preprocessing -Skip -WorkingDir "DRIVE:\Path\To\Folder\" -ExcludedFiles @('file.txt', '.\.git\', '*.png') -ProgressStatusMessage "Doing Preprocessing"
|
Invoke-Preprocessing -Skip -WorkingDir "DRIVE:\Path\To\Folder\" -ExcludedFiles @('file.txt', '.\.git\', '*.png') -ProgressStatusMessage "Doing Preprocessing"
|
||||||
@ -47,7 +47,7 @@ function Invoke-Preprocessing {
|
|||||||
Same as Example No. 1, but uses '-SkipExcludedFilesValidation', which'll skip the validation step for 'ExcludedFiles' list. This can be useful when 'ExcludedFiles' list is generated from another function, or from unreliable source (you can't guarantee every item in list is a valid path), but you want to silently continue through the function.
|
Same as Example No. 1, but uses '-SkipExcludedFilesValidation', which'll skip the validation step for 'ExcludedFiles' list. This can be useful when 'ExcludedFiles' list is generated from another function, or from unreliable source (you can't guarantee every item in list is a valid path), but you want to silently continue through the function.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
param (
|
param (
|
||||||
[Parameter(position=0)]
|
[Parameter(position=0)]
|
||||||
[switch]$SkipExcludedFilesValidation,
|
[switch]$SkipExcludedFilesValidation,
|
||||||
|
|
||||||
@ -66,86 +66,28 @@ function Invoke-Preprocessing {
|
|||||||
|
|
||||||
[Parameter(position=5)]
|
[Parameter(position=5)]
|
||||||
[string]$ProgressActivity = "Preprocessing"
|
[string]$ProgressActivity = "Preprocessing"
|
||||||
)
|
)
|
||||||
|
|
||||||
if (-NOT (Test-Path -PathType Container -Path "$WorkingDir")) {
|
if (-NOT (Test-Path -PathType Container -Path "$WorkingDir")) {
|
||||||
throw "[Invoke-Preprocessing] Invalid Paramter Value for 'WorkingDir', passed value: '$WorkingDir'. Either the path is a File or Non-Existing/Invlid, please double check your code."
|
throw "[Invoke-Preprocessing] Invalid Paramter Value for 'WorkingDir', passed value: '$WorkingDir'. Either the path is a File or Non-Existing/Invlid, please double check your code."
|
||||||
}
|
}
|
||||||
|
|
||||||
$count = $ExcludedFiles.Count
|
$count = $ExcludedFiles.Count
|
||||||
|
if ((-NOT ($count -eq 0)) -AND (-NOT $SkipExcludedFilesValidation)) {
|
||||||
# Make sure there's a * at the end of folders in ExcludedFiles list
|
|
||||||
for ($i = 0; $i -lt $count; $i++) {
|
|
||||||
$excludedFile = $ExcludedFiles[$i]
|
|
||||||
$isFolder = ($excludedFile) -match '\\$'
|
|
||||||
if ($isFolder) { $ExcludedFiles[$i] = $excludedFile + '*' }
|
|
||||||
}
|
|
||||||
|
|
||||||
# Validate the ExcludedFiles List before continuing on,
|
|
||||||
# that's if there's a list in the first place, and '-SkipExcludedFilesValidation' was not provided.
|
|
||||||
if (-not $SkipExcludedFilesValidation) {
|
|
||||||
for ($i = 0; $i -lt $count; $i++) {
|
for ($i = 0; $i -lt $count; $i++) {
|
||||||
$excludedFile = $ExcludedFiles[$i]
|
$excludedFile = $ExcludedFiles[$i]
|
||||||
$filePath = "$(($WorkingDir -replace ('\\$', '')) + '\' + ($excludedFile -replace ('\.\\', '')))"
|
$filePath = "$(($WorkingDir -replace ('\\$', '')) + '\' + ($excludedFile -replace ('\.\\', '')))"
|
||||||
|
if (-NOT (Get-ChildItem -Recurse -Path "$filePath" -File)) {
|
||||||
# Handle paths with wildcards in a different implementation
|
$failedFilesList += "'$filePath', "
|
||||||
$matches = ($filePath) -match '^.*?\*'
|
|
||||||
|
|
||||||
if ($matches) {
|
|
||||||
if (-NOT (Get-ChildItem -Recurse -Path "$filePath" -File -Force)) {
|
|
||||||
$failedFilesList += "'$filePath', "
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (-NOT (Test-Path -Path "$filePath")) {
|
|
||||||
$failedFilesList += "'$filePath', "
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$failedFilesList = $failedFilesList -replace (',\s*$', '')
|
$failedFilesList = $failedFilesList -replace (',\s*$', '')
|
||||||
if (-NOT $failedFilesList -eq "") {
|
if (-NOT $failedFilesList -eq "") {
|
||||||
throw "[Invoke-Preprocessing] One or more File Paths and/or File Patterns were not found, you can use '-SkipExcludedFilesValidation' switch to skip this check, the failed to validate are: $failedFilesList"
|
throw "[Invoke-Preprocessing] One or more File Paths & File Patterns were not found, you can use '-SkipExcludedFilesValidation' switch to skip this check, and the failed files are: $failedFilesList"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get Files List
|
$files = Get-ChildItem $WorkingDir -Recurse -Exclude $ExcludedFiles -File
|
||||||
[System.Collections.ArrayList]$files = Get-ChildItem $WorkingDir -Recurse -Exclude $ExcludedFiles -File -Force
|
|
||||||
$numOfFiles = $files.Count
|
|
||||||
|
|
||||||
# Only keep the 'FullName' Property for every entry in the list
|
|
||||||
for ($i = 0; $i -lt $numOfFiles; $i++) {
|
|
||||||
$file = $files[$i]
|
|
||||||
$files[$i] = $file.FullName
|
|
||||||
}
|
|
||||||
|
|
||||||
# If a file(s) are found in Exclude List,
|
|
||||||
# Remove the file from files list.
|
|
||||||
for ($j = 0; $j -lt $excludedFiles.Count; $j++) {
|
|
||||||
# Prepare some variables
|
|
||||||
$excluded = $excludedFiles[$j]
|
|
||||||
$pathToFind = ($excluded) -replace ('^\.\\', '')
|
|
||||||
$pathToFind = $WorkingDir + '\' + $pathToFind
|
|
||||||
$index = -1 # reset index on every iteration
|
|
||||||
|
|
||||||
# Handle paths with wildcards in a different implementation
|
|
||||||
$matches = ($pathToFind) -match '^.*?\*'
|
|
||||||
|
|
||||||
if ($matches) {
|
|
||||||
$filesToCheck = Get-ChildItem -Recurse -Path "$pathToFind" -File -Force
|
|
||||||
if ($filesToCheck) {
|
|
||||||
for ($k = 0; $k -lt $filesToCheck.Count; $k++) {
|
|
||||||
$fileToCheck = $filesToCheck[$k]
|
|
||||||
$index = $files.IndexOf("$fileToCheck")
|
|
||||||
if ($index -ge 0) { $files.RemoveAt($index) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$index = $files.IndexOf("$pathToFind")
|
|
||||||
if ($index -ge 0) { $files.RemoveAt($index) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make sure 'numOfFiles' is synced with the actual Number of Files found in '$files'
|
|
||||||
# This's done because previous may or may not edit the files list, so we should update it
|
|
||||||
$numOfFiles = $files.Count
|
$numOfFiles = $files.Count
|
||||||
|
|
||||||
if ($numOfFiles -eq 0) {
|
if ($numOfFiles -eq 0) {
|
||||||
@ -157,11 +99,26 @@ function Invoke-Preprocessing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for ($i = 0; $i -lt $numOfFiles; $i++) {
|
for ($i = 0; $i -lt $numOfFiles; $i++) {
|
||||||
$fullFileName = $files[$i]
|
$file = $files[$i]
|
||||||
|
|
||||||
|
# If the file is in Exclude List, don't proceed to check/modify said file.
|
||||||
|
$fileIsExcluded = $False
|
||||||
|
for ($j = 0; $j -lt $excludedFiles.Count; $j++) {
|
||||||
|
$excluded = $excludedFiles[$j]
|
||||||
|
$strToCompare = ($excluded) -replace ('^\.\\', '')
|
||||||
|
if ($file.FullName.Contains("$strToCompare")) {
|
||||||
|
$fileIsExcluded = $True
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($fileIsExcluded) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
# TODO:
|
# TODO:
|
||||||
# make more formatting rules, and document them in WinUtil Official Documentation
|
# make more formatting rules, and document them in WinUtil Official Documentation
|
||||||
(Get-Content "$fullFileName").TrimEnd() `
|
(Get-Content "$file").TrimEnd() `
|
||||||
-replace ('\t', ' ') `
|
-replace ('\t', ' ') `
|
||||||
-replace ('\)\s*\{', ') {') `
|
-replace ('\)\s*\{', ') {') `
|
||||||
-replace ('(?<keyword>if|for|foreach)\s*(?<condition>\([.*?]\))\s*\{', '${keyword} ${condition} {') `
|
-replace ('(?<keyword>if|for|foreach)\s*(?<condition>\([.*?]\))\s*\{', '${keyword} ${condition} {') `
|
||||||
@ -172,8 +129,8 @@ function Invoke-Preprocessing {
|
|||||||
-replace ('\}\s*Catch', '} catch') `
|
-replace ('\}\s*Catch', '} catch') `
|
||||||
-replace ('\}\s*Catch\s*(?<exceptions>(\[.*?\]\s*(\,)?\s*)+)\s*\{', '} catch ${exceptions} {') `
|
-replace ('\}\s*Catch\s*(?<exceptions>(\[.*?\]\s*(\,)?\s*)+)\s*\{', '} catch ${exceptions} {') `
|
||||||
-replace ('\}\s*Catch\s*(?<exceptions>\[.*?\])\s*\{', '} catch ${exceptions} {') `
|
-replace ('\}\s*Catch\s*(?<exceptions>\[.*?\])\s*\{', '} catch ${exceptions} {') `
|
||||||
-replace ('(?<parameter_type>\[[^$0-9]+\])\s*(?<str_after_type>\$.*?)', '${parameter_type}${str_after_type}') `
|
-replace ('(?<parameter_type>\[.*?\])\s*(?<str_after_type>\$.*?(,|\s*\)))', '${parameter_type}${str_after_type}') `
|
||||||
| Set-Content "$fullFileName"
|
| Set-Content "$file"
|
||||||
|
|
||||||
Write-Progress -Activity $ProgressActivity -Status "$ProgressStatusMessage - Finished $i out of $numOfFiles" -PercentComplete (($i/$numOfFiles)*100)
|
Write-Progress -Activity $ProgressActivity -Status "$ProgressStatusMessage - Finished $i out of $numOfFiles" -PercentComplete (($i/$numOfFiles)*100)
|
||||||
}
|
}
|
||||||
|
15
windev.ps1
15
windev.ps1
@ -34,20 +34,7 @@ function RedirectToLatestPreRelease {
|
|||||||
Write-Host "Using latest Full Release"
|
Write-Host "Using latest Full Release"
|
||||||
$url = "https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1"
|
$url = "https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1"
|
||||||
}
|
}
|
||||||
|
Invoke-RestMethod $url | Invoke-Expression
|
||||||
$script = Invoke-RestMethod $url
|
|
||||||
# Elevate Shell if necessary
|
|
||||||
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
|
||||||
Write-Output "Winutil needs to be run as Administrator. Attempting to relaunch."
|
|
||||||
|
|
||||||
$powershellcmd = if (Get-Command pwsh -ErrorAction SilentlyContinue) { "pwsh" } else { "powershell" }
|
|
||||||
$processCmd = if (Get-Command wt.exe -ErrorAction SilentlyContinue) { "wt.exe" } else { $powershellcmd }
|
|
||||||
|
|
||||||
Start-Process $processCmd -ArgumentList "$powershellcmd -ExecutionPolicy Bypass -NoProfile -Command $(Invoke-Expression $script)" -Verb RunAs
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
Invoke-Expression $script
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Call the redirect function
|
# Call the redirect function
|
||||||
|
@ -9,11 +9,7 @@
|
|||||||
WindowStartupLocation="CenterScreen"
|
WindowStartupLocation="CenterScreen"
|
||||||
UseLayoutRounding="True"
|
UseLayoutRounding="True"
|
||||||
WindowStyle="None"
|
WindowStyle="None"
|
||||||
Width="Auto"
|
Title="Chris Titus Tech's Windows Utility" Height="800" Width="1280">
|
||||||
Height="Auto"
|
|
||||||
MaxWidth="1280"
|
|
||||||
MaxHeight="800"
|
|
||||||
Title="Chris Titus Tech's Windows Utility">
|
|
||||||
<WindowChrome.WindowChrome>
|
<WindowChrome.WindowChrome>
|
||||||
<WindowChrome CaptionHeight="0" CornerRadius="10"/>
|
<WindowChrome CaptionHeight="0" CornerRadius="10"/>
|
||||||
</WindowChrome.WindowChrome>
|
</WindowChrome.WindowChrome>
|
||||||
@ -217,7 +213,7 @@
|
|||||||
<Setter TargetName="BackgroundBorder" Property="Background" Value="{ButtonBackgroundMouseoverColor}"/>
|
<Setter TargetName="BackgroundBorder" Property="Background" Value="{ButtonBackgroundMouseoverColor}"/>
|
||||||
<Setter Property="Effect">
|
<Setter Property="Effect">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<DropShadowEffect Opacity="1" ShadowDepth="5" Color="{ButtonBackgroundMouseoverColor}" Direction="-100" BlurRadius="15"/>
|
<DropShadowEffect Opacity="1" ShadowDepth="5" Color="Gold" Direction="-100" BlurRadius="45"/>
|
||||||
</Setter.Value>
|
</Setter.Value>
|
||||||
</Setter>
|
</Setter>
|
||||||
<Setter Property="Panel.ZIndex" Value="2000"/>
|
<Setter Property="Panel.ZIndex" Value="2000"/>
|
||||||
@ -228,7 +224,7 @@
|
|||||||
<Setter TargetName="BackgroundBorder" Property="Background" Value="{ButtonBackgroundSelectedColor}"/>
|
<Setter TargetName="BackgroundBorder" Property="Background" Value="{ButtonBackgroundSelectedColor}"/>
|
||||||
<Setter Property="Effect">
|
<Setter Property="Effect">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<DropShadowEffect Opacity="1" ShadowDepth="2" Color="{ButtonBackgroundMouseoverColor}" Direction="-111" BlurRadius="10"/>
|
<DropShadowEffect Opacity="1" ShadowDepth="2" Color="Gold" Direction="-111" BlurRadius="25"/>
|
||||||
</Setter.Value>
|
</Setter.Value>
|
||||||
</Setter>
|
</Setter>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
@ -288,12 +284,12 @@
|
|||||||
<Setter Property="Padding" Value="0"/>
|
<Setter Property="Padding" Value="0"/>
|
||||||
<Setter Property="BorderBrush" Value="Transparent"/>
|
<Setter Property="BorderBrush" Value="Transparent"/>
|
||||||
<Setter Property="BorderThickness" Value="0"/>
|
<Setter Property="BorderThickness" Value="0"/>
|
||||||
|
<Setter Property="Cursor" Value="Hand"/>
|
||||||
<Style.Triggers>
|
<Style.Triggers>
|
||||||
<Trigger Property="IsMouseOver" Value="True">
|
<Trigger Property="IsMouseOver" Value="True">
|
||||||
<Setter Property="Foreground" Value="Red"/>
|
<Setter Property="Foreground" Value="Red"/>
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
<Setter Property="BorderThickness" Value="10"/>
|
<Setter Property="BorderThickness" Value="10"/>
|
||||||
<Setter Property="Cursor" Value="Hand"/>
|
|
||||||
</Trigger>
|
</Trigger>
|
||||||
</Style.Triggers>
|
</Style.Triggers>
|
||||||
</Style>
|
</Style>
|
||||||
@ -309,17 +305,17 @@
|
|||||||
<Grid Background="{TemplateBinding Background}" Margin="{CheckBoxMargin}">
|
<Grid Background="{TemplateBinding Background}" Margin="{CheckBoxMargin}">
|
||||||
<BulletDecorator Background="Transparent">
|
<BulletDecorator Background="Transparent">
|
||||||
<BulletDecorator.Bullet>
|
<BulletDecorator.Bullet>
|
||||||
<Grid Width="{CheckBoxBulletDecoratorSize}" Height="{CheckBoxBulletDecoratorSize}">
|
<Grid Width="{CheckBoxBulletDecoratorFontSize}" Height="{CheckBoxBulletDecoratorFontSize}">
|
||||||
<Border x:Name="Border"
|
<Border x:Name="Border"
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
BorderBrush="{TemplateBinding BorderBrush}"
|
||||||
Background="{ButtonBackgroundColor}"
|
Background="{ButtonBackgroundColor}"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
Width="{Binding Path={CheckBoxBulletDecoratorSize}-2}"
|
Width="{Binding Path={CheckBoxBulletDecoratorFontSize}-2}"
|
||||||
Height="{Binding Path={CheckBoxBulletDecoratorSize}-2}"
|
Height="{Binding Path={CheckBoxBulletDecoratorFontSize}-2}"
|
||||||
Margin="2"
|
Margin="2"
|
||||||
SnapsToDevicePixels="True"/>
|
SnapsToDevicePixels="True"/>
|
||||||
<Path x:Name="CheckMark"
|
<Path x:Name="CheckMark"
|
||||||
Stroke="{ToggleButtonOnColor}"
|
Stroke="{TemplateBinding Foreground}"
|
||||||
StrokeThickness="2"
|
StrokeThickness="2"
|
||||||
Data="M 0 5 L 5 10 L 12 0"
|
Data="M 0 5 L 5 10 L 12 0"
|
||||||
Visibility="Collapsed"/>
|
Visibility="Collapsed"/>
|
||||||
@ -431,11 +427,7 @@
|
|||||||
Width="34" Height="17">
|
Width="34" Height="17">
|
||||||
<Ellipse x:Name="Ellipse" Fill="{MainForegroundColor}" Stretch="Uniform"
|
<Ellipse x:Name="Ellipse" Fill="{MainForegroundColor}" Stretch="Uniform"
|
||||||
Margin="2,2,2,1"
|
Margin="2,2,2,1"
|
||||||
HorizontalAlignment="Left" Width="10.8"
|
HorizontalAlignment="Left" Width="12">
|
||||||
RenderTransformOrigin="0.5, 0.5">
|
|
||||||
<Ellipse.RenderTransform>
|
|
||||||
<ScaleTransform ScaleX="1" ScaleY="1" />
|
|
||||||
</Ellipse.RenderTransform>
|
|
||||||
</Ellipse>
|
</Ellipse>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
@ -446,35 +438,12 @@
|
|||||||
<Setter TargetName="Border" Property="Background" Value="{LinkHoverForegroundColor}"/>
|
<Setter TargetName="Border" Property="Background" Value="{LinkHoverForegroundColor}"/>
|
||||||
<Setter Property="Cursor" Value="Hand" />
|
<Setter Property="Cursor" Value="Hand" />
|
||||||
<Setter Property="Panel.ZIndex" Value="1000"/>
|
<Setter Property="Panel.ZIndex" Value="1000"/>
|
||||||
<Trigger.EnterActions>
|
|
||||||
<BeginStoryboard>
|
|
||||||
<Storyboard>
|
|
||||||
<DoubleAnimation Storyboard.TargetName="Ellipse"
|
|
||||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"
|
|
||||||
To="1.1" Duration="0:0:0.1" />
|
|
||||||
<DoubleAnimation Storyboard.TargetName="Ellipse"
|
|
||||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"
|
|
||||||
To="1.1" Duration="0:0:0.1" />
|
|
||||||
</Storyboard>
|
|
||||||
</BeginStoryboard>
|
|
||||||
</Trigger.EnterActions>
|
|
||||||
<Trigger.ExitActions>
|
|
||||||
<BeginStoryboard>
|
|
||||||
<Storyboard>
|
|
||||||
<DoubleAnimation Storyboard.TargetName="Ellipse"
|
|
||||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"
|
|
||||||
To="1.0" Duration="0:0:0.1" />
|
|
||||||
<DoubleAnimation Storyboard.TargetName="Ellipse"
|
|
||||||
Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"
|
|
||||||
To="1.0" Duration="0:0:0.1" />
|
|
||||||
</Storyboard>
|
|
||||||
</BeginStoryboard>
|
|
||||||
</Trigger.ExitActions>
|
|
||||||
</Trigger>
|
</Trigger>
|
||||||
<Trigger Property="ToggleButton.IsChecked" Value="False">
|
<Trigger Property="ToggleButton.IsChecked" Value="False">
|
||||||
<Setter TargetName="Border" Property="Background" Value="{MainBackgroundColor}" />
|
<Setter TargetName="Border" Property="Background" Value="{MainBackgroundColor}" />
|
||||||
<Setter TargetName="Border" Property="BorderBrush" Value="#707070" />
|
<Setter TargetName="Border" Property="BorderBrush" Value="{MainForegroundColor}" />
|
||||||
<Setter TargetName="Ellipse" Property="Fill" Value="#707070" />
|
<Setter TargetName="Ellipse" Property="Fill" Value="{MainForegroundColor}" />
|
||||||
|
|
||||||
</Trigger>
|
</Trigger>
|
||||||
|
|
||||||
<Trigger Property="ToggleButton.IsChecked" Value="True">
|
<Trigger Property="ToggleButton.IsChecked" Value="True">
|
||||||
@ -533,7 +502,7 @@
|
|||||||
</Style.Triggers>
|
</Style.Triggers>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="BorderStyle" TargetType="Border">
|
<Style TargetType="Border">
|
||||||
<Setter Property="Background" Value="{MainBackgroundColor}"/>
|
<Setter Property="Background" Value="{MainBackgroundColor}"/>
|
||||||
<Setter Property="BorderBrush" Value="{BorderColor}"/>
|
<Setter Property="BorderBrush" Value="{BorderColor}"/>
|
||||||
<Setter Property="BorderThickness" Value="1"/>
|
<Setter Property="BorderThickness" Value="1"/>
|
||||||
@ -649,8 +618,8 @@
|
|||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<DockPanel HorizontalAlignment="Stretch" Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="0" Width="Auto">
|
<DockPanel HorizontalAlignment="Stretch" Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="0" Width="Auto">
|
||||||
<StackPanel Name="NavLogoPanel" Orientation="Horizontal" HorizontalAlignment="Left" Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Margin="10,0,20,0">
|
<Image Height="{WinUtilIconSize}" Width="{WinUtilIconSize}" Name="WPFIcon"
|
||||||
</StackPanel>
|
SnapsToDevicePixels="True" Source="https://christitus.com/images/logo-full.png" Margin="10"/>
|
||||||
<ToggleButton HorizontalAlignment="Left" Height="{TabButtonHeight}" Width="{TabButtonWidth}"
|
<ToggleButton HorizontalAlignment="Left" Height="{TabButtonHeight}" Width="{TabButtonWidth}"
|
||||||
Background="{ButtonInstallBackgroundColor}" Foreground="white" FontWeight="Bold" Name="WPFTab1BT">
|
Background="{ButtonInstallBackgroundColor}" Foreground="white" FontWeight="Bold" Name="WPFTab1BT">
|
||||||
<ToggleButton.Content>
|
<ToggleButton.Content>
|
||||||
@ -693,10 +662,10 @@
|
|||||||
</ToggleButton>
|
</ToggleButton>
|
||||||
<Grid Background="{MainBackgroundColor}" ShowGridLines="False" Width="Auto" Height="Auto" HorizontalAlignment="Stretch">
|
<Grid Background="{MainBackgroundColor}" ShowGridLines="False" Width="Auto" Height="Auto" HorizontalAlignment="Stretch">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*"/> <!-- Main content area -->
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="Auto"/> <!-- Space for options button -->
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="Auto"/> <!-- Space for close button -->
|
<ColumnDefinition Width="50px"/>
|
||||||
<ColumnDefinition Width="Auto"/>
|
<ColumnDefinition Width="50px"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -708,26 +677,25 @@
|
|||||||
Consider using a Math Solver, will help in making
|
Consider using a Math Solver, will help in making
|
||||||
development of these things much easier
|
development of these things much easier
|
||||||
-->
|
-->
|
||||||
|
<!-- Changed the font size from {SearchBarTextBoxFontSize} to 12. This now display the text box correctly in the text box.-->
|
||||||
<TextBox
|
<TextBox
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Width="{SearchBarWidth}"
|
Width="{SearchBarWidth}"
|
||||||
Height="{SearchBarHeight}"
|
Height="{SearchBarHeight}"
|
||||||
FontSize="{SearchBarTextBoxFontSize}"
|
FontSize="12"
|
||||||
VerticalAlignment="Center" HorizontalAlignment="Left"
|
VerticalAlignment="Center" HorizontalAlignment="Left"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
Name="SearchBar"
|
Name="SearchBar"
|
||||||
Foreground="{MainForegroundColor}" Background="{MainBackgroundColor}"
|
Foreground="{MainForegroundColor}" Background="{MainBackgroundColor}"
|
||||||
Padding="3,3,30,0"
|
|
||||||
Margin="5,0,0,0"
|
|
||||||
ToolTip="Press Ctrl-F and type app name to filter application list below. Press Esc to reset the filter">
|
ToolTip="Press Ctrl-F and type app name to filter application list below. Press Esc to reset the filter">
|
||||||
</TextBox>
|
</TextBox>
|
||||||
|
<!--Changed the margin from 16 to 180, which now places the magnifying glass icon on the right side of the text box. Now able to see what is been searched for.-->
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center" HorizontalAlignment="Left"
|
VerticalAlignment="Center" HorizontalAlignment="Left"
|
||||||
FontFamily="Segoe MDL2 Assets"
|
FontFamily="Segoe MDL2 Assets"
|
||||||
FontSize="{IconFontSize}"
|
FontSize="{IconFontSize}"
|
||||||
Margin="180,0,0,0">
|
Margin="180,0,0,0"></TextBlock>
|
||||||
</TextBlock>
|
|
||||||
<!--
|
<!--
|
||||||
TODO:
|
TODO:
|
||||||
Make this ClearButton Positioning react to
|
Make this ClearButton Positioning react to
|
||||||
@ -735,12 +703,12 @@
|
|||||||
Consider using a Math Solver, will help in making
|
Consider using a Math Solver, will help in making
|
||||||
development of these things much easier
|
development of these things much easier
|
||||||
-->
|
-->
|
||||||
|
<!-- changed the {SearchBarClearButtonMargin} value from 193 to 205, which now places the clear button on the outside of the text box. -->
|
||||||
<Button Grid.Column="0"
|
<Button Grid.Column="0"
|
||||||
VerticalAlignment="Center" HorizontalAlignment="Left"
|
VerticalAlignment="Center" HorizontalAlignment="Left"
|
||||||
Name="SearchBarClearButton"
|
Name="SearchBarClearButton"
|
||||||
Style="{StaticResource SearchBarClearButtonStyle}"
|
Style="{StaticResource SearchBarClearButtonStyle}"
|
||||||
Margin="210,0,0,0" Visibility="Collapsed">
|
Margin="205,0,0,0" Visibility="Collapsed"/>
|
||||||
</Button>
|
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@ -779,7 +747,7 @@
|
|||||||
FontSize="{SettingsIconFontSize}"
|
FontSize="{SettingsIconFontSize}"
|
||||||
Width="{IconButtonSize}" Height="{IconButtonSize}"
|
Width="{IconButtonSize}" Height="{IconButtonSize}"
|
||||||
HorizontalAlignment="Right" VerticalAlignment="Top"
|
HorizontalAlignment="Right" VerticalAlignment="Top"
|
||||||
Margin="5,5,5,0"
|
Margin="0,5,5,0"
|
||||||
FontFamily="Segoe MDL2 Assets"
|
FontFamily="Segoe MDL2 Assets"
|
||||||
Content=""/>
|
Content=""/>
|
||||||
<Popup Grid.Column="2" Name="SettingsPopup"
|
<Popup Grid.Column="2" Name="SettingsPopup"
|
||||||
@ -788,16 +756,8 @@
|
|||||||
HorizontalAlignment="Right" VerticalAlignment="Top">
|
HorizontalAlignment="Right" VerticalAlignment="Top">
|
||||||
<Border Background="{MainBackgroundColor}" BorderBrush="{MainForegroundColor}" BorderThickness="1" CornerRadius="0" Margin="0">
|
<Border Background="{MainBackgroundColor}" BorderBrush="{MainForegroundColor}" BorderThickness="1" CornerRadius="0" Margin="0">
|
||||||
<StackPanel Background="{MainBackgroundColor}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
<StackPanel Background="{MainBackgroundColor}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
<MenuItem FontSize="{ButtonFontSize}" Header="Import" Name="ImportMenuItem" Foreground="{MainForegroundColor}">
|
<MenuItem FontSize="{ButtonFontSize}" Header="Import" Name="ImportMenuItem" Foreground="{MainForegroundColor}"/>
|
||||||
<MenuItem.ToolTip>
|
<MenuItem FontSize="{ButtonFontSize}" Header="Export" Name="ExportMenuItem" Foreground="{MainForegroundColor}"/>
|
||||||
<ToolTip Content="Import Configuration from exported file."/>
|
|
||||||
</MenuItem.ToolTip>
|
|
||||||
</MenuItem>
|
|
||||||
<MenuItem FontSize="{ButtonFontSize}" Header="Export" Name="ExportMenuItem" Foreground="{MainForegroundColor}">
|
|
||||||
<MenuItem.ToolTip>
|
|
||||||
<ToolTip Content="Export Selected Elements and copy execution command to clipboard."/>
|
|
||||||
</MenuItem.ToolTip>
|
|
||||||
</MenuItem>
|
|
||||||
<Separator/>
|
<Separator/>
|
||||||
<MenuItem FontSize="{ButtonFontSize}" Header="About" Name="AboutMenuItem" Foreground="{MainForegroundColor}"/>
|
<MenuItem FontSize="{ButtonFontSize}" Header="About" Name="AboutMenuItem" Foreground="{MainForegroundColor}"/>
|
||||||
<MenuItem FontSize="{ButtonFontSize}" Header="Sponsors" Name="SponsorMenuItem" Foreground="{MainForegroundColor}"/>
|
<MenuItem FontSize="{ButtonFontSize}" Header="Sponsors" Name="SponsorMenuItem" Foreground="{MainForegroundColor}"/>
|
||||||
@ -814,7 +774,7 @@
|
|||||||
HorizontalAlignment="Right" VerticalAlignment="Top"
|
HorizontalAlignment="Right" VerticalAlignment="Top"
|
||||||
Margin="0,5,5,0"
|
Margin="0,5,5,0"
|
||||||
FontFamily="Arial"
|
FontFamily="Arial"
|
||||||
Foreground="{MainForegroundColor}" FontSize="{CloseIconFontSize}" Name="WPFCloseButton" />
|
Foreground="{MainForegroundColor}" FontSize="{IconFontSize}" Name="WPFCloseButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
@ -827,103 +787,84 @@
|
|||||||
<RowDefinition Height="45px"/>
|
<RowDefinition Height="45px"/>
|
||||||
<RowDefinition Height="0.95*"/>
|
<RowDefinition Height="0.95*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3" Margin="{TabContentMargin}">
|
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3" Margin="5">
|
||||||
<Button Name="WPFInstall" Content=" Install/Upgrade Selected" Margin="2" />
|
<Button Name="WPFinstall" Content=" Install/Upgrade Selected" Margin="2" />
|
||||||
<Button Name="WPFInstallUpgrade" Content=" Upgrade All" Margin="2"/>
|
<Button Name="WPFInstallUpgrade" Content=" Upgrade All" Margin="2"/>
|
||||||
<Button Name="WPFUninstall" Content=" Uninstall Selected" Margin="2"/>
|
<Button Name="WPFuninstall" Content=" Uninstall Selected" Margin="2"/>
|
||||||
<Button Name="WPFGetInstalled" Content=" Get Installed" Margin="2"/>
|
<Button Name="WPFGetInstalled" Content=" Get Installed" Margin="2"/>
|
||||||
<Button Name="WPFClearInstallSelection" Content=" Clear Selection" Margin="2"/>
|
<Button Name="WPFclearWinget" Content=" Clear Selection" Margin="2"/>
|
||||||
<CheckBox Name="WPFpreferChocolatey" VerticalAlignment="Center" VerticalContentAlignment="Center">
|
|
||||||
<TextBlock Text="Prefer Chocolatey" ToolTip="Prefers Chocolatey as Download Engine instead of Winget" VerticalAlignment="Center" />
|
|
||||||
</CheckBox>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<ScrollViewer x:Name="scrollViewer" Grid.Row="1" Grid.Column="0" Margin="{TabContentMargin}" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
|
<ScrollViewer x:Name="scrollViewer" Grid.Row="1" Grid.Column="0" Padding="-1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
|
||||||
BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
<Grid Name="appspanel" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
|
{{InstallPanel_applications}}
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
<Rectangle Grid.Row="1" Grid.Column="0" Width="22" Height="22" Fill="{MainBackgroundColor}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Style="{StaticResource ScrollVisibilityRectangle}"/>
|
<Rectangle Grid.Row="1" Grid.Column="0" Width="18" Height="18" Fill="{MainBackgroundColor}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Style="{StaticResource ScrollVisibilityRectangle}"/>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem Header="Tweaks" Visibility="Collapsed" Name="WPFTab2">
|
<TabItem Header="Tweaks" Visibility="Collapsed" Name="WPFTab2">
|
||||||
<Grid>
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
<!-- Main content area with a ScrollViewer -->
|
<Grid Background="Transparent">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="45px"/>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height=".70*"/>
|
||||||
|
<RowDefinition Height=".10*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
{{InstallPanel_tweaks}}
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="0" Margin="{TabContentMargin}">
|
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="5">
|
||||||
<Grid Background="Transparent">
|
<Label Content="Recommended Selections:" FontSize="{FontSize}" VerticalAlignment="Center" Margin="2"/>
|
||||||
<Grid.RowDefinitions>
|
<Button Name="WPFstandard" Content=" Standard " Margin="2"/>
|
||||||
<RowDefinition Height="45px"/>
|
<Button Name="WPFminimal" Content=" Minimal " Margin="2"/>
|
||||||
<RowDefinition Height="*"/>
|
<Button Name="WPFclear" Content=" Clear " Margin="2"/>
|
||||||
<RowDefinition Height="Auto"/>
|
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="2"/>
|
||||||
</Grid.RowDefinitions>
|
</StackPanel>
|
||||||
|
<Border Grid.ColumnSpan="2" Grid.Row="2" Grid.Column="0">
|
||||||
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="5">
|
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left">
|
||||||
<Label Content="Recommended Selections:" FontSize="{FontSize}" VerticalAlignment="Center" Margin="2"/>
|
<TextBlock Padding="10">
|
||||||
<Button Name="WPFstandard" Content=" Standard " Margin="2"/>
|
Note: Hover over items to get a better description. Please be careful as many of these tweaks will heavily modify your system.
|
||||||
<Button Name="WPFminimal" Content=" Minimal " Margin="2"/>
|
<LineBreak/>Recommended selections are for normal users and if you are unsure do NOT check anything else!
|
||||||
<Button Name="WPFClearTweaksSelection" Content=" Clear " Margin="2"/>
|
</TextBlock>
|
||||||
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="2"/>
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<Grid Name="tweakspanel" Grid.Row="1">
|
|
||||||
<!-- Your tweakspanel content goes here -->
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<Border Grid.ColumnSpan="2" Grid.Row="2" Grid.Column="0" Style="{StaticResource BorderStyle}">
|
|
||||||
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left">
|
|
||||||
<TextBlock Padding="10">
|
|
||||||
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>
|
|
||||||
<Border Grid.Row="1" Background="{MainBackgroundColor}" BorderBrush="{BorderColor}" BorderThickness="1" CornerRadius="5" HorizontalAlignment="Stretch" Padding="10">
|
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0">
|
|
||||||
<Button Name="WPFTweaksbutton" Content="Run Tweaks" Margin="5"/>
|
|
||||||
<Button Name="WPFUndoall" Content="Undo Selected Tweaks" Margin="5"/>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
|
||||||
|
</Grid>
|
||||||
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem Header="Config" Visibility="Collapsed" Name="WPFTab3">
|
<TabItem Header="Config" Visibility="Collapsed" Name="WPFTab3">
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="{TabContentMargin}">
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
<Grid Name="featurespanel" Grid.Row="1" Background="Transparent">
|
<Grid Background="Transparent">
|
||||||
|
{{InstallPanel_features}}
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem Header="Updates" Visibility="Collapsed" Name="WPFTab4">
|
<TabItem Header="Updates" Visibility="Collapsed" Name="WPFTab4">
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="{TabContentMargin}">
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
<Grid Background="Transparent">
|
<Grid Background="Transparent">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Border Grid.Row="0" Grid.Column="0" Style="{StaticResource BorderStyle}">
|
<Border Grid.Row="0" Grid.Column="0">
|
||||||
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
|
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
|
||||||
<Button Name="WPFUpdatesdefault" FontSize="{ConfigTabButtonFontSize}" Height="Auto" Width="Auto" Content="Default (Out of Box) Settings" Margin="20,4,20,10" Padding="10"/>
|
<Button Name="WPFUpdatesdefault" FontSize="{ConfigTabButtonFontSize}" Height="Auto" Width="Auto" Content="Default (Out of Box) Settings" Margin="20,4,20,10" Padding="10"/>
|
||||||
<TextBlock Foreground="{ComboBoxForegroundColor}" Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This is the default settings that come with Windows. <LineBreak/><LineBreak/> No modifications are made and will remove any custom windows update settings.<LineBreak/><LineBreak/>Note: If you still encounter update errors, reset all updates in the config tab. That will restore ALL Microsoft Update Services from their servers and reinstall them to default settings.</TextBlock>
|
<TextBlock Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This is the default settings that come with Windows. <LineBreak/><LineBreak/> No modifications are made and will remove any custom windows update settings.<LineBreak/><LineBreak/>Note: If you still encounter update errors, reset all updates in the config tab. That will restore ALL Microsoft Update Services from their servers and reinstall them to default settings.</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<Border Grid.Row="0" Grid.Column="1" Style="{StaticResource BorderStyle}">
|
<Border Grid.Row="0" Grid.Column="1">
|
||||||
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
|
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
|
||||||
<Button Name="WPFUpdatessecurity" FontSize="{ConfigTabButtonFontSize}" Height="Auto" Width="Auto" Content="Security (Recommended) Settings" Margin="20,4,20,10" Padding="10"/>
|
<Button Name="WPFUpdatessecurity" FontSize="{ConfigTabButtonFontSize}" Height="Auto" Width="Auto" Content="Security (Recommended) Settings" Margin="20,4,20,10" Padding="10"/>
|
||||||
<TextBlock Foreground="{ComboBoxForegroundColor}" Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This is my recommended setting I use on all computers.<LineBreak/><LineBreak/> It will delay feature updates by 2 years and will install security updates 4 days after release.<LineBreak/><LineBreak/>Feature Updates: Adds features and often bugs to systems when they are released. You want to delay these as long as possible.<LineBreak/><LineBreak/>Security Updates: Typically these are pressing security flaws that need to be patched quickly. You only want to delay these a couple of days just to see if they are safe and don't break other systems. You don't want to go without these for ANY extended periods of time.</TextBlock>
|
<TextBlock Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This is my recommended setting I use on all computers.<LineBreak/><LineBreak/> It will delay feature updates by 2 years and will install security updates 4 days after release.<LineBreak/><LineBreak/>Feature Updates: Adds features and often bugs to systems when they are released. You want to delay these as long as possible.<LineBreak/><LineBreak/>Security Updates: Typically these are pressing security flaws that need to be patched quickly. You only want to delay these a couple of days just to see if they are safe and don't break other systems. You don't want to go without these for ANY extended periods of time.</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<Border Grid.Row="0" Grid.Column="2" Style="{StaticResource BorderStyle}">
|
<Border Grid.Row="0" Grid.Column="2">
|
||||||
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
|
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True">
|
||||||
<Button Name="WPFUpdatesdisable" FontSize="{ConfigTabButtonFontSize}" Height="Auto" Width="Auto" Content="Disable ALL Updates (NOT RECOMMENDED!)" Margin="20,4,20,10" Padding="10,10,10,10"/>
|
<Button Name="WPFUpdatesdisable" FontSize="{ConfigTabButtonFontSize}" Height="Auto" Width="Auto" Content="Disable ALL Updates (NOT RECOMMENDED!)" Margin="20,4,20,10" Padding="10,10,10,10"/>
|
||||||
<TextBlock Foreground="{ComboBoxForegroundColor}" Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This completely disables ALL Windows Updates and is NOT RECOMMENDED.<LineBreak/><LineBreak/> However, it can be suitable if you use your system for a select purpose and do not actively browse the internet. <LineBreak/><LineBreak/>Note: Your system will be easier to hack and infect without security updates.</TextBlock>
|
<TextBlock Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This completely disables ALL Windows Updates and is NOT RECOMMENDED.<LineBreak/><LineBreak/> However, it can be suitable if you use your system for a select purpose and do not actively browse the internet. <LineBreak/><LineBreak/>Note: Your system will be easier to hack and infect without security updates.</TextBlock>
|
||||||
<TextBlock Text=" " Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300"/>
|
<TextBlock Text=" " Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
@ -931,7 +872,7 @@
|
|||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem Header="MicroWin" Visibility="Collapsed" Name="WPFTab5">
|
<TabItem Header="MicroWin" Visibility="Collapsed" Name="WPFTab5">
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="{TabContentMargin}">
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
<Grid Width="Auto" Height="Auto">
|
<Grid Width="Auto" Height="Auto">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
@ -941,17 +882,16 @@
|
|||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Border Grid.Row="0" Grid.Column="0"
|
<Border Grid.Row="0" Grid.Column="0"
|
||||||
Style="{StaticResource BorderStyle}"
|
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
HorizontalAlignment="Stretch">
|
HorizontalAlignment="Stretch">
|
||||||
<StackPanel Name="MicrowinMain" Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Column="0" Grid.Row="0">
|
<StackPanel Name="MicrowinMain" Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Column="0" Grid.Row="0">
|
||||||
<StackPanel Background="Transparent" SnapsToDevicePixels="True" Margin="1">
|
<StackPanel Background="Transparent" SnapsToDevicePixels="True" Margin="1">
|
||||||
<CheckBox x:Name="WPFMicrowinDownloadFromGitHub" Content="Download oscdimg.exe from CTT Github repo" IsChecked="False" Margin="{MicrowinCheckBoxMargin}" />
|
<CheckBox x:Name="WPFMicrowinDownloadFromGitHub" Content="Download oscdimg.exe from CTT Github repo" IsChecked="False" Margin="-10,1,1,1" />
|
||||||
<TextBlock Margin="5" Padding="1" TextWrapping="Wrap" Foreground="{ComboBoxForegroundColor}">
|
<TextBlock Margin="5" Padding="1" TextWrapping="Wrap" Foreground="{ComboBoxForegroundColor}">
|
||||||
Choose a Windows ISO file that you've downloaded <LineBreak/>
|
Choose a Windows ISO file that you've downloaded <LineBreak/>
|
||||||
Check the status in the console
|
Check the status in the console
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
<CheckBox x:Name="WPFMicrowinISOScratchDir" Content="Use ISO directory for ScratchDir " IsChecked="False" Margin="{MicrowinCheckBoxMargin}"
|
<CheckBox x:Name="WPFMicrowinISOScratchDir" Content="Use ISO directory for ScratchDir " IsChecked="False" Margin="-10,1,1,1"
|
||||||
ToolTip="Use ISO directory for ScratchDir " />
|
ToolTip="Use ISO directory for ScratchDir " />
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@ -998,7 +938,7 @@
|
|||||||
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap">Choose Windows SKU</TextBlock>
|
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap">Choose Windows SKU</TextBlock>
|
||||||
<ComboBox x:Name = "MicrowinWindowsFlavors" Margin="1" />
|
<ComboBox x:Name = "MicrowinWindowsFlavors" Margin="1" />
|
||||||
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
||||||
<CheckBox Name="MicrowinInjectDrivers" Content="Inject drivers (I KNOW WHAT I'M DOING)" Margin="{MicrowinCheckBoxMargin}" IsChecked="False" ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"/>
|
<CheckBox Name="MicrowinInjectDrivers" Content="Inject drivers (I KNOW WHAT I'M DOING)" Margin="-10,5,0,0" IsChecked="False" ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"/>
|
||||||
<TextBox Name="MicrowinDriverLocation" Background="Transparent" BorderThickness="1" BorderBrush="{MainForegroundColor}"
|
<TextBox Name="MicrowinDriverLocation" Background="Transparent" BorderThickness="1" BorderBrush="{MainForegroundColor}"
|
||||||
Margin="6"
|
Margin="6"
|
||||||
Text=""
|
Text=""
|
||||||
@ -1007,9 +947,9 @@
|
|||||||
Foreground="{LabelboxForegroundColor}"
|
Foreground="{LabelboxForegroundColor}"
|
||||||
ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"
|
ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"
|
||||||
/>
|
/>
|
||||||
<CheckBox Name="MicrowinImportDrivers" Content="Import drivers from current system" Margin="{MicrowinCheckBoxMargin}" IsChecked="False" ToolTip="Export all third-party drivers from your system and inject them to the MicroWin image"/>
|
<CheckBox Name="MicrowinImportDrivers" Content="Import drivers from current system" Margin="-10,5,0,0" IsChecked="False" ToolTip="Export all third-party drivers from your system and inject them to the MicroWin image"/>
|
||||||
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
||||||
<CheckBox Name="WPFMicrowinCopyToUsb" Content="Copy to Ventoy" Margin="{MicrowinCheckBoxMargin}" IsChecked="False" ToolTip="Copy to USB disk with a label Ventoy"/>
|
<CheckBox Name="WPFMicrowinCopyToUsb" Content="Copy to Ventoy" Margin="-10,5,0,0" IsChecked="False" ToolTip="Copy to USB disk with a label Ventoy"/>
|
||||||
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
||||||
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap"><Bold>Custom user settings (leave empty for default user)</Bold></TextBlock>
|
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap"><Bold>Custom user settings (leave empty for default user)</Bold></TextBlock>
|
||||||
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap">User name (20 characters max.):</TextBlock>
|
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap">User name (20 characters max.):</TextBlock>
|
||||||
@ -1039,7 +979,6 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
<Border
|
<Border
|
||||||
Style="{StaticResource BorderStyle}"
|
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
Grid.Row="0" Grid.Column="1">
|
Grid.Row="0" Grid.Column="1">
|
||||||
|
Reference in New Issue
Block a user