Det perfekta Minecraft-serverns startskript

Det perfekta Minecraft-serverns startskript

Författaren älskar spelet väldigt mycket, och han är själv administratör för en liten server "enbart för vänner." Som vanligt bland amatörer är allt på servern moddat, vilket medför instabilitet och som ett resultat kraschar. Eftersom författaren till Powershell vet bättre än var butikerna ligger på hans gata, bestämde han sig för att göra "Bästa skriptet för att lansera Minecraft 2020" Samma manus låg till grund för mallen i Ruvds marknadsplats. Men alla källor finns redan i artikeln. Nu, i ordning, hur allt gjordes.

De kommandon vi behöver

Alternativ loggning

En dag, efter att ha installerat ytterligare ett par mods, upptäckte jag att servern, tydligen, kraschade utan att förklara krig. Servern skrev inga fel i latest.log eller i debug, och konsolen, som i teorin borde ha skrivit detta fel och stoppats, stängdes.

Om han inte vill skriva behöver han inte. Vi har Powershell med cmdlet Tee-objekt, som tar ett objekt och matar ut det till en fil och till konsolen samtidigt.

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

På detta sätt kommer Powershell att plocka upp StandardOutput och skriva den till en fil. Försök inte använda Start-processeftersom det kommer att returnera System.ComponentModel.Component och inte StandardOutput, och -RedirectStandardOutput kommer att göra det omöjligt att komma in i konsolen, vilket är vad vi vill undvika.

Starta argument

Efter att ha installerat samma par mods, märkte författaren att servern inte heller hade tillräckligt med RAM. Och detta kräver att lanseringsargumenten ändras. Istället för att ändra dem varje gång i start.bat, som alla använder, använd bara det här skriptet.

Eftersom Tee-Object bara läser StandardOutput när den körbara filen heter "Just Like This", måste du göra ett annat skript. Det här skriptet kommer att lanseras av Minecraft själv. Låt oss börja med argumenten.

För att hänge sig åt ultimat lathet i framtiden måste manuset samla lanseringsargument i farten. För att göra detta, låt oss börja med att söka efter den senaste versionen förfalska.

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

Genom att använda sort-object tar vi alltid objektet med det största antalet, oavsett hur många av dem du lägger där. Ultimat lathet.

Nu måste du tilldela minne till servern. För att göra detta, ta mängden systemminne och skriv mängden i en sträng.

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

Korrekt automatisk omstart

Författaren har sett .bat-filer från andra personer, men de tog inte hänsyn till anledningen till att servern stoppades. Detta är obekvämt, vad händer om du bara behöver ändra mod-filen eller ta bort något?
Låt oss nu göra en ordentlig omstart. Författaren har tidigare stött på konstiga skript som startade om servern oavsett varför servern stängdes av. Vi kommer att använda exitcode. Java använder 0 som en framgång, så vi kommer att dansa härifrån.

Låt oss först skapa en funktion som startar om servern om den misslyckas.

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

Skriptet kommer att förbli i slingan tills servern stängs av normalt från sin egen konsol med kommandot /stop.

Om vi ​​bestämmer oss för att automatisera allt, skulle det vara trevligt att samla in startdatum, slutdatum och även orsaken till färdigställandet.

För att göra detta skriver vi resultatet av Start-Process i en variabel. I manuset ser det ut så här:

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

Och sedan skriver vi resultatet till en fil. Detta är vad som returneras till oss i variabeln:

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

Allt detta kan läggas till i en fil med Add-Content. Efter att ha kammat det lite får vi det här skriptet och låt oss kalla det handler.ps1.

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

Låt oss nu skapa ett skript som startar hanteraren.

Korrekt start

Författaren vill köra olika versioner av Minecraft från valfri sökväg i en modul, och även kunna lagra loggar i en specifik mapp.

Problemet är att processen måste startas av en användare som är inloggad i systemet. Detta kan göras via skrivbordet eller WinRm. Om du kör servern som systemanvändare eller till och med administratör, men inte loggar in, så kommer Server.jar inte ens kunna läsa eula.txt och starta.

Vi kan aktivera automatisk inloggning genom att lägga till tre poster i registret.

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

Det är inte säkert. Inloggningen och lösenordet anges här i klartext, så för att starta servern behöver du skapa en separat användare som har åtkomst på användarnivå, eller i en ännu smalare grupp. Det rekommenderas absolut inte att använda en standardadministratör för detta.

Vi löste den automatiska inloggningen. Nu måste du registrera en ny uppgift för servern. Vi kommer att köra kommandot från Powershell, så det kommer att se ut så här:

$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

Montering av modulen

Låt oss nu lägga in allt i moduler som kan användas senare. All kod för färdiga skript finns här, importera och använd.

Du kan använda allt som beskrivs ovan separat om du inte vill bry dig om moduler.

Starta-Minecraft

Låt oss först skapa en modul som inte gör något mer än att köra ett skript som lyssnar på och spelar in standardutdata.

I parameterblocket frågar han från vilken mapp han ska starta Minecraft och var loggen ska placeras.

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

Och du måste starta Minecraft så här:

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

Låt oss nu gå vidare till den färdiga Handler.ps1

För att vårt skript ska acceptera parametrar när det anropas måste vi också ange ett parameterblock. Observera att den kör Oracle Java, om du använder en annan distribution måste du ändra sökvägen till den körbara filen.

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

Registrera-Minecraft

Skriptet är praktiskt taget detsamma som Start-Minecraft, förutom att det bara registrerar en ny uppgift. Accepterar samma argument. Användarnamnet, om det inte anges, tar det nuvarande.

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

Registrera-Autologon

I parameterblocket accepterar skriptet parametrarna Användarnamn och Lösenord. Om användarnamn inte angavs används den aktuella användarens namn.

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."
 
}

Att köra det här skriptet ser ut så här:

Set-Autologon -Password "PlaintextPassword"

Hur man använder

Låt oss nu titta på hur författaren själv använder allt detta. Hur man korrekt distribuerar en offentlig Minecraft-server på Windows. Låt oss börja från början.

1. Skapa en användare

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

2. Registrera uppgiften för att köra skriptet

Du kan registrera dig med en modul som denna:

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

Eller använd standardverktyg:

$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. Aktivera automatisk inloggning och starta om maskinen

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

fullbordan

Författaren gjorde manuset, inklusive för sig själv, därför lyssnar han gärna på dina förslag för att förbättra manuset. Författaren hoppas att all denna kod var åtminstone minimal användbar för dig, och att artikeln var intressant.

Det perfekta Minecraft-serverns startskript

Källa: will.com

Lägg en kommentar