Författaren Àlskar verkligen spelet och Àr sjÀlv administratör för en liten server "bara för vÀnner". Som vanligt bland entusiaster Àr allt moddat pÄ servern, vilket leder till instabilitet och dÀrmed krasch. Eftersom författaren kÀnner Powershell bÀttre Àn han kÀnner till butikerna pÄ sin gata, bestÀmde han sig för att skapa "BÀsta Skriptet För Att Starta Minecraft 2020'. Detta skript blev ocksÄ grunden för en mall i . Men alla kÀllord finns redan i artikeln. Nu gÄr vi igenom steg för steg hur allt gjordes.
De kommandon vi behöver
Alternativ loggning
En gÄng nÀr jag installerade nÄgra fler mods upptÀckte jag att servern, tydligen, kraschade utan förvarning. Servern skrev inga fel i latest.log eller i debug, och konsolen, som borde ha skrivit detta fel och stoppat, var stÀngd.
Vill inte skriva â ingen fara. Vi har Powershell med cmdlet Tee-Object, som tar ett objekt och skriver ut det till en fil och till konsolen samtidigt.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendPÄ sÄ sÀtt kommer Powershell att hÀmta StandardOutput och skriva det till en fil. Försök inte anvÀnda Start-Process, eftersom det kommer att returnera System.ComponentModel.Component, istÀllet för StandardOutput, och -RedirectStandardOutput gör det omöjligt att mata in i konsolen, vilket vi vill undvika.
Körningsargument
NÀr författaren installerat de nÀmnda modsen, mÀrkte han att servern dessutom saknade tillrÀckligt med RAM. Det innebÀr att man behöver Àndra körningsargumenten. IstÀllet för att Àndra dem varje gÄng i start.bat, som alla anvÀnder, anvÀnd bara detta skript.
Eftersom Tee-Object lÀser StandardOutput, endast nÀr den körbara filen anropas "Precis sÄ", mÄste vi skapa ett till skript. Detta skript kommer att starta sjÀlva Minecraft. LÄt oss börja med argumenten.
För att i framtiden njuta av ultimat lathet mÄste skriptet samla körningsargumenten i farten. För detta börjar vi med att hitta den senaste versionen av forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Genom att anvÀnda sort-object kommer vi alltid ta objektet med det högsta numret, oavsett hur mÄnga du lÀgger dit. Ultimat lathet.
Nu behöver vi tilldela minne till servern. För detta tar vi mÀngden systemminne och skriver ut summan som 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 stÀngdes. Det Àr besvÀrligt, kan man bara byta modfil eller ta bort nÄgot?
Nu ska vi göra en korrekt omstart. Författaren har tidigare stött pÄ konstiga skript som omstartade servern oavsett varför servern slutade. Vi kommer att anvÀnda exitcode. Java anvÀnder 0 som en framgÄngsrik avslutning, sÄ vi utgÄr frÄn det.
Först skapar vi en funktion som kommer att omstarta servern om den avslutas pÄ ett olyckligt sÀtt.
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 en loop tills servern avslutar jobbet normalt frÄn sin egen konsol, med kommandot /stop.
Om vi ska automatisera allt, kan vi lika gÀrna samla in starttid, sluttid samt anledningen till att den avslutades.
För detta registrerar vi resultatet av Start-Process i en variabel. I skriptet 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 -PassThruSedan skriver vi resultaten i en fil. HÀr Àr vad som returneras till variabeln:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeAllt detta kan lÀggas till i en fil med hjÀlp av Add-Content. Efter att ha snyggat till det fÄr vi ett skript som vi kallar handler.ps1.
Add-Content -Value "Starttid:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Exitkod:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Avslutningstid:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Nu lĂ„t oss strukturera skriptet för att köra handlerân.
Korrekt automatisk start
Författaren vill ha en modul som startar Minecraft i olika versioner frÄn vilken plats som helst, samt möjligheten att 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 man startar servern som systemet eller till och med administratören, men inte Àr inloggad, 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 SilentlyContinueDet Àr osÀkert. AnvÀndarnamn och lösenord anges hÀr i klartext, sÄ för att köra servern bör en separat anvÀndare skapas som har anvÀndarbehörighet, eller Ànnu mer begrÀnsad tillgÄng. Att anvÀnda den vanliga administratören för detta rekommenderas starkt inte.
Vi har löst autoinloggningen. Nu behöver vi registrera en ny uppgift för servern. Vi kommer att köra kommandot frÄn Powershell, sÄ hÀr ser det ut:
$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 HighestVi sammanstÀller modulen
Nu lÄt oss ordna allt i moduler som vi sedan kan anvÀnda. Hela koden för de fÀrdiga skripten finns hÀr, importera och anvÀnd.
Allt ovanstÄende kan du anvÀnda separat om du inte vill krÄngla med moduler.
Start-Minecraft
Först kommer vi att göra en modul som bara kommer att köra ett skript som lyssnar och registrerar standardutdata.
I parameterblocket frÄgar den vilken mapp Minecraft ska startas frÄn och vart loggen ska sparas.
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-MinecraftOch Minecraft mÄste startas sÄ hÀr:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Nu gÄr vi vidare till den fÀrdiga Handler.ps1
För att vÄrt skript ska kunna ta emot parametrar vid anropet mÄste vi ocksÄ ange en parameterblock. Observera att det startar Oracle Java; om du anvÀnder en annan distribution mÄste sökvÀgen till exekverbara filen Àndras.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Startar spelserver med hög prestanda ============"
$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 "Starttid:" $global:Process.StartTime
Write-host "UtgÄngskod:" $global:Process.ExitCode
Write-host "Sluttid:" $global:Process.ExitTime
Write-host "=============== Stoppade spelserver med hög prestanda ============="
}
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
Skriptet upprepar praktiskt taget Start-Minecraft, med undantag för att det endast registrerar en ny uppgift. Det tar samma argument. AnvÀndarnamnet, om det inte anges, tas frÄn den aktuella anvÀndaren.
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
I parameterblocket tar skriptet in parametern AnvÀndarnamn och Lösenord. Om AnvÀndarnamn inte anges anvÀnds det aktuella anvÀndarnamnet.
funktion Set-Autologon {
param (
[Parameter(
HelpMessage="AnvÀndarnamn för autologon")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="AnvÀndarlösenord")]
[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 kommer att aktivera anvÀndarens automatiska inloggning."
}
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 har stÀllts in framgÄngsrikt."
}
Att köra detta skript ser ut sÄ hÀr:
Set-Autologon -Password "PlaintextPassword"Hur man anvÀnder
LÄt oss nu gÄ igenom hur författaren verkligen anvÀnder allt detta. Hur man korrekt sÀtter upp en offentlig Minecraft-server pÄ Windows. Vi börjar frÄn början.
1. Skapa en anvÀndare
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Registrera en uppgift för att köra skriptet
Du kan registrera det med hjÀlp av modulen, sÄ hÀr:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"Eller anvÀnda standardverktygen:
$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. Aktivera automatisk inloggning och starta om maskinen
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Avslutning
Författaren skapade skriptet, inklusive för sig sjÀlv, sÄ han lyssnar gÀrna pÄ dina förslag för att förbÀttra skriptet. Författaren hoppas att hela denna kod var Ätminstone minimalt anvÀndbar för dig och att artikeln var intressant.
KĂ€lla: habr.com
