**Purpose**: This script was purpose-built for the homelab Minecraft servers in my homelab. It may need to be ported based on your own needs. ```powershell clear # ################################################# # # BUNNY LAB - MINECRAFT UPGRADE SCRIPT # # ################################################# # Function to display the banner function Show-Banner { Write-Host "#################################################" -ForegroundColor Cyan Write-Host "# BUNNY LAB - MINECRAFT UPGRADE SCRIPT #" -ForegroundColor Cyan Write-Host "#################################################" -ForegroundColor Cyan } # Function to get user input for the zip file function Get-ZipFileName { Write-Host "Step 1: Getting the zip file name from user input..." -ForegroundColor Yellow Write-Host "Please enter the name of the newest Minecraft ZIP file in the downloads folder (e.g., 'Server-Files-x.xx.zip'): " -ForegroundColor Yellow $zipFileName = Read-Host $zipFilePath = "C:\Users\nicole.rappe\Downloads\$zipFileName" # Check if the zip file exists in the Downloads folder Write-Host "Verifying if the specified ZIP file exists at: $zipFilePath" -ForegroundColor Yellow if (-not (Test-Path $zipFilePath)) { Write-Host "File not found! Please check the file name and try again." -ForegroundColor Red exit } Write-Host "ZIP file found: $zipFilePath" -ForegroundColor Green return $zipFilePath } # Function to unzip the file without nesting function Unzip-ServerFiles { param ( [string]$zipFilePath, [string]$destinationFolder ) Write-Host "Step 2: Unzipping the server files to: $destinationFolder" -ForegroundColor Yellow # Create a temporary folder for extraction $tempFolder = "$env:TEMP\MinecraftTemp" Write-Host "Creating temporary folder for extraction at: $tempFolder" -ForegroundColor Yellow # Remove the temporary folder if it exists, then recreate it if (Test-Path $tempFolder) { Write-Host "Temporary folder exists. Removing existing folder..." -ForegroundColor Yellow Remove-Item -Recurse -Force $tempFolder } New-Item -ItemType Directory -Path $tempFolder Write-Host "Unzipping new server files..." -ForegroundColor Green Expand-Archive -Path $zipFilePath -DestinationPath $tempFolder -Force Write-Host "Moving unzipped files to destination folder: $destinationFolder" -ForegroundColor Green # Move the contents of the temporary folder to the destination Get-ChildItem -Path $tempFolder -Recurse | Move-Item -Destination $destinationFolder -Force # Clean up the temporary folder Write-Host "Cleaning up temporary folder..." -ForegroundColor Yellow Remove-Item -Recurse -Force $tempFolder } # Function to copy specific files/folders from the old deployment function Copy-ServerData { param ( [string]$sourceFolder, [string]$destinationFolder ) Write-Host "Step 3: Copying server data from: $sourceFolder to: $destinationFolder" -ForegroundColor Yellow # Files to copy Write-Host "Copying essential files..." -ForegroundColor Yellow Copy-Item "$sourceFolder\eula.txt" "$destinationFolder\eula.txt" -Force Copy-Item "$sourceFolder\user_jvm_args.txt" "$destinationFolder\user_jvm_args.txt" -Force Copy-Item "$sourceFolder\ops.json" "$destinationFolder\ops.json" -Force Copy-Item "$sourceFolder\server.properties" "$destinationFolder\server.properties" -Force # Copy-Item "$sourceFolder\mods\ftbbackups2-neoforge-1.21-1.0.28.jar" "$destinationFolder\mods\ftbbackups2-neoforge-1.21-1.0.28.jar" -Force Copy-Item "$sourceFolder\config\ftbbackups2.json" "$destinationFolder\config\ftbbackups2.json" -Force Write-Host "Copying world data and backups folder..." -ForegroundColor Yellow # Folder to copy (recursively) Copy-Item "$sourceFolder\world" "$destinationFolder\world" -Recurse -Force # New-Item -ItemType SymbolicLink -Path "\backups" -Target "Z:\" } # Function to rename the old folder with the current date function Rename-OldServer { param ( [string]$oldFolderPath ) $currentDate = Get-Date -Format "MM-dd-yyyy" $backupFolderPath = "$oldFolderPath.backup.$currentDate" Write-Host "Step 4: Renaming old server folder to: $backupFolderPath" -ForegroundColor Yellow Rename-Item -Path $oldFolderPath -NewName $backupFolderPath Write-Host "Old server folder renamed to: $backupFolderPath" -ForegroundColor Green } # Function to rename the new deployment to 'ATM10' function Rename-NewServer { param ( [string]$newDeploymentPath, [string]$finalServerPath ) Write-Host "Step 5: Renaming new deployment folder to 'ATM10' at: $finalServerPath" -ForegroundColor Yellow Rename-Item -Path $newDeploymentPath -NewName $finalServerPath Write-Host "New server folder renamed to 'ATM10' at: $finalServerPath" -ForegroundColor Green } # Main Script Logic # Show banner Show-Banner # Variables for folder paths $oldServerFolder = "C:\Users\nicole.rappe\Desktop\Minecraft_Server\ATM10" $newDeploymentFolder = "C:\Users\nicole.rappe\Desktop\Minecraft_Server\ATM10_NewDeployment" $finalServerFolder = "C:\Users\nicole.rappe\Desktop\Minecraft_Server\ATM10" # Step 1: Get the zip file name from the user $zipFilePath = Get-ZipFileName # Step 2: Unzip the file to the new deployment folder without nesting Unzip-ServerFiles -zipFilePath $zipFilePath -destinationFolder $newDeploymentFolder # Step 3: Copy necessary files/folders from the old server Copy-ServerData -sourceFolder $oldServerFolder -destinationFolder $newDeploymentFolder # Step 4: Rename the old server folder with the current date Rename-OldServer -oldFolderPath $oldServerFolder # Step 5: Rename the new deployment folder to 'ATM10' Rename-NewServer -newDeploymentPath $newDeploymentFolder -finalServerPath $finalServerFolder # Step 6. Create Symbolic Link to Backup Drive Write-Host "Step 6: Create Symbolic Link to Backup Drive" -ForegroundColor Cyan cd "C:\Users\nicole.rappe\Desktop\Minecraft_Server\ATM10" cmd.exe /c mklink /D backups Z:\ # Step 7: Notify the user that the server is ready to launch Write-Host "Step 7: Server Ready to Launch!" -ForegroundColor Cyan Write-Host "Press any key to exit the script" [System.Console]::ReadKey($true) # Waits for a key press and doesn't display the pressed key clear ```