mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2024-11-24 03:45:30 +00:00
Comment Spacing, Indentation, and Capitalization (#1084)
* Comment Spacing, Indentation, and Capitalization * Comment Grammar and Spacing Makes grammar in comments better and more consistent Adds space before comment and centers word in `Write-Host` commands * More Grammar and Formatting * Add some comments * Populate PlaceHolder comments in functions Files I found that has issues: Get-WinUtilRegistry.ps1 Install-WinUtilWinget.ps1 Invoke-WinUtilDarkMode.ps1 Remove-WinUtilAPPX.ps1 Test-WinUtilPackageManager.ps1 Update-WinUtilProgramWinget.ps1 Invoke-WPFUpdatessecurity.ps1 * Tweak a few more comments * Tweak another write-host statement * Undo Catch statement adjustment It's outside of the scope of this pull request
This commit is contained in:
parent
932ec6a0a0
commit
acc2b5b243
@ -7,7 +7,7 @@ function Get-WinUtilRegistry {
|
||||
.EXAMPLE
|
||||
Get-WinUtilRegistry -Name "PublishUserActivities" -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Type "DWord" -Value "0"
|
||||
|
||||
#>
|
||||
#>
|
||||
param (
|
||||
$Name,
|
||||
$Path,
|
||||
@ -15,7 +15,7 @@ function Get-WinUtilRegistry {
|
||||
$Value
|
||||
)
|
||||
|
||||
Try{
|
||||
Try{
|
||||
$syscheckvalue = Get-ItemPropertyValue -Path $Path -Value $Value # Return Value
|
||||
|
||||
}
|
||||
|
@ -1,32 +1,32 @@
|
||||
function Get-WinUtilVariables {
|
||||
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Gets every form object of the provided type
|
||||
|
||||
.OUTPUTS
|
||||
List containing every object that matches the provided type
|
||||
|
||||
#>
|
||||
param (
|
||||
[Parameter()]
|
||||
[string[]]$Type
|
||||
[ValidateSet("CheckBox", "Button")]
|
||||
[string]$Type
|
||||
)
|
||||
|
||||
$keys = $sync.keys | Where-Object { $_ -like "WPF*" }
|
||||
$keys = $sync.keys | Where-Object {$psitem -like "WPF*"}
|
||||
|
||||
if ($Type) {
|
||||
if($type){
|
||||
$output = $keys | ForEach-Object {
|
||||
Try {
|
||||
$objType = $sync["$psitem"].GetType().Name
|
||||
if ($Type -contains $objType) {
|
||||
Try{
|
||||
if ($sync["$psitem"].GetType() -like "*$type*"){
|
||||
Write-Output $psitem
|
||||
}
|
||||
}
|
||||
Catch {
|
||||
<#I am here so errors don't get outputted for a couple variables that don't have the .GetType() attribute#>
|
||||
}
|
||||
Catch{<#I am here so errors don't get outputted for a couple variables that don't have the .GetType() attribute#>}
|
||||
}
|
||||
return $output
|
||||
return $output
|
||||
}
|
||||
return $keys
|
||||
}
|
||||
|
@ -7,23 +7,24 @@ function Install-WinUtilChoco {
|
||||
|
||||
#>
|
||||
|
||||
try {
|
||||
try{
|
||||
Write-Host "Checking if Chocolatey is Installed..."
|
||||
|
||||
if((Test-WinUtilPackageManager -choco)){
|
||||
Write-Host "Chocolatey Already Installed"
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Seems Chocolatey is not installed, installing now"
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) -ErrorAction Stop
|
||||
powershell choco feature enable -n allowGlobalConfirmation
|
||||
|
||||
|
||||
Write-Host "Seems Chocolatey is not installed, installing now?"
|
||||
# Let user decide if they want to install Chocolatey
|
||||
$confirmation = Read-Host "Are you Sure You Want To Proceed:(y/n)"
|
||||
if ($confirmation -eq 'y') {
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) -ErrorAction Stop
|
||||
powershell choco feature enable -n allowGlobalConfirmation
|
||||
}
|
||||
}
|
||||
Catch {
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Chocolatey failed to install ---"
|
||||
Write-Host "==========================================="
|
||||
Catch{
|
||||
throw [ChocoFailedInstall]::new('Failed to install')
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
function Get-LatestHash {
|
||||
$shaUrl = ((Invoke-WebRequest $apiLatestUrl -UseBasicParsing | ConvertFrom-Json).assets | Where-Object { $_.name -match '^Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt$' }).browser_download_url
|
||||
|
||||
|
||||
$shaFile = Join-Path -Path $tempFolder -ChildPath 'Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt'
|
||||
$WebClient.DownloadFile($shaUrl, $shaFile)
|
||||
|
||||
|
||||
Get-Content $shaFile
|
||||
}
|
||||
|
||||
@ -14,8 +14,6 @@ function Install-WinUtilWinget {
|
||||
.SYNOPSIS
|
||||
Installs Winget if it is not already installed
|
||||
|
||||
.DESCRIPTION
|
||||
This function will download the latest version of winget and install it. If winget is already installed, it will do nothing.
|
||||
#>
|
||||
Try{
|
||||
Write-Host "Checking if Winget is Installed..."
|
||||
@ -40,8 +38,8 @@ function Install-WinUtilWinget {
|
||||
}
|
||||
|
||||
Write-Host "Running Alternative Installer and Direct Installing"
|
||||
Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "choco install winget"
|
||||
|
||||
Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "irm https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/winget.ps1 | iex"
|
||||
|
||||
Write-Host "Winget Installed"
|
||||
}
|
||||
Catch{
|
||||
|
40
functions/private/Set-WinUtilRestorePoint.ps1
Normal file
40
functions/private/Set-WinUtilRestorePoint.ps1
Normal file
@ -0,0 +1,40 @@
|
||||
function Set-WinUtilRestorePoint {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Creates a Restore Point
|
||||
|
||||
#>
|
||||
|
||||
# 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
|
||||
try {
|
||||
# Try getting restore points to check if System Restore is enabled
|
||||
Enable-ComputerRestore -Drive "$env:SystemDrive"
|
||||
} catch {
|
||||
Write-Host "An error occurred while enabling System Restore: $_"
|
||||
}
|
||||
|
||||
# Check if the SystemRestorePointCreationFrequency value exists
|
||||
$exists = Get-ItemProperty -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -name "SystemRestorePointCreationFrequency" -ErrorAction SilentlyContinue
|
||||
if($null -eq $exists){
|
||||
write-host 'Changing system to allow multiple restore points per day'
|
||||
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "SystemRestorePointCreationFrequency" -Value "0" -Type DWord -Force -ErrorAction Stop | Out-Null
|
||||
}
|
||||
|
||||
# Get all the restore points for the current day
|
||||
$existingRestorePoints = Get-ComputerRestorePoint | Where-Object { $_.CreationTime.Date -eq (Get-Date).Date }
|
||||
|
||||
# Check if there is already a restore point created today
|
||||
if ($existingRestorePoints.Count -eq 0) {
|
||||
$description = "System Restore Point created by WinUtil"
|
||||
|
||||
Checkpoint-Computer -Description $description -RestorePointType "MODIFY_SETTINGS"
|
||||
Write-Host -ForegroundColor Green "System Restore Point Created Successfully"
|
||||
}
|
||||
}
|
@ -9,8 +9,8 @@ function Invoke-WPFButton {
|
||||
The name of the button that was clicked
|
||||
|
||||
#>
|
||||
|
||||
Param ([string]$Button)
|
||||
|
||||
Param ([string]$Button)
|
||||
|
||||
# Use this to get the name of the button
|
||||
#[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info")
|
||||
@ -24,11 +24,16 @@ function Invoke-WPFButton {
|
||||
"WPFdesktop" {Invoke-WPFPresets "Desktop"}
|
||||
"WPFlaptop" {Invoke-WPFPresets "laptop"}
|
||||
"WPFminimal" {Invoke-WPFPresets "minimal"}
|
||||
"WPFexport" {Invoke-WPFImpex -type "export" -CheckBox "WPFTweaks"}
|
||||
"WPFimport" {Invoke-WPFImpex -type "import" -CheckBox "WPFTweaks"}
|
||||
"WPFexportWinget" {Invoke-WPFImpex -type "export" -CheckBox "WPFInstall"}
|
||||
"WPFimportWinget" {Invoke-WPFImpex -type "import" -CheckBox "WPFInstall"}
|
||||
"WPFclear" {Invoke-WPFPresets -preset $null -imported $true}
|
||||
"WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"}
|
||||
"WPFtweaksbutton" {Invoke-WPFtweaksbutton}
|
||||
"WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enabled"}
|
||||
"WPFRemoveUltPerf" {Invoke-WPFUltimatePerformance -State "Disabled"}
|
||||
"WPFToggleDarkMode" {Invoke-WPFDarkMode -DarkMoveEnabled $(Get-WinUtilDarkMode)}
|
||||
"WPFundoall" {Invoke-WPFundoall}
|
||||
"WPFFeatureInstall" {Invoke-WPFFeatureInstall}
|
||||
"WPFPanelDISM" {Invoke-WPFPanelDISM}
|
||||
@ -42,15 +47,11 @@ function Invoke-WPFButton {
|
||||
"WPFPaneluser" {Invoke-WPFControlPanel -Panel $button}
|
||||
"WPFUpdatesdefault" {Invoke-WPFUpdatesdefault}
|
||||
"WPFFixesUpdate" {Invoke-WPFFixesUpdate}
|
||||
"WPFFixesWinget" {Invoke-WPFFixesWinget}
|
||||
"WPFFixesNetwork" {Invoke-WPFFixesNetwork}
|
||||
"WPFUpdatesdisable" {Invoke-WPFUpdatesdisable}
|
||||
"WPFUpdatessecurity" {Invoke-WPFUpdatessecurity}
|
||||
"WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil"}
|
||||
"WPFGetInstalled" {Invoke-WPFGetInstalled -CheckBox "winget"}
|
||||
"WPFGetInstalledTweaks" {Invoke-WPFGetInstalled -CheckBox "tweaks"}
|
||||
"WPFGetIso" {Invoke-WPFGetIso}
|
||||
"WPFMicrowin" {Invoke-WPFMicrowin}
|
||||
"WPFCloseButton" {Invoke-WPFCloseButton}
|
||||
}
|
||||
}
|
@ -7,12 +7,12 @@ function Invoke-WPFInstall {
|
||||
#>
|
||||
|
||||
if($sync.ProcessRunning){
|
||||
$msg = "[Invoke-WPFInstall] Install process is currently running."
|
||||
$msg = "Install process is currently running."
|
||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||
return
|
||||
}
|
||||
|
||||
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
|
||||
$WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall"
|
||||
|
||||
if ($wingetinstall.Count -eq 0) {
|
||||
$WarningMsg = "Please select the program(s) to install"
|
||||
@ -20,15 +20,24 @@ function Invoke-WPFInstall {
|
||||
return
|
||||
}
|
||||
|
||||
Invoke-WPFRunspace -ArgumentList $WingetInstall,$DebugPreference -ScriptBlock {
|
||||
param($WingetInstall, $DebugPreference)
|
||||
|
||||
Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock {
|
||||
param($WingetInstall)
|
||||
try{
|
||||
$sync.ProcessRunning = $true
|
||||
|
||||
# Ensure winget is installed
|
||||
Install-WinUtilWinget
|
||||
|
||||
# Install all selected programs in new window
|
||||
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall
|
||||
|
||||
$ButtonType = [System.Windows.MessageBoxButton]::OK
|
||||
$MessageboxTitle = "Installs are Finished "
|
||||
$Messageboxbody = ("Done")
|
||||
$MessageIcon = [System.Windows.MessageBoxImage]::Information
|
||||
|
||||
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
|
||||
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Installs have finished ---"
|
||||
Write-Host "==========================================="
|
||||
@ -38,7 +47,6 @@ function Invoke-WPFInstall {
|
||||
Write-Host "-- Winget failed to install ---"
|
||||
Write-Host "==========================================="
|
||||
}
|
||||
Start-Sleep -Seconds 5
|
||||
$sync.ProcessRunning = $False
|
||||
}
|
||||
}
|
@ -21,9 +21,8 @@ function Invoke-WPFRunspace {
|
||||
[CmdletBinding()]
|
||||
Param (
|
||||
$ScriptBlock,
|
||||
$ArgumentList,
|
||||
$DebugPreference
|
||||
)
|
||||
$ArgumentList
|
||||
)
|
||||
|
||||
# Create a PowerShell instance
|
||||
$script:powershell = [powershell]::Create()
|
||||
@ -31,9 +30,8 @@ function Invoke-WPFRunspace {
|
||||
# Add Scriptblock and Arguments to runspace
|
||||
$script:powershell.AddScript($ScriptBlock)
|
||||
$script:powershell.AddArgument($ArgumentList)
|
||||
$script:powershell.AddArgument($DebugPreference) # Pass DebugPreference to the script block
|
||||
$script:powershell.RunspacePool = $sync.runspace
|
||||
|
||||
|
||||
# Execute the RunspacePool
|
||||
$script:handle = $script:powershell.BeginInvoke()
|
||||
|
||||
|
@ -9,8 +9,8 @@ function Invoke-WPFToggle {
|
||||
The name of the toggle to invoke
|
||||
|
||||
#>
|
||||
|
||||
Param ([string]$Button)
|
||||
|
||||
Param ([string]$Button)
|
||||
|
||||
# Use this to get the name of the button
|
||||
#[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info")
|
||||
@ -19,10 +19,6 @@ function Invoke-WPFToggle {
|
||||
|
||||
"WPFToggleDarkMode" {Invoke-WinUtilDarkMode -DarkMoveEnabled $(Get-WinUtilToggleStatus WPFToggleDarkMode)}
|
||||
"WPFToggleBingSearch" {Invoke-WinUtilBingSearch $(Get-WinUtilToggleStatus WPFToggleBingSearch)}
|
||||
"WPFToggleNumLock" {Invoke-WinUtilNumLock $(Get-WinUtilToggleStatus WPFToggleNumLock)}
|
||||
"WPFToggleVerboseLogon" {Invoke-WinUtilVerboseLogon $(Get-WinUtilToggleStatus WPFToggleVerboseLogon)}
|
||||
"WPFToggleShowExt" {Invoke-WinUtilShowExt $(Get-WinUtilToggleStatus WPFToggleShowExt)}
|
||||
"WPFToggleSnapFlyout" {Invoke-WinUtilSnapFlyout $(Get-WinUtilToggleStatus WPFToggleSnapFlyout)}
|
||||
"WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $(Get-WinUtilToggleStatus WPFToggleMouseAcceleration)}
|
||||
|
||||
}
|
||||
}
|
@ -7,12 +7,12 @@ function Invoke-WPFUnInstall {
|
||||
#>
|
||||
|
||||
if($sync.ProcessRunning){
|
||||
$msg = "[Invoke-WPFUnInstall] Install process is currently running"
|
||||
$msg = "Install process is currently running"
|
||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||
return
|
||||
}
|
||||
|
||||
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
|
||||
$WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall"
|
||||
|
||||
if ($wingetinstall.Count -eq 0) {
|
||||
$WarningMsg = "Please select the program(s) to install"
|
||||
@ -29,9 +29,8 @@ function Invoke-WPFUnInstall {
|
||||
|
||||
if($confirm -eq "No"){return}
|
||||
|
||||
Invoke-WPFRunspace -ArgumentList $WingetInstall,$DebugPreference -ScriptBlock {
|
||||
param($WingetInstall, $DebugPreference)
|
||||
|
||||
Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock {
|
||||
param($WingetInstall)
|
||||
try{
|
||||
$sync.ProcessRunning = $true
|
||||
|
||||
@ -42,7 +41,7 @@ function Invoke-WPFUnInstall {
|
||||
$MessageboxTitle = "Uninstalls are Finished "
|
||||
$Messageboxbody = ("Done")
|
||||
$MessageIcon = [System.Windows.MessageBoxImage]::Information
|
||||
|
||||
|
||||
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
|
||||
|
||||
Write-Host "==========================================="
|
||||
|
27
pester/winutil.Tests.ps1
Normal file
27
pester/winutil.Tests.ps1
Normal file
@ -0,0 +1,27 @@
|
||||
# Load Variables needed for testing
|
||||
|
||||
./Compile.ps1
|
||||
|
||||
$script = Get-Content .\winutil.ps1
|
||||
# Remove the part of the script that shows the form, leaving only the variable and function declarations
|
||||
$script[0..($script.count - 21)] | Out-File .\pester.ps1
|
||||
|
||||
|
||||
BeforeAll {
|
||||
# Execute the truncated script, bringing the variabes into the current scope
|
||||
. .\pester.ps1
|
||||
}
|
||||
|
||||
Describe "GUI" {
|
||||
Context "XML" {
|
||||
It "Imports with no errors" {
|
||||
$inputXML | should -Not -BeNullOrEmpty
|
||||
}
|
||||
}
|
||||
|
||||
Context "Form" {
|
||||
It "Imports with no errors" {
|
||||
$sync.Form | should -Not -BeNullOrEmpty
|
||||
}
|
||||
}
|
||||
}
|
412
scripts/main.ps1
412
scripts/main.ps1
@ -1,4 +1,5 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Set the maximum number of threads for the RunspacePool to the number of threads on the machine
|
||||
$maxthreads = [int]$env:NUMBER_OF_PROCESSORS
|
||||
|
||||
@ -36,7 +37,7 @@ $sync.runspace.Open()
|
||||
|
||||
WingetFailedInstall($Message) : base($Message) {}
|
||||
}
|
||||
|
||||
|
||||
class ChocoFailedInstall : Exception {
|
||||
[string] $additionalData
|
||||
|
||||
@ -48,67 +49,17 @@ $sync.runspace.Open()
|
||||
|
||||
GenericException($Message) : base($Message) {}
|
||||
}
|
||||
|
||||
|
||||
|
||||
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
|
||||
|
||||
$organizedData = @{}
|
||||
# Iterate through JSON data and organize by panel and category
|
||||
foreach ($appName in $sync.configs.applications.PSObject.Properties.Name) {
|
||||
$appInfo = $sync.configs.applications.$appName
|
||||
|
||||
# Create an object for the application
|
||||
$appObject = [PSCustomObject]@{
|
||||
Name = $appName
|
||||
Category = $appInfo.Category
|
||||
Content = $appInfo.Content
|
||||
Choco = $appInfo.choco
|
||||
Winget = $appInfo.winget
|
||||
Panel = $appInfo.panel
|
||||
Link = $appInfo.link
|
||||
Description = $appInfo.description
|
||||
}
|
||||
|
||||
if (-not $organizedData.ContainsKey($appInfo.panel)) {
|
||||
$organizedData[$appInfo.panel] = @{}
|
||||
}
|
||||
|
||||
if (-not $organizedData[$appInfo.panel].ContainsKey($appInfo.Category)) {
|
||||
$organizedData[$appInfo.panel][$appInfo.Category] = @{}
|
||||
}
|
||||
|
||||
# Store application data in a sub-array under the category
|
||||
$organizedData[$appInfo.panel][$appInfo.Category][$appName] = $appObject
|
||||
}
|
||||
|
||||
# Iterate through organizedData by panel, category, and application
|
||||
foreach ($panel in $organizedData.Keys) {
|
||||
foreach ($category in $organizedData[$panel].Keys) {
|
||||
$blockXml += "<Label Content=""$($category)"" FontSize=""16""/>`n"
|
||||
$sortedApps = $organizedData[$panel][$category].Keys | Sort-Object
|
||||
foreach ($appName in $sortedApps) {
|
||||
$appInfo = $organizedData[$panel][$category][$appName]
|
||||
if ($null -eq $appInfo.Link)
|
||||
{
|
||||
$blockXml += "<CheckBox Name=""$appName"" Content=""$($appInfo.Content)"" ToolTip=""$($appInfo.Description)""/>`n"
|
||||
}
|
||||
else
|
||||
{
|
||||
$blockXml += "<StackPanel Orientation=""Horizontal""><CheckBox Name=""$appName"" Content=""$($appInfo.Content)"" ToolTip=""$($appInfo.Description)"" Margin=""0,0,2,0""/><TextBlock Name=""$($appName)Link"" Style=""{StaticResource HoverTextBlockStyle}"" Text=""(?)"" ToolTip=""$($appInfo.Link)"" /></StackPanel>`n"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$inputXML = $inputXML -replace "{{InstallPanel$panel}}", $blockXml
|
||||
$blockXml = ""
|
||||
}
|
||||
|
||||
if ((Get-WinUtilToggleStatus WPFToggleDarkMode) -eq $True) {
|
||||
if ((Get-WinUtilToggleStatus WPFToggleDarkMode) -eq $True){
|
||||
$ctttheme = 'Matrix'
|
||||
}
|
||||
else {
|
||||
Else{
|
||||
$ctttheme = 'Classic'
|
||||
}
|
||||
|
||||
$inputXML = Set-WinUtilUITheme -inputXML $inputXML -themeName $ctttheme
|
||||
|
||||
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
|
||||
@ -136,8 +87,22 @@ $xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"]
|
||||
|
||||
$sync.keys | ForEach-Object {
|
||||
if($sync.$psitem){
|
||||
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "CheckBox" `
|
||||
-and $sync["$psitem"].Name -like "WPFToggle*"){
|
||||
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "Button"){
|
||||
$sync["$psitem"].Add_Click({
|
||||
[System.Object]$Sender = $args[0]
|
||||
Invoke-WPFButton $Sender.name
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$sync.keys | ForEach-Object {
|
||||
if($sync.$psitem){
|
||||
if(
|
||||
$($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "CheckBox" `
|
||||
-and $sync["$psitem"].Name -like "WPFToggle*"
|
||||
){
|
||||
$sync["$psitem"].IsChecked = Get-WinUtilToggleStatus $sync["$psitem"].Name
|
||||
|
||||
$sync["$psitem"].Add_Click({
|
||||
@ -145,34 +110,10 @@ $sync.keys | ForEach-Object {
|
||||
Invoke-WPFToggle $Sender.name
|
||||
})
|
||||
}
|
||||
|
||||
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "ToggleButton"){
|
||||
$sync["$psitem"].Add_Click({
|
||||
[System.Object]$Sender = $args[0]
|
||||
Invoke-WPFButton $Sender.name
|
||||
})
|
||||
}
|
||||
|
||||
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "Button"){
|
||||
$sync["$psitem"].Add_Click({
|
||||
[System.Object]$Sender = $args[0]
|
||||
Invoke-WPFButton $Sender.name
|
||||
})
|
||||
}
|
||||
|
||||
if ($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "TextBlock") {
|
||||
if ($sync["$psitem"].Name.EndsWith("Link")) {
|
||||
$sync["$psitem"].Add_MouseUp({
|
||||
[System.Object]$Sender = $args[0]
|
||||
Start-Process $Sender.ToolTip -ErrorAction Stop
|
||||
Write-Debug "Opening: $($Sender.ToolTip)"
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#===========================================================================
|
||||
# Setup background config
|
||||
#===========================================================================
|
||||
@ -180,7 +121,9 @@ $sync.keys | ForEach-Object {
|
||||
# Load computer information in the background
|
||||
Invoke-WPFRunspace -ScriptBlock {
|
||||
$sync.ConfigLoaded = $False
|
||||
|
||||
$sync.ComputerInfo = Get-ComputerInfo
|
||||
|
||||
$sync.ConfigLoaded = $True
|
||||
} | Out-Null
|
||||
|
||||
@ -192,7 +135,14 @@ Invoke-WPFRunspace -ScriptBlock {
|
||||
Invoke-WPFFormVariables
|
||||
|
||||
# Check if Chocolatey is installed
|
||||
Install-WinUtilChoco
|
||||
try{
|
||||
Install-WinUtilChoco
|
||||
}
|
||||
Catch [ChocoFailedInstall]{
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Chocolatey failed to install ---"
|
||||
Write-Host "==========================================="
|
||||
}
|
||||
|
||||
# Set the titlebar
|
||||
$sync["Form"].title = $sync["Form"].title + " " + $sync.version
|
||||
@ -203,299 +153,7 @@ $sync["Form"].Add_Closing({
|
||||
[System.GC]::Collect()
|
||||
})
|
||||
|
||||
# Attach the event handler to the Click event
|
||||
$sync.CheckboxFilterClear.Add_Click({
|
||||
$sync.CheckboxFilter.Text = ""
|
||||
$sync.CheckboxFilterClear.Visibility = "Collapsed"
|
||||
})
|
||||
|
||||
# add some shortcuts for people that don't like clicking
|
||||
$commonKeyEvents = {
|
||||
if ($sync.ProcessRunning -eq $true) {
|
||||
return
|
||||
}
|
||||
|
||||
if ($_.Key -eq "Escape")
|
||||
{
|
||||
$sync.CheckboxFilter.SelectAll()
|
||||
$sync.CheckboxFilter.Text = ""
|
||||
$sync.CheckboxFilterClear.Visibility = "Collapsed"
|
||||
return
|
||||
}
|
||||
|
||||
# don't ask, I know what I'm doing, just go...
|
||||
if (($_.Key -eq "Q" -and $_.KeyboardDevice.Modifiers -eq "Ctrl"))
|
||||
{
|
||||
$this.Close()
|
||||
}
|
||||
if ($_.KeyboardDevice.Modifiers -eq "Alt") {
|
||||
if ($_.SystemKey -eq "I") {
|
||||
Invoke-WPFButton "WPFTab1BT"
|
||||
}
|
||||
if ($_.SystemKey -eq "T") {
|
||||
Invoke-WPFButton "WPFTab2BT"
|
||||
}
|
||||
if ($_.SystemKey -eq "C") {
|
||||
Invoke-WPFButton "WPFTab3BT"
|
||||
}
|
||||
if ($_.SystemKey -eq "U") {
|
||||
Invoke-WPFButton "WPFTab4BT"
|
||||
}
|
||||
if ($_.SystemKey -eq "M") {
|
||||
Invoke-WPFButton "WPFTab5BT"
|
||||
}
|
||||
if ($_.SystemKey -eq "P") {
|
||||
Write-Host "Your Windows Product Key: $((Get-WmiObject -query 'select * from SoftwareLicensingService').OA3xOriginalProductKey)"
|
||||
}
|
||||
}
|
||||
# shortcut for the filter box
|
||||
if ($_.Key -eq "F" -and $_.KeyboardDevice.Modifiers -eq "Ctrl") {
|
||||
if ($sync.CheckboxFilter.Text -eq "Ctrl-F to filter") {
|
||||
$sync.CheckboxFilter.SelectAll()
|
||||
$sync.CheckboxFilter.Text = ""
|
||||
}
|
||||
$sync.CheckboxFilter.Focus()
|
||||
}
|
||||
}
|
||||
|
||||
$sync["Form"].Add_PreViewKeyDown($commonKeyEvents)
|
||||
|
||||
$sync["Form"].Add_MouseLeftButtonDown({
|
||||
if ($sync["SettingsPopup"].IsOpen) {
|
||||
$sync["SettingsPopup"].IsOpen = $false
|
||||
}
|
||||
$sync["Form"].DragMove()
|
||||
})
|
||||
|
||||
$sync["Form"].Add_MouseDoubleClick({
|
||||
if ($sync["Form"].WindowState -eq [Windows.WindowState]::Normal)
|
||||
{
|
||||
$sync["Form"].WindowState = [Windows.WindowState]::Maximized;
|
||||
}
|
||||
else
|
||||
{
|
||||
$sync["Form"].WindowState = [Windows.WindowState]::Normal;
|
||||
}
|
||||
})
|
||||
|
||||
$sync["Form"].Add_Deactivated({
|
||||
Write-Debug "WinUtil lost focus"
|
||||
if ($sync["SettingsPopup"].IsOpen) {
|
||||
$sync["SettingsPopup"].IsOpen = $false
|
||||
}
|
||||
})
|
||||
|
||||
$sync["Form"].Add_ContentRendered({
|
||||
|
||||
try {
|
||||
[void][Window]
|
||||
} catch {
|
||||
Add-Type @"
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
public class Window {
|
||||
[DllImport("user32.dll")]
|
||||
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int GetSystemMetrics(int nIndex);
|
||||
};
|
||||
public struct RECT {
|
||||
public int Left; // x position of upper-left corner
|
||||
public int Top; // y position of upper-left corner
|
||||
public int Right; // x position of lower-right corner
|
||||
public int Bottom; // y position of lower-right corner
|
||||
}
|
||||
"@
|
||||
}
|
||||
|
||||
foreach ($proc in (Get-Process | Where-Object { $_.MainWindowTitle -and $_.MainWindowTitle -like "*titus*" })) {
|
||||
if ($proc.Id -ne [System.IntPtr]::Zero) {
|
||||
Write-Debug "MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle) $($proc.MainWindowHandle)"
|
||||
$windowHandle = $proc.MainWindowHandle
|
||||
}
|
||||
}
|
||||
|
||||
# need to experiemnt more
|
||||
# setting icon for the windows is still not working
|
||||
# $pngUrl = "https://christitus.com/images/logo-full.png"
|
||||
# $pngPath = "$env:TEMP\cttlogo.png"
|
||||
# $iconPath = "$env:TEMP\cttlogo.ico"
|
||||
# # Download the PNG file
|
||||
# Invoke-WebRequest -Uri $pngUrl -OutFile $pngPath
|
||||
# if (Test-Path -Path $pngPath) {
|
||||
# ConvertTo-Icon -bitmapPath $pngPath -iconPath $iconPath
|
||||
# }
|
||||
# $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($iconPath)
|
||||
# Write-Host $icon.Handle
|
||||
# [Window]::SendMessage($windowHandle, 0x80, [IntPtr]::Zero, $icon.Handle)
|
||||
|
||||
$rect = New-Object RECT
|
||||
[Window]::GetWindowRect($windowHandle, [ref]$rect)
|
||||
$width = $rect.Right - $rect.Left
|
||||
$height = $rect.Bottom - $rect.Top
|
||||
|
||||
Write-Debug "UpperLeft:$($rect.Left),$($rect.Top) LowerBottom:$($rect.Right),$($rect.Bottom). Width:$($width) Height:$($height)"
|
||||
|
||||
# Load the Windows Forms assembly
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
$primaryScreen = [System.Windows.Forms.Screen]::PrimaryScreen
|
||||
# Check if the primary screen is found
|
||||
if ($primaryScreen) {
|
||||
# Extract screen width and height for the primary monitor
|
||||
$screenWidth = $primaryScreen.Bounds.Width
|
||||
$screenHeight = $primaryScreen.Bounds.Height
|
||||
|
||||
# Print the screen size
|
||||
Write-Debug "Primary Monitor Width: $screenWidth pixels"
|
||||
Write-Debug "Primary Monitor Height: $screenHeight pixels"
|
||||
|
||||
# Compare with the primary monitor size
|
||||
if ($width -gt $screenWidth -or $height -gt $screenHeight) {
|
||||
Write-Debug "The specified width and/or height is greater than the primary monitor size."
|
||||
[void][Window]::MoveWindow($windowHandle, 0, 0, $screenWidth, $screenHeight, $True)
|
||||
} else {
|
||||
Write-Debug "The specified width and height are within the primary monitor size limits."
|
||||
}
|
||||
} else {
|
||||
Write-Debug "Unable to retrieve information about the primary monitor."
|
||||
}
|
||||
|
||||
Invoke-WPFTab "WPFTab1BT"
|
||||
$sync["Form"].Focus()
|
||||
|
||||
# maybe this is not the best place to load and execute config file?
|
||||
# maybe community can help?
|
||||
if ($PARAM_CONFIG){
|
||||
Invoke-WPFImpex -type "import" -Config $PARAM_CONFIG
|
||||
if ($PARAM_RUN){
|
||||
while ($sync.ProcessRunning) {
|
||||
Start-Sleep -Seconds 5
|
||||
}
|
||||
Start-Sleep -Seconds 5
|
||||
|
||||
Write-Host "Applying tweaks..."
|
||||
Invoke-WPFtweaksbutton
|
||||
while ($sync.ProcessRunning) {
|
||||
Start-Sleep -Seconds 5
|
||||
}
|
||||
Start-Sleep -Seconds 5
|
||||
|
||||
Write-Host "Installing features..."
|
||||
Invoke-WPFFeatureInstall
|
||||
while ($sync.ProcessRunning) {
|
||||
Start-Sleep -Seconds 5
|
||||
}
|
||||
|
||||
Start-Sleep -Seconds 5
|
||||
Write-Host "Installing applications..."
|
||||
while ($sync.ProcessRunning) {
|
||||
Start-Sleep -Seconds 1
|
||||
}
|
||||
Invoke-WPFInstall
|
||||
Start-Sleep -Seconds 5
|
||||
|
||||
Write-Host "Done."
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
$sync["CheckboxFilter"].Add_TextChanged({
|
||||
|
||||
if ($sync.CheckboxFilter.Text -ne "") {
|
||||
$sync.CheckboxFilterClear.Visibility = "Visible"
|
||||
}
|
||||
else {
|
||||
$sync.CheckboxFilterClear.Visibility = "Collapsed"
|
||||
}
|
||||
|
||||
$filter = Get-WinUtilVariables -Type CheckBox
|
||||
$CheckBoxes = $sync.GetEnumerator() | Where-Object { $psitem.Key -in $filter }
|
||||
|
||||
foreach ($CheckBox in $CheckBoxes) {
|
||||
# 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) {
|
||||
continue
|
||||
}
|
||||
|
||||
$textToSearch = $sync.CheckboxFilter.Text
|
||||
$checkBoxName = $CheckBox.Key
|
||||
$textBlockName = $checkBoxName + "Link"
|
||||
|
||||
# Retrieve the corresponding text block based on the generated name
|
||||
$textBlock = $sync[$textBlockName]
|
||||
|
||||
if ($CheckBox.Value.Content.ToLower().Contains($textToSearch)) {
|
||||
$CheckBox.Value.Visibility = "Visible"
|
||||
# Set the corresponding text block visibility
|
||||
if ($textBlock -ne $null) {
|
||||
$textBlock.Visibility = "Visible"
|
||||
}
|
||||
}
|
||||
else {
|
||||
$CheckBox.Value.Visibility = "Collapsed"
|
||||
# Set the corresponding text block visibility
|
||||
if ($textBlock -ne $null) {
|
||||
$textBlock.Visibility = "Collapsed"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
# Define event handler for button click
|
||||
$sync["SettingsButton"].Add_Click({
|
||||
Write-Debug "SettingsButton clicked"
|
||||
if ($sync["SettingsPopup"].IsOpen) {
|
||||
$sync["SettingsPopup"].IsOpen = $false
|
||||
}
|
||||
else {
|
||||
$sync["SettingsPopup"].IsOpen = $true
|
||||
}
|
||||
$_.Handled = $false
|
||||
})
|
||||
|
||||
# Define event handlers for menu items
|
||||
$sync["ImportMenuItem"].Add_Click({
|
||||
# Handle Import menu item click
|
||||
Write-Debug "Import clicked"
|
||||
$sync["SettingsPopup"].IsOpen = $false
|
||||
Invoke-WPFImpex -type "import"
|
||||
$_.Handled = $false
|
||||
})
|
||||
|
||||
$sync["ExportMenuItem"].Add_Click({
|
||||
# Handle Export menu item click
|
||||
Write-Debug "Export clicked"
|
||||
$sync["SettingsPopup"].IsOpen = $false
|
||||
Invoke-WPFImpex -type "export"
|
||||
$_.Handled = $false
|
||||
})
|
||||
|
||||
$sync["AboutMenuItem"].Add_Click({
|
||||
# Handle Export menu item click
|
||||
Write-Debug "About clicked"
|
||||
$sync["SettingsPopup"].IsOpen = $false
|
||||
# Example usage
|
||||
$authorInfo = @"
|
||||
Author : @christitustech
|
||||
Runspace : @DeveloperDurp
|
||||
GUI : @KonTy
|
||||
MicroWin : @KonTy
|
||||
GitHub : https://github.com/ChrisTitusTech/winutil
|
||||
Version : $($sync.version)
|
||||
"@
|
||||
Show-CustomDialog -Message $authorInfo -Width 400
|
||||
})
|
||||
|
||||
# Show the form
|
||||
$sync["Form"].ShowDialog() | out-null
|
||||
|
||||
Stop-Transcript
|
@ -5,36 +5,10 @@
|
||||
GitHub : https://github.com/ChrisTitusTech
|
||||
Version : #{replaceme}
|
||||
#>
|
||||
param (
|
||||
[switch]$Debug,
|
||||
[string]$Config,
|
||||
[switch]$Run
|
||||
)
|
||||
|
||||
# Set DebugPreference based on the -Debug switch
|
||||
if ($Debug) {
|
||||
$DebugPreference = "Continue"
|
||||
}
|
||||
|
||||
if ($Config) {
|
||||
$PARAM_CONFIG = $Config
|
||||
}
|
||||
|
||||
$PARAM_RUN = $false
|
||||
# Handle the -Run switch
|
||||
if ($Run) {
|
||||
Write-Host "Running config file tasks..."
|
||||
$PARAM_RUN = $true
|
||||
}
|
||||
|
||||
if (!(Test-Path -Path $ENV:TEMP)) {
|
||||
New-Item -ItemType Directory -Force -Path $ENV:TEMP
|
||||
}
|
||||
|
||||
Start-Transcript $ENV:TEMP\Winutil.log -Append
|
||||
|
||||
# Load DLLs
|
||||
Add-Type -AssemblyName PresentationFramework
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
|
||||
# Variable to sync between runspaces
|
||||
@ -44,21 +18,9 @@ $sync.version = "#{replaceme}"
|
||||
$sync.configs = @{}
|
||||
$sync.ProcessRunning = $false
|
||||
|
||||
$currentPid = [System.Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
$principal = new-object System.Security.Principal.WindowsPrincipal($currentPid)
|
||||
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
|
||||
|
||||
|
||||
if ($principal.IsInRole($adminRole))
|
||||
{
|
||||
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
|
||||
clear-host
|
||||
}
|
||||
else
|
||||
{
|
||||
$newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";
|
||||
$newProcess.Arguments = $myInvocation.MyCommand.Definition;
|
||||
$newProcess.Verb = "runas";
|
||||
[System.Diagnostics.Process]::Start($newProcess);
|
||||
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."
|
||||
Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "iwr -useb https://christitus.com/win | iex"
|
||||
break
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user