当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 备份 Windows 终端设置

作者:精品下载站 日期:2024-12-14 07:58:09 浏览:14 分类:玩电脑

使用 PowerShell 备份 Windows 终端设置


我从一开始就是 Windows Terminal 的忠实粉丝。事实上,我已经使用它很长时间了,以至于我一直在沿着早已改变的配置文件设置进行操作。我没有费心去更新我的设置。部分挑战是应用程序会在后台更新,而我却没有意识到。这意味着我从不去查看发行说明来了解发生了什么变化。当前版本 0.11.1120 进行了一些重大更改,我现在已经整理了这些更改,并且我的设置文件已更新到我需要的位置。现在,我需要保留良好的备份,因为我总是在修改它。这意味着备份。由于我在 PowerShell 中完成所有操作,因此这意味着一个脚本。

在讨论剧本之前,让我提一下我正在做的一件不同的事情。设置文件的默认位置位于您的 AppData 文件夹中。

$ENV:Userprofile\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

这就是应用程序正在寻找的地方。但我想确保该文件已备份并且我想在多个系统上使用它。因此,我创建了一个指向该文件的硬链接,该链接指向我的 OneDrive 文件夹中的副本。您可以创建符号链接,但它不会按您想要的方式工作。

在不同位置创建文件的硬链接很可能不是 Windows 终端支持的配置,并且不能保证它适用于未来版本。但我愿意接受这个风险。

如果您好奇,可以使用以下 PowerShell 代码段(风险自负)。

$params = @{
    Path = "$ENV:Userprofile\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
    ItemType = "HardLink"
    Value = "C:\users\jeff\OneDrive\windowsterminal\settings.json"
}

Move-Item -Path $params.path -Destination $params.value
New-Item @params

我的备份脚本将使用新位置,但它也适用于原始文件。您将需要编辑脚本以满足您的情况。该脚本背后的想法是创建 settings.json 文件的编号备份,例如 settings.bak1.json。该脚本有一个参数,可用于限制备份文件的数量。我使用默认值 7。另一个参数是备份文件的目标文件夹。我正在使用同一个 OneDrive 文件夹。

#Backup-WTSettings.ps1

[CmdletBinding(SupportsShouldProcess)]
Param(
    #how many backup copies should be saved
    [int]$Limit = 7,
    #backup folder
    [parameter(HelpMessage = "Specify the backup location")]
    [ValidateScript({Test-Path $_})]
    [string]$Destination = "C:\users\jeff\OneDrive\windowsTerminal"
)

#Actual path to settings.json file - you will want to uncomment this line
#$json = $ENV:Userprofile\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

#comment out or update to reflect the location of the settings.json file to backup.
$json = "C:\users\jeff\OneDrive\windowsterminal\settings.json"

Write-Verbose "Backing up $json to $Destination"
Write-Verbose "Get existing backups and save as an array sorted by name"

[array]$bak = Get-ChildItem -path $Destination -Name settings.bak*.json | Sort-Object -Property name

if ($bak.count -eq 0) {
    Write-Verbose "Creating first backup copy."
    [int]$new = 1
}
else {
    #get the numeric value
    [int]$counter = ([regex]"\d+").match($bak[-1]).value
    Write-Verbose "Last backup is #$counter"

    [int]$new = $counter + 1
    Write-Verbose "Creating backup copy $new"
}

$backup = Join-Path -path $Destination -ChildPath "settings.bak$new.json"
Write-Verbose "Creating backup $backup"
Copy-Item -Path $json -Destination $backup

#update the list of backups sorted by age and delete extras
Write-Verbose "Removing any extra backup files over the limit of $Limit"

Get-ChildItem -path $Destination\settings.bak*.json | 
Sort-Object -Property LastWriteTime -Descending |
Select-Object -Skip $Limit | Remove-Item

#renumber backup files
Write-Verbose "Renumbering backup files"
<#
You can't rename a file if it will conflict with an existing file so files will be copied
to a temp folder with a new name, the old file deleted and then the copy restored
#>
Get-ChildItem -path $Destination\settings.bak*.json | 
Sort-Object -Property LastWriteTime |
ForEach-Object -Begin {$n = 0} -process {
    #rename each file with a new number
    $n++
    $temp = Join-Path -path $env:TEMP -ChildPath "settings.bak$n.json"

    Write-Verbose "Copying temp file to $temp"
    $_ | Copy-Item -Destination $temp

    Write-Verbose "Removing $($_.name)"
    $_ | Remove-Item

} -end {
    Write-Verbose "Restoring temp files to $Destination"
    Get-ChildItem -Path "$env:TEMP\settings.bak*.json" | Move-Item -Destination $Destination
}

#show current backup files
Get-ChildItem -path $Destination\settings.bak*.json | Sort-Object -Property LastWriteTime -Descending

我认为该脚本有足够的文档记录,以便您可以弄清楚它在做什么。

在早期版本中,我意识到即使我删除了较旧的文件夹,编号也会增加。我决定我真正想要的是不超过 7 个文件,settings.bak1.json 到 settings.bak7.json,其中 1 代表最旧的备份。这意味着我必须重命名备份文件。棘手的部分是我使用已经存在的文件名重命名。最简单的解决方案是将编号版本复制到临时文件夹,删除该文件,然后将临时文件复制回我的目标目录。

该脚本还支持 -WhatIf 并具有详细输出。如果您对我在做什么或为什么有任何疑问,请随时发表评论。享受并继续学习!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯