本文标题:《「备忘」使用符号链接映射软件配置文件夹》。
镜像链接:https://www.wdssmq.com/post/20220826264.html
一些软件会把配置文件放在 %USERPROFILE%\AppData\Local
或 %USERPROFILE%\AppData\Roaming
,其中一些需要备份一下在重装系统后恢复。。
一些软件会把配置文件放在 %USERPROFILE%\AppData\Local
或 %USERPROFILE%\AppData\Roaming
,其中一些需要备份一下在重装系统后恢复。。
另:%AppData%
变量等同于 %USERPROFILE%\AppData\Roaming
,而 %LocalAppData%
变量等同于 %USERPROFILE%\AppData\Local
。。。
下边是我使用的方案:
- 1、在
C:\config
下存放真实的配置文件,C:\config\Roaming
和 C:\config\Local
分别对应 %USERPROFILE%\AppData\Roaming
和 %USERPROFILE%\AppData\Local
;
- 2、并不是所有配置都需要备份,所以只映射需要的文件夹,比如
C:\config\Local\Everything
、C:\config\Roaming\Everything
;
- 3、重装系统前备份整个 C 盘到外置硬盘,重装系统后恢复
C:\config
,再映射相应的文件夹;
再下边是自动化的 PowerShell 脚本:
- 1、保存脚本至
C:\config\config.ps1
,按需调整 $directoryList
;
- 2、在相应的软件安装前执行,「右键」→「使用 PowerShell 运行」,需要允许管理员权限;
- 3、首次运行会自动创建
C:\config\Roaming
和 C:\config\Local
及内部的空文件夹,然后创建符号链接;
- 4、如果软件已经安装,会提示:
The path $dir\$name is not a symbolic link.
,可以剪切合并至 C:\config
内相应文件夹,之后再次运行脚本;
- 5、恢复时只需将
C:\config
复制到新系统,再次运行脚本,同样应在软件安装前执行;
注:如果遇到「禁止运行脚本」,使用 set-executionpolicy remotesigned
修改执行策略;
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
| Set-Location "C:\config"
function CreateDirectory($dir, $name) { if (!(Test-Path "$dir\$name")) { New-Item -ItemType Directory -Path "$dir\$name" } else { Write-Output "The path $pwd\$dir\$name already exists" } Write-Output "" }
function CreateSymbolicLink($dir, $name) { $srcDir = "$pwd\$dir\$name" if ($dir -eq "Roaming") { $dir = $env:AppData } elseif ($dir -eq "Local") { $dir = $env:LocalAppData } if (!(Test-Path "$dir\$name")) { cmd /c mklink /d "$dir\$name" $srcDir } else { $item = Get-Item "$dir\$name" if ($item.Attributes -band [System.IO.FileAttributes]::ReparsePoint) { Write-Host "The path $dir\$name is a symbolic link." } else { Write-Output "+++++++++++++++++++++++++++++" Write-Host "The path $dir\$name is not a symbolic link." Write-Output "+++++++++++++++++++++++++++++" } } Write-Output "" }
If (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" $PSCommandArgs" -Verb RunAs Exit }
$directoryList = @("Everything", "qBittorrent", "Resilio Sync", "Resilio Sync Service")
foreach ($directory in $directoryList) { CreateDirectory "Roaming" $directory CreateSymbolicLink "Roaming" $directory CreateDirectory "Local" $directory CreateSymbolicLink "Local" $directory Write-Output "------------------------" Write-Output "" }
Read-Host -Prompt "Press any key to continue..."
|