Skip to content

Instantly share code, notes, and snippets.

@AndrewPla
Last active February 7, 2022 09:18
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save AndrewPla/5c302e91af5448c89a65bfab364249d8 to your computer and use it in GitHub Desktop.
Save AndrewPla/5c302e91af5448c89a65bfab364249d8 to your computer and use it in GitHub Desktop.
Updates the Windows Terminal profiles.json file with all the schemes from https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/windowsterminal
# Path to the profile when installed from the Windows Store.
$profilePath = "C:\Users\$Env:Username\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\profiles.json"
# Remove existing comments from the profiles.json file.
$profile = (Get-Content $ProfilePath) -replace '(?m)(?<=^([^"]|"[^"]*")*)//.*' -replace '(?ms)/\*.*?\*/' | Out-String | ConvertFrom-Json
$backupProfilePath = "$home\Documents\WindowsTerminalprofiles.json"
Write-Verbose "Backing up profile to $backupProfilePath"
$profile | ConvertTo-Json | Set-Content $backupProfilePath
# Grab all schemes from github
Function Get-WtScheme {
<#
.Description
Returns color schemes from
https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/windowsterminal
.Parameter Url
Url to the iTerm2 project.
.Parameter Theme
Specify the name of the theme that you want returned. All themes are returned by default
.Example
PS> Get-WtTheme
Returns all available themes
.Example
PS> Get-WtTheme -Filter 'atom.json'
Retrieves the atom.json theme.
.Link
https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/windowsterminal/
.Link link to blogpost
#>
[cmdletbinding()]
param(
[string]
$Theme = '*',
[string]
$Url = 'https://github.com/mbadolato/iTerm2-Color-Schemes/tree/master/windowsterminal'
)
$page = Invoke-WebRequest $Url -UseBasicParsing
$links = $page.Links | Where-Object title -like "$Theme.json"
Write-Verbose "$($links.count) links found matching $Theme"
foreach ($link in $links) {
# Use the raw url so raw results can be returned and output
$base = 'https://raw.githubusercontent.com'
$href = $link.href
$rawUrl = $base + $href
$rawUrl = $rawUrl.replace('/blob', '')
Invoke-RestMethod $RawUrl
}
}
$schemes = Get-WtScheme
Write-Verbose "We have found $($schemes.count) schemes. Great Success!!"
# This object will contain schemes from our profile and all of the schemes that we just got.
$combinedProperties = [pscustomobject]@()
# loop through the original scheme and export the properties
foreach ($scheme in ($profile.schemes)) {
# Avoid adding duplicate schemes.
if (-not ($combinedProperties.name -like $scheme.name)) {
$combinedProperties += $scheme
}
}
# Add new schemes
foreach ($scheme in $schemes) {
if (-not ($combinedProperties.name -like $scheme.name)) {
$combinedProperties += $scheme
}
}
# Remove the count property from appearing in our json output.
# This only persists for the session
# See https://stackoverflow.com/questions/20848507/why-does-powershell-give-different-result-in-one-liner-than-two-liner-when-conve
Remove-TypeData System.Array -ErrorAction SilentlyContinue
$updatedSchemeObj = [pscustomobject]($combinedProperties)
$profile.schemes = $updatedSchemeObj
Write-Verbose "Updating profile.json with new schemes"
$profile |
ConvertTo-Json -Depth 8 |
Set-Content $profilePath
@afmsavage
Copy link

Awesome script! Wanted to let people know that there may be a few edits to make to this script before running it. First, I installed Windows Terminal from the Microsoft store and it was installed to the LocalState directory instead of RoamingState. Second, run this script in Powershell, not PSCore.

@AndrewPla
Copy link
Author

I've updated the gist so that it defaults to LocalState for the profile.json file. When I wrote the script I was using a computer that had Windows Terminal installed from Chocolatey. Thanks for the feedback!

@liuwenzhuang
Copy link

Great Job. But I think should remove comments before ConvertFrom-Json in line 5 with:

$profile = (Get-Content $ProfilePath) -replace '(?m)(?<=^([^"]|"[^"]*")*)//.*' -replace '(?ms)/\*.*?\*/' | Out-String | ConvertFrom-Json

@paulbargaoanu
Copy link

Hi and thanks for providing this!
I'm getting an error after pasting this in the terminal and running it:

ConvertFrom-Json : Invalid JSON primitive: .
At line:6 char:39
+ $profile = Get-Content $ProfilePath | ConvertFrom-Json
+                                       ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json], ArgumentException          
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

I've also tried saving this as a .ps1 script and running it in classic PowerShell terminal as an admin, to no avail. Any help would be appreciated.

@AndrewPla
Copy link
Author

Thanks for that, @liuwenzhuang. I have updated the script to reflect that.

Paul try running the script in it's current form. It will remove any comments that you have added to your profiles.json file.

@paulbargaoanu
Copy link

@AndrewPla, thank you! It worked, I now have all the themes in my profiles.json.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment