-
Notifications
You must be signed in to change notification settings - Fork 1
/
Set-WTColorScheme.ps1
123 lines (110 loc) · 3.89 KB
/
Set-WTColorScheme.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
function Set-WTColorScheme
{
<#
.Synopsis
Sets the Windows Terminal Color Scheme
.Description
Sets the color scheme used by a given tab profile in Windows Terminal.
If the tab profile is not provided, it will attempt to auto-detect based off of the window title.
.Example
Set-WTColorScheme -ColorScheme 'AdventureTime'
.Example
Get-WTProfile -Name 'PowerShell' |
Set-WTColorScheme 'AdventureTime'
.Link
Add-WTColorScheme
.Link
Get-WTColorScheme
#>
[CmdletBinding(SupportsShouldProcess,ConfirmImpact='Medium')]
[OutputType([Nullable])]
param(
# The name of the color scheme
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[Alias('Name')]
[string]
$ColorScheme,
# The name or ID of the tab profiles the color scheme will be applied to.
# If this is not provided, it will attempt to auto-detect based off of the window title.
[Parameter(ValueFromPipelineByPropertyName)]
[Alias('Profile','GUID')]
[string[]]
$ProfileName,
# If set, will pass thru the changes.
[switch]
$PassThru
)
process {
$prof = Get-WTProfile -Global
if ($_.Name -and $_.Guid) { # If we've been piped in a profile
$ProfileName = $_.Guid
}
#region Find the tab profile target
if (-not $ProfileName -and $env:WT_PROFILE_ID) {
$ProfileName = $env:WT_PROFILE_ID
if (-not $ProfileName) {
Write-Warning "Could not find Windows Terminal profile. Changing default instead."
}
}
#endregion Find the tab profile target
#region Change Tab profile target
$changed = @()
foreach ($tabProf in $prof.profiles.list) {
if ($ProfileName) {
$ok = $false
foreach ($tp in $ProfileName) {
if ($tabProf.Name -like $tp -or
$tabProf.Guid -eq $tp -or
$tabProf.Guid -eq "{$tp}"
)
{
$ok = $true
break
}
}
}
if ($ok -and $tabProf.colorScheme -ne $ColorScheme) {
$changed +=$tabProf | Add-Member NoteProperty colorScheme $ColorScheme -Force -PassThru
}
}
if (-not $changed -and -not $ProfileName) {
if ($prof.profiles.default.colorScheme -ne $ColorScheme) {
$changed += $prof.profiles.default |
Add-Member NoteProperty colorScheme $ColorScheme -Force -PassThru
}
}
#endregion Change Tab profile target
#region Update File
if ($changed -and $PSCmdlet.ShouldProcess("Update $($prof.Path)")) {
$wtPath = $prof.Path
$prof.psobject.properties.Remove('Path')
$json = $prof | ConvertTo-Json -Depth 100
$tries = 3
do {
try {
[IO.File]::WriteAllText($wtPath, $JSON, [Text.Encoding]::UTF8)
break
} catch {
$tries--
Write-Warning "$_ : $tries Left"
[Threading.Thread]::Sleep(100)
}
} while ($tries)
$prof.psobject.properties.add([PSNoteProperty]::new('Path', $wtPath))
}
if ($WhatIfPreference) {
$changed
}
if ($PassThru) {
$changedNames = $changed | Select-Object -ExpandProperty colorScheme -Unique
$prof.schemes |
Where-Object {$changedNames -contains $_.Name } |
ForEach-Object {
$_.pstypenames.clear()
$_.pstypenames.add('WindowsTerminal.ColorScheme')
$_
}
}
#endregion Update File
}
}