De auteur houdt erg van het spel en is zelf de beheerder van een kleine server 'puur voor vrienden'. Zoals gebruikelijk onder liefhebbers, is de server volledig gemodificeerd, wat leidt tot instabiliteit en als gevolg daarvan crashes. Aangezien de auteur Powershell beter kent dan de lay-out van de winkels in zijn straat, besloot hij eenBeste Script Voor Het Starten Van Minecraft 2020'. Ditzelfde script heeft gediend als basis voor een sjabloon in . Maar alle bronnen zijn al in het artikel te vinden. Laten we nu stap voor stap bekijken hoe dit allemaal werd gedaan.
De benodigde commando's
Alternatieve logging
Toen ik nog een paar mods installeerde, ontdekte ik dat de server, zo lijkt het, zonder waarschuwing crasht. De server noteerde geen fouten in latest.log of debug, en de console, die in principe deze fout zou moeten schrijven en stoppen, was gesloten.
Als hij niet wil schrijven - dan hoeft het niet. We hebben Powershell met de cmdlet Tee-Object, die een object neemt en deze tegelijkertijd naar een bestand en naar de console uitvoert.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendOp deze manier zal Powershell de StandardOutput ophalen en deze naar een bestand schrijven. Probeer niet Start-Process, want dit zal System.ComponentModel.Component retourneren, en niet StandardOutput, en -RedirectStandardOutput maakt input in de console onmogelijk, wat we willen vermijden.
Startargumenten
Na het installeren van die paar mods merkte de auteur op dat de server bovendien niet genoeg RAM had. Dit betekent dat de startargumenten moeten worden gewijzigd. In plaats van ze elke keer in start.bat te wijzigen, die iedereen gebruikt, gebruik gewoon dit script.
Aangezien Tee-Object de StandardOutput alleen leest wanneer het uitvoerbare bestand 'zo direct' wordt aangeroepen, moeten we een ander script maken. Dit script zal Minecraft zelf starten. Laten we beginnen met de argumenten.
Om in de toekomst ultieme luiheid te bereiken, moet het script de startargumenten on-the-fly verzamelen. Laten we beginnen met het zoeken naar de laatste versie van forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Met sort-object zullen we altijd het object met het grootste getal kiezen, ongeacht hoeveel je daar plaatst. Ultieme luiheid.
Nu moet we de server geheugen toewijzen. Hiervoor nemen we de hoeveelheid systeemgeheugen en schrijven de som in een string.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"Correcte automatische herstart
De auteur heeft .bat-bestanden van anderen gezien, maar deze hielden geen rekening met de reden waarom de server was gestopt. Het is vervelend als je gewoon het mod-bestand moet wisselen of iets moet verwijderen?
Laten we nu de juiste herstart implementeren. De auteur kwam eerder vreemde scripts tegen die de server opnieuw opstarten, ongeacht waarom de server was gestopt. Wij zullen de exitcode gebruiken. Java gebruikt 0 als succesvolle beƫindiging, daar zullen we mee werken.
We creƫren eerst een functie die de server opnieuw opstart in het geval van een mislukte beƫindiging.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Het script blijft in een lus totdat de server op een correcte manier stopt via de console met de /stop-opdracht.
Als we alles willen automatiseren, is het ook goed om de startdatum, einddatum en de reden voor beƫindiging te registreren.
Daarom slaan we het resultaat van Start-Process op in een variabele. In het script ziet dat er als volgt uit:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruEn dan slaan we de resultaten op in een bestand. Dit is wat er in de variabele wordt teruggestuurd:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeDit kan gemakkelijk worden toegevoegd aan een bestand met behulp van Add-Content. Een beetje opgemaakte versie geeft ons dit script, dat we handler.ps1 noemen.
Add-Content -Value "Starttijd:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Exitcode:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Eindtijd:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Laten we nu het script voor het starten van de handler opstellen.
Correcte autostart
De auteur wil ƩƩn module gebruiken om verschillende versies van Minecraft vanuit elke locatie te starten, en ook logs in een specifieke map te kunnen opslaan.
Het probleem is dat het proces gestart moet worden door een gebruiker die is ingelogd op het systeem. Dit kan gedaan worden via het bureaublad of WinRm. Als de server wordt gestart onder het systeemaccount of zelfs de administrator, maar niet is ingelogd, dan kan Server.jar eula.txt niet eens lezen en opstarten.
We kunnen automatisch inloggen op het systeem door drie registersleutels toe te voegen.
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 SilentlyContinueDit is niet veilig. De gebruikersnaam en het wachtwoord worden hier in platte tekst opgegeven, dus je moet een aparte gebruiker aanmaken die toegang heeft op gebruikersniveau, of in een nog striktere groep. Het gebruik van de standaardbeheerder hiervoor wordt ten zeerste afgeraden.
We hebben auto-inloggen aangepakt. Nu moeten we een nieuwe taak voor de server registreren. We gaan het commando vanuit Powershell uitvoeren, dus het zal er als volgt uitzien:
$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 HighestLaten we de module samenstellen
Laten we alles in modules vormgeven die we later kunnen gebruiken. Alle code van de kant-en-klare scripts staat hier, importeer deze en gebruik ze.
Alles wat hierboven beschreven is, kun je afzonderlijk gebruiken als je niet wilt rommelen met modules.
Start-Minecraft
Laten we eerst een module maken die slechts een script uitvoert dat de standaarduitvoer zal luisteren en opslaan.
In het parameterblok vraagt het uit welke map de Minecraft moet worden uitgevoerd en waar het logbestand moet worden opgeslagen.
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-MinecraftEn Minecraft moet als volgt worden gestart:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Laten we nu overgaan naar de gebruiksklare Handler.ps1
Om ons script parameters te laten accepteren bij de aanroep, moeten we ook een parameterblok opgeven. Let op, het start Oracle Java; als je een andere distributie gebruikt, moet je het pad naar het uitvoerbare bestand aanpassen.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Starten van de goddelijke 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 "Starttijd:" $global:Process.StartTime
Write-host "Exitcode:" $global:Process.ExitCode
Write-host "Eindtijd:" $global:Process.ExitTime
Write-host "=============== Goddelijke game-server gestopt ============="
}
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
Register-Minecraft
Dit script herhaalt grotendeels Start-Minecraft, met uitzondering van het feit dat het alleen een nieuwe taak registreert. Het neemt dezelfde argumenten. De gebruikersnaam, als deze niet is opgegeven, wordt de huidige gebruiker gebruikt.
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-MinecraftRegister-Autologon
In het parameterblok accepteert het script de parameters Gebruikersnaam en Wachtwoord. Als de Gebruikersnaam niet is opgegeven, wordt de huidige gebruikersnaam gebruikt.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Gebruikersnaam voor autologon")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="Gebruikerswachtwoord")]
[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 stelt de automatische aanmelding van de gebruiker in."
}
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 is succesvol ingesteld."
}
Het uitvoeren van dit script ziet er als volgt uit:
Set-Autologon -Password "PlaintextPassword"Hoe te gebruiken
Laten we nu bekijken hoe de auteur zelf dit allemaal gebruikt. Hoe je een publieke Minecraft-server op Windows correct kunt opzetten. We beginnen bij het begin.
1. Een gebruiker aanmaken
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Een taak voor het uitvoeren van het script registreren
Je kunt registreren met de module, zo:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"Of gebruik maken van de standaard middelen:
$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 Highest3. Automatische aanmelding inschakelen en de machine opnieuw opstarten
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Afsluiting
De auteur heeft het script ook voor zichzelf gemaakt, dus hij staat open voor uw suggesties ter verbetering van het script. De auteur hoopt dat deze code voor jou tenminste minimaal nuttig was, en dat het artikel interessant is.
Bron: habr.com
