L'autor estima molt el joc, i ell mateix és l'administrador d'un petit servidor "purament per a amics". Com és habitual entre els aficionats, tot el que hi ha al servidor està modificat, i això comporta inestabilitat de treball i, com a conseqüència, una caiguda. Com que l'autor coneix Powershell millor que la ubicació de les botigues al seu carrer, va decidir fer "Millor guió per llançar Minecraft 2020". El mateix script va servir de base per a la plantilla
Les ordres que necessitem
Enregistrament alternatiu
Un cop instal·lat un parell de mods més, em vaig trobar que el servidor, pel que sembla, estava caient sense declarar la guerra. El servidor no va escriure errors a latest.log o debug, i la consola, que, en teoria, havia d'escriure aquest error i aturar-se, es va tancar.
Si no vols escriure, no ho facis. Tenim Powershell amb un cmdlet Tee-Objecte, que pren un objecte i l'envia a un fitxer i a la consola alhora.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Per tant, Powershell recollirà l'StandardOutput i l'escriurà en un fitxer. No intenteu fer servir procés d'inici, perquè retornarà un System.ComponentModel.Component, no un StandardOutput, i -RedirectStandardOutput farà que sigui impossible escriure a la consola, que és el que volem evitar.
Llançar Arguments
Després d'haver instal·lat el mateix parell de modificacions, l'autor es va adonar que el servidor tampoc tenia prou memòria RAM. I cal canviar els arguments de llançament. En lloc de canviar-los cada vegada a start.bat, que fa servir tothom, només cal que utilitzeu aquest script.
Com que Tee-Object llegeix StandardOutput només quan l'executable es diu "Així mateix", caldrà fer un script més. Aquest script executarà el propi Minecraft. Comencem pels arguments.
Per gaudir de la mandra definitiva en el futur, el guió ha de recollir arguments de llançament sobre la marxa. Per fer-ho, comencem per buscar la darrera versió forjar.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Amb sort-object , agafarem sempre l'objecte amb el nombre més gran, per molt que hi posis. Mandra definitiva.
Ara hem d'assignar memòria al servidor. Per fer-ho, prenem la quantitat de memòria del sistema i escrivim la seva quantitat a la cadena.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Reinici automàtic correcte
L'autor ha vist fitxers .bat d'altres persones, però no han tingut en compte el motiu pel qual es va aturar el servidor. És inconvenient, què passa si només necessiteu canviar el fitxer de modificacions o suprimir alguna cosa?
Ara fem un reinici correcte. L'autor anteriorment es va trobar amb scripts estranys que reiniciaven el servidor independentment del motiu pel qual s'havia sortit. Utilitzarem el codi de sortida. Java utilitza 0 com a èxit, així que ballem a partir d'aquí.
Primer, creem una funció que reiniciarà el servidor si falla.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
L'script romandrà en el bucle fins que el servidor surti normalment de la seva pròpia consola mitjançant l'ordre /stop.
Si decidim automatitzar-ho tot, seria bo recollir la data de llançament, finalització i també el motiu del final.
Per fer-ho, escrivim el resultat de Start-Process en una variable. En un script es veu així:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
I després escriviu els resultats en un fitxer. Aquí teniu el que ens retorna en una variable:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Tot això es pot afegir al fitxer mitjançant Add-Content. Després d'haver raspallat una mica, obtenim aquest script, però l'anomenem 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
Ara dissenyem l'script amb el llançament del controlador.
Càrrega automàtica adequada
L'autor vol executar minecraft de diverses versions des de qualsevol camí amb un mòdul i també poder posar els registres en una carpeta específica.
El problema és que el procés l'ha d'iniciar un usuari que hagi iniciat sessió. Això es pot fer a través de l'escriptori o WinRm. Si executeu el servidor com a sistema o fins i tot com a administrador, però no inicieu sessió, Server.jar ni tan sols podrà llegir eula.txt i començar.
Podem habilitar l'inici de sessió automàtic afegint tres entrades al registre.
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
No és segur. L'inici de sessió i la contrasenya s'indiquen aquí amb el text sense format, per tant, per iniciar el servidor, cal crear un usuari independent que tingui accés a nivell d'usuari o en un grup encara més reduït. No es recomana utilitzar l'administrador estàndard per a això.
Hem descobert l'inici de sessió automàtic. Ara heu de registrar una tasca nova per al servidor. Executarem l'ordre des de Powershell, de manera que quedarà així:
$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
Muntatge del mòdul
Ara anem a organitzar-ho tot en mòduls que es poden utilitzar més tard. Tot el codi dels scripts ja fets és aquí, importa i utilitza.
Podeu utilitzar tot el que s'ha descrit anteriorment per separat si no voleu molestar-vos amb els mòduls.
iniciar minecraft
Primer, fem un mòdul que no farà res més que executar un script que escolti i escrigui a la sortida estàndard.
Al bloc de paràmetres, pregunta des de quina carpeta llançar minecraft i on posar el registre.
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
I haureu d'executar minecraft així:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Ara passem al Handler.ps1 llest per utilitzar
Perquè el nostre script accepti paràmetres quan es crida, també hem d'especificar un bloc de paràmetres. Tingueu en compte que executa Oracle Java, si feu servir una distribució diferent, haureu de canviar el camí al fitxer executable.
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
registrar minecraft
L'script és pràcticament el mateix que Start-Minecraft, excepte que només registra una tasca nova. Accepta els mateixos arguments. El nom d'usuari, si no s'especifica, pren l'actual.
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
Registre-inici de sessió automàtic
Al bloc de paràmetres, l'script accepta els paràmetres Nom d'usuari i Contrasenya. Si no s'especifica Nom d'usuari, s'utilitza el nom de l'usuari actual.
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."
}
L'execució d'aquest script té aquest aspecte:
Set-Autologon -Password "PlaintextPassword"
Com s'utilitza
Ara considereu com el propi autor utilitza tot això. Com implementar correctament un servidor públic de Minecraft a Windows. Comencem des del principi.
1. Creeu un usuari
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Registreu la tasca per executar l'script
Podeu registrar-vos amb un mòdul com aquest:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
O utilitzeu les eines estàndard:
$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. Activeu l'inici de sessió automàtic i reinicieu la màquina
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Terminació
L'autor va fer el guió, inclòs per ell mateix, per tant, estarà encantat d'escoltar els vostres suggeriments per millorar el guió. L'autor espera que tot aquest codi sigui almenys mínimament útil per a vostè, i l'article és interessant.
Font: www.habr.com