Created
September 5, 2024 20:57
-
-
Save matiboux/350d56ab560d95b5e6d81c0c3b49e78b to your computer and use it in GitHub Desktop.
Script to create symlink in Minecraft game folder to cloud folder
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Create symlink in Minecraft game folder for: | |
# - saves | |
# - resourcepacks | |
# - options.txt | |
if ($args.Length -lt 2) { | |
Write-Host 'ERROR: Missing arguments' | |
Write-Host '' | |
$args = @('-h') | |
} | |
if ($args[0] -eq '-h' -or $args[0] -eq '--help') { | |
Write-Host 'Usage: create_symlink.ps1 <game_folder> <cloud_folder>' | |
Write-Host 'Create symlinks in Minecraft game folder user data to cloud folder' | |
Write-Host ' game_folder : Minecraft game folder (use ''.'' for current directory)' | |
Write-Host ' cloud_folder : Cloud storage folder' | |
Write-Host '' | |
exit | |
} | |
# Set game folder | |
$gameFolder = $args[0] | |
# Set cloud folder | |
$cloudFolder = $args[1] | |
# # Print list of files in game folder (Get-ChildItem) | |
# Get-ChildItem $gameFolder | |
function Create-Symlink | |
{ | |
param ( | |
[Parameter(Mandatory=$false)] | |
[string] $directory, | |
[Parameter(Mandatory=$false)] | |
[string] $file | |
) | |
if ($directory) | |
{ | |
if ($file) | |
{ | |
Write-Host 'ERROR: Only one of directory or file argument can be set' | |
return | |
} | |
$path = $directory | |
} | |
elseif ($file) | |
{ | |
$path = $file | |
} | |
else | |
{ | |
Write-Host 'ERROR: Missing directory or file argument' | |
return | |
} | |
$gameSaveFolder = Join-Path $gameFolder $path | |
$gameSaveFolderExists = Test-Path $gameSaveFolder | |
$cloudSaveFolder = Join-Path $cloudFolder $path | |
$cloudSaveFolderExists = Test-Path $cloudSaveFolder | |
# Check if game folder exists | |
if ($gameSaveFolderExists) | |
{ | |
# Check if game folder is a valid symlink already | |
if ( | |
(Get-ItemProperty $gameSaveFolder).LinkType -eq 'SymbolicLink' -and | |
(Get-Item $gameSaveFolder).Target -eq $cloudSaveFolder | |
) | |
{ | |
Write-Host "INFO: $path is already a symlink to $cloudSaveFolder" | |
return | |
} | |
# Check if cloud folder exists | |
if (-not $cloudSaveFolderExists) | |
{ | |
# Cloud folder does not exist: | |
# Move game folder to cloud folder to keep existing data | |
Move-Item $gameSaveFolder $cloudSaveFolder | |
$cloudSaveFolderExists = $true | |
} | |
else | |
{ | |
# Cloud folder does exist: | |
# Backup game folder to use cloud folder without losing data | |
# Set game backup folder name | |
$gameSaveFolderBackupBase = Join-Path $gameFolder ($path + '_backup') | |
$gameSaveFolderBackup = $gameSaveFolderBackupBase | |
$i = 0 | |
while (Test-Path $gameSaveFolderBackup) { | |
# Game backup folder already exists, | |
# Increment index for unique backup folder name | |
$i++ | |
$gameSaveFolderBackup = $gameSaveFolderBackupBase + '_' + $i | |
} | |
# Rename Backup game save folder | |
Rename-Item $gameSaveFolder $gameSaveFolderBackup | |
Write-Host "INFO: Moved $path to $gameSaveFolderBackup" | |
} | |
} | |
# Create cloud save folder if it does not exist | |
if (-not $cloudSaveFolderExists) { | |
if ($directory) { | |
$null = New-Item -ItemType Directory -Path $cloudSaveFolder | |
} else { | |
$null = New-Item -ItemType File -Path $cloudSaveFolder | |
} | |
} | |
# Create symlink for save folder | |
$null = New-Item -ItemType SymbolicLink -Path $gameSaveFolder -Value $cloudSaveFolder | |
Write-Host "INFO: Created $path as symlink to $cloudSaveFolder" | |
} | |
# Handle directories | |
Create-Symlink -directory 'backups' | |
Create-Symlink -directory 'config' | |
Create-Symlink -directory 'crash-reports' | |
Create-Symlink -directory 'logs' | |
Create-Symlink -directory 'resourcepacks' | |
Create-Symlink -directory 'saves' | |
Create-Symlink -directory 'screenshots' | |
Create-Symlink -directory 'server-resource-packs' | |
Create-Symlink -directory 'shaderpacks' | |
# Handle files | |
Create-Symlink -file 'command_history.txt' | |
Create-Symlink -file 'debug.log' | |
Create-Symlink -file 'launcher_log.txt' | |
Create-Symlink -file 'nativelog.txt' | |
Create-Symlink -file 'options.txt' | |
Create-Symlink -file 'optionsof.txt' | |
Create-Symlink -file 'optionsshaders.txt' | |
Create-Symlink -file 'servers.dat' | |
Create-Symlink -file 'servers.dat_old' | |
Create-Symlink -file 'updateLog.txt' | |
Create-Symlink -file 'usercache.json' | |
Create-Symlink -file 'usernamecache.json' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment