Den ideale Minecraft Server Startup Skript

Den ideale Minecraft Server Startup Skript

Den Auteur huet d'Spill ganz gär, an hie selwer ass den Administrateur vun engem klenge Server "reng fir Frënn." Wéi üblech bei Amateuren ass alles um Server moddéiert, an dëst bréngt Instabilitéit an, als Resultat, Crashen. Well den Auteur vu Powershell besser weess wéi d'Location vun de Geschäfter op senger Strooss, huet hien decidéiert "Bescht Skript fir Minecraft 2020 ze starten" Datselwecht Skript huet als Basis fir d'Schabloun gedéngt Ruvds Maartplaz. Awer all Quelle si schonn am Artikel. Elo, an Uerdnung, wéi et alles gemaach gouf.

D'Befehle déi mir brauchen

Alternativ Logbicher

Enges Daags, nodeems ech e puer méi Mods installéiert hunn, hunn ech entdeckt datt de Server, anscheinend, ofbriechen ouni Krich ze deklaréieren. De Server huet keng Feeler am latest.log oder am Debug geschriwwen, an d'Konsole, déi an der Theorie dëse Feeler geschriwwen a gestoppt hätt, gouf zougemaach.

Wann hien net wëllt schreiwen, brauch hien net. Mir hunn Powershell mat cmdlet Tee-Objet, deen en Objet hëlt an et zur selwechter Zäit an eng Datei an op d'Konsole ausgëtt.

.handler.ps1 | Tee-Object .StandardOutput.txt -Append

Op dës Manéier wäert Powershell de StandardOutput ophuelen an en an eng Datei schreiwen. Probéiert net ze benotzen Start-Prozesswell et System.ComponentModel.Component zréckkënnt an net StandardOutput, an -RedirectStandardOutput wäert et onméiglech maachen an d'Konsole anzeginn, wat mir wëllen vermeiden.

Argumenter starten

No der Installatioun vun deemselwechte Pair vu Mods, huet den Auteur gemierkt datt de Server och net genuch RAM huet. An dëst erfuerdert d'Startargumenter z'änneren. Amplaz se all Kéier an start.bat z'änneren, déi jidderee benotzt, benotzt just dëse Skript.

Zënter Tee-Object nëmmen StandardOutput liest wann den Ausféierbar "Just Like This" genannt gëtt, musst Dir en anert Skript maachen. Dëse Skript gëtt vu Minecraft selwer lancéiert. Fänke mer mat den Argumenter un.

Fir sech an der Zukunft un ultimativ Faulegkeet ze verwinnen, muss de Skript Startargumenter op der Flucht sammelen. Fir dëst ze maachen, loosst eis ufänken no der leschter Versioun ze sichen geknackt.

$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1

Mat Sort-Objet wäerte mir ëmmer den Objet mat der gréisst Zuel huelen, egal wéivill Dir do setzt. Ultimate Laziness.

Elo musst Dir Erënnerung un de Server zouginn. Fir dëst ze maachen, huelt d'Quantitéit vum System Erënnerung a schreift säi Betrag an der String.

$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"

Korrekt automatesch Restart

Den Auteur huet .bat Dateien vun anere Leit gesinn, awer si hunn de Grond net berücksichtegt firwat de Server gestoppt gouf. Dëst ass onbequem, wat wann Dir just d'Moddatei änneren musst oder eppes läschen?
Loosst eis elo e richtege Restart maachen. Den Auteur huet virdru komesch Scripte begéint, déi de Server nei gestart hunn, egal firwat de Server zougemaach gouf. Mir wäerten Exitcode benotzen. Java benotzt 0 als Erfolleg, also wäerte mir vun hei danzen.

Als éischt, loosst eis eng Funktioun erstellen déi de Server nei start wann et klappt.

function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Write-Log
            Restart-Minecraft
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}

De Skript bleift an der Loop bis de Server normalerweis aus senger eegener Konsole mat dem /stop Kommando ausschalt.

Wa mir décidéieren alles ze automatiséieren, da wier et flott den Startdatum, den Ofschlossdatum an och de Grond fir d'Réalisatioun ze sammelen.

Fir dëst ze maachen, schreiwen mir d'Resultat vum Start-Process an eng Variabel. Am Skript gesäit et esou aus:

$global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru

An da schreiwen mir d'Resultater an e Fichier. Dëst ass wat eis an der Variabel zréckgeet:

$global:Process.StartTime
$global:Process.ExitCode	
$global:Process.ExitTime

All dëst kann op eng Datei bäigefüügt ginn andeems Dir Add-Content benotzt. Nodeems mir et e bësse gekämmt hunn, kréien mir dëst Skript, a loosse mer et Handler.ps1 nennen.

Add-Content -Value "Start time:" -Path $Logfile 
$global:Process.StartTime
 
Add-Content -Value "Exit code:" -Path $Logfile 
$global:Process.ExitCode | Add-Content $Logfile
    
Add-Content -Value "Exit time:" -Path $Logfile 
$global:Process.ExitTime | Add-Content $Logfile

Loosst eis elo e Skript erstellen deen den Handler lancéiert.

Korrekt Startup

Den Auteur wëll verschidde Versioune vu Minecraft aus all Wee an engem Modul ausféieren, an och kënnen Logbicher an engem spezifeschen Dossier späicheren.

De Problem ass datt de Prozess vun engem Benotzer gestart muss ginn, deen op de System ageloggt ass. Dëst kann iwwer den Desktop oder WinRm gemaach ginn. Wann Dir de Server als System Benotzer oder souguer en Administrateur lafen, awer net aloggen, dann Server.jar net emol kënnen eula.txt ze liesen an ufänken.

Mir kënnen automatesch Login aktivéieren andeems Dir dräi Entréen an de Registry bäidréit.

New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password  -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue

Et ass net sécher. De Login a Passwuert ginn hei am Kloertext uginn, also fir de Server unzefänken musst Dir e separate Benotzer erstellen deen Zougang um Benotzerniveau huet, oder an enger nach méi schmueler Grupp. Et ass strikt net recommandéiert e Standard Administrateur fir dëst ze benotzen.

Mir hunn den Auto-Login ausgeriicht. Elo musst Dir eng nei Aufgab fir de Server registréieren. Mir lafen de Kommando vu Powershell, sou datt et esou ausgesäit:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

Montage vum Modul

Loosst eis elo alles a Moduler setzen déi spéider benotzt kënne ginn. All Code fir fäerdeg Scripten ass hei, importéiert a benotzt.

Dir kënnt alles uewen beschriwwen separat benotzen wann Dir net mat Moduler beméie wëllt.

Start-Minecraft

Als éischt, loosst eis e Modul erstellen deen näischt méi mécht wéi e Skript auszeféieren deen nolauschtert an de Standardoutput ophëlt.

Am Parameterblock freet hien aus wéi engem Dossier Minecraft ze starten a wou de Log ze setzen.

Set-Location (Split-Path $MyInvocation.MyCommand.Path)
function Start-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]
        $Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $MinecraftPath
 
    )
    powershell.exe -file .handler.ps1 -type $type -MinecraftPath $MinecraftPath | Tee-Object $LogFile -Append
}
Export-ModuleMember -Function Start-Minecraft

An Dir musst Minecraft esou starten:

Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"

Loosst eis elo op de prett-ze-benotzen Handler.ps1

Fir datt eise Skript Parameteren akzeptéiere wann se genannt ginn, musse mir och e Parameterblock spezifizéieren. Notéiert w.e.g., et leeft Oracle Java, wann Dir eng aner Verdeelung benotzt, musst Dir de Wee op déi ausführbar Datei änneren.

param (
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$type,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$MinecraftPath,
 
    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string]$StandardOutput
)
 
Set-Location $MinecraftPath
 
function Restart-Minecraft {
 
    Write-host "=============== Starting godlike game server ============"
 
    $forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -first 1
 
    $ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
    $xmx = "-Xms" + $ram + "G"
    $global:Process = Start-Process -FilePath  "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
    
}
 
function Write-Log {
    Write-host "Start time:" $global:Process.StartTime
 
    Write-host "Exit code:" $global:Process.ExitCode
    
    Write-host "Exit time:" $global:Process.ExitTime
 
    Write-host "=============== Stopped godlike game server ============="
}
 
function Get-MinecraftExitCode {
   
    do {
        
        if ($global:Process.ExitCode -ne 0) {
            Restart-Minecraft
            Write-Log
        }
        else {
            Write-Log
        }
 
    } until ($global:Process.ExitCode -eq 0)
    
}
 
Get-MinecraftExitCode

Aschreiwen-Minecraft

De Skript ass praktesch d'selwecht wéi Start-Minecraft, ausser datt et nëmmen eng nei Aufgab registréiert. Akzeptéiert déiselwecht Argumenter. De Benotzernumm, wann net uginn, hëlt den aktuellen.

function Register-Minecraft {
    [CmdletBinding()]
    param (
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]
        $LogFile,
 
        [Parameter(Mandatory)]  
        [ValidateSet('Vanilla', 'Forge')]
        [ValidateNotNullOrEmpty()]
        [string]$Type,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$MinecraftPath,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$User,
 
        [Parameter(Mandatory)]
        [string]$TaskName = $env:USERNAME
    )
 
    $Trigger = New-ScheduledTaskTrigger -AtLogOn
    $arguments = "Start-Minecraft -Type $Type -LogFile $LogFile -MinecraftPath $MinecraftPath"
    $PS = New-ScheduledTaskAction -Execute "PowerShell" -Argument "-noexit -command $arguments"
    Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
    
}
 
Export-ModuleMember -Function Register-Minecraft

Aschreiwen-Autologon

Am Parameterblock akzeptéiert de Skript d'Benotzernumm a Passwuert Parameteren. Wann de Benotzernumm net uginn ass, gëtt den aktuelle Benotzernumm benotzt.

function Set-Autologon {
 
    param (
        [Parameter(
        HelpMessage="Username for autologon")]
        $Username = $env:USERNAME,
 
        [Parameter(Mandatory=$true,
        HelpMessage="User password")]
        [ValidateNotNullOrEmpty()]
        $Password
    )
 
    $i = Get-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon"
 
    if ($null -eq $i) {
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password 
        New-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
        Write-Verbose "Set-Autologon will enable user auto logon."
 
    }
    else {
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultUserName -Value $Username
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name DefaultPassword -Value $Password
        Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" -Name AutoAdminLogon -Value 1
    }
 
    
    Write-Verbose "Autologon was set successfully."
 
}

Dëse Skript auszeféieren gesäit esou aus:

Set-Autologon -Password "PlaintextPassword"

Wéi benotzen

Elo kucke mer wéi den Auteur selwer dat alles benotzt. Wéi richteg en ëffentleche Minecraft Server op Windows z'installéieren. Loosst eis vun Ufank un ufänken.

1. Schafen engem Benotzer

$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword

2. Registréiert d'Aufgab fir de Skript ze lafen

Dir kënnt Iech mat engem Modul wéi dësen aschreiwen:

Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"

Oder benotzt Standard Tools:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

3. Aktivéiert Auto-Login an Restart der Maschinn

Set-Autologon -Username "MinecraftServer" -Password "Qw3"

Komplett

Den Auteur huet d'Skript gemaach, och fir sech selwer, dofir wäert hie gär op Är Virschléi lauschteren fir de Skript ze verbesseren. Den Auteur hofft datt all dëse Code op d'mannst minimal nëtzlech fir Iech war, an datt den Artikel interessant war.

Den ideale Minecraft Server Startup Skript

Source: will.com

Setzt e Commentaire