рдЖрджрд░реНрд╢ Minecraft рд╕рд░реНрднрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рдЖрджрд░реНрд╢ Minecraft рд╕рд░реНрднрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рд▓реЗрдЦрдХрд▓реЗ рдЦреЗрд▓рд▓рд╛рдИ рдзреЗрд░реИ рдорд╛рдпрд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рд░ рдЙрд╣рд╛рдБ рдЖрдлреИрдВ "рд╕рд╛рдереАрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдкреВрд░реНрдг рд░реВрдкрдорд╛" рд╕рд╛рдиреЛ рд╕рд░реНрднрд░рдХреЛ рдкреНрд░рд╢рд╛рд╕рдХ рд╣реБрдиреБрд╣реБрдиреНрдЫред рдПрдореЗрдЪреНрдпреЛрд░рд╣рд░реВ рдмреАрдЪрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛, рд╕рд░реНрднрд░рдорд╛ рд╕рдмреИ рдХреБрд░рд╛ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдпрд╕рд▓реЗ рдЕрд╕реНрдерд┐рд░рддрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреНрд░реНрдпрд╛рд╕ рд╣реБрдиреНрдЫред рдкрд╛рд╡рд░рд╢реЗрд▓рдХрд╛ рд▓реЗрдЦрдХрд▓рд╛рдИ рдЙрдирдХреЛ рд╕рдбрдХрдорд╛ рдкрд╕рд▓рд╣рд░реВрдХреЛ рд╕реНрдерд╛рди рднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдерд╛рд╣рд╛ рднрдПрдХреЛрд▓реЗ, рдЙрдирд▓реЗ "рдмрдирд╛рдЙрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗредMinecraft реирежреиреж рд╕реБрд░реБ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрддреНрддрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ" рдПрдЙрдЯреИ рд▓рд┐рдкрд┐рд▓реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯрдХреЛ рдЖрдзрд╛рд░рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдпреЛ Ruvds рдмрдЬрд╛рд░ред рддрд░ рд╕рдмреИ рд╕реНрд░реЛрддрд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рд▓реЗрдЦрдорд╛ рдЫрдиреНред рдЕрдм, рдХреНрд░рдо рдорд╛, рдпреЛ рд╕рдмреИ рдХрд╕рд░реА рдЧрд░рд┐рдпреЛред

рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреЗ рдЖрджреЗрд╢рд╣рд░реВ

рд╡реИрдХрд▓реНрдкрд┐рдХ рд▓рдЧрд┐рдЩ

рдПрдХ рджрд┐рди, рдХреЗрд╣рд┐ рдердк рдореЛрдбрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрдкрдЫрд┐, рдореИрд▓реЗ рдкрддреНрддрд╛ рд▓рдЧрд╛рдП рдХрд┐ рд╕рд░реНрднрд░, рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдпреБрджреНрдз рдШреЛрд╖рдгрд╛ рдирдЧрд░реА рдХреНрд░реНрдпрд╛рд╕ рднрдЗрд░рд╣реЗрдХреЛ рдерд┐рдпреЛред рд╕рд░реНрднрд░рд▓реЗ latest.log рд╡рд╛ рдбрд┐рдмрдЧрдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рд▓реЗрдЦреЗрдХреЛ рдЫреИрди, рд░ рдХрдиреНрд╕реЛрд▓, рдЬреБрди рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛ рдпреЛ рддреНрд░реБрдЯрд┐ рд▓реЗрдЦреНрдиреБрдкрд░реНрдиреЗ рдерд┐рдпреЛ рд░ рд░реЛрдХрд┐рдПрдХреЛ рдерд┐рдпреЛ, рдмрдиреНрдж рднрдпреЛред

рдпрджрд┐ рдЙрдиреА рд▓реЗрдЦреНрди рдЪрд╛рд╣рдБрджреИрдирдиреН рднрдиреЗ, рдЙрд╕рд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред рд╣рд╛рдореАрд╕рдБрдЧ cmdlet рд╕рдБрдЧ Powershell рдЫ Tee-рд╡рд╕реНрддреБ, рдЬрд╕рд▓реЗ рд╡рд╕реНрддреБ рд▓рд┐рдиреНрдЫ рд░ рдлрд╛рдЗрд▓ рд░ рдХрдиреНрд╕реЛрд▓рдорд╛ рдПрдХреИ рд╕рдордпрдорд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрджрдЫред

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

рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ, Powershell рд▓реЗ StandardOutput рдЙрдард╛рдЙрдиреЗрдЫ рд░ рдлрд╛рдЗрд▓рдорд╛ рд▓реЗрдЦреНрдиреЗрдЫред рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕реБрд░реБ-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ System.ComponentModel.Component рдлрд░реНрдХрд╛рдЙрдиреЗрдЫ рд░ StandardOutput рд╣реЛрдЗрди, рд░ -RedirectStandardOutput рд▓реЗ рдХрдиреНрд╕реЛрд▓рдорд╛ рдкреНрд░рд╡реЗрд╢ рдЧрд░реНрди рдЕрд╕рдореНрднрд╡ рдмрдирд╛рдЙрдиреЗрдЫ, рдЬреБрди рд╣рд╛рдореА рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред

рддрд░реНрдХрд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдЙрд╣реА рдЬреЛрдбреА рдореЛрдбрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрдкрдЫрд┐, рд▓реЗрдЦрдХрд▓реЗ рд╕рд░реНрднрд░рдорд╛ рдкрд░реНрдпрд╛рдкреНрдд RAM рдирднрдПрдХреЛ рдпрд╛рдж рдЧрд░реЗред рд░ рдпреЛ рд▓рдиреНрдЪ рддрд░реНрдХрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣рд░реЗрдХ рдкрдЯрдХ start.bat рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛, рдЬреБрди рд╕рдмреИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдХреЗрд╡рд▓ рдпреЛ рд▓рд┐рдкрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдХрд┐рдирдХреА Tee-Object рд▓реЗ StandardOutput рдорд╛рддреНрд░ рдкрдвреНрдЫ рдЬрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп "Just Like This" рднрдирд┐рдиреНрдЫ, рддрдкрд╛рдИрд▓реЗ рдЕрд░реНрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдЙрдиреБ рдкрд░реНрдиреЗрдЫред рдпреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ Minecraft рдЖрдлреИрд▓реЗ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫред рддрд░реНрдХрд╣рд░реБ рд╕рдВрдЧ рд╕реБрд░реБ рдЧрд░реМрдВред

рднрд╡рд┐рд╖реНрдпрдорд╛ рдкрд░рдо рдЖрд▓рд╕реНрдпрдорд╛ рд▓рд┐рдкреНрдд рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐, рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓реЗ рдЙрдбрд╛рдирдорд╛ рд▓рдиреНрдЪ рддрд░реНрдХрд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЦреЛрдЬреА рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реМрдВ рдлреЛрд░реНрдЬ.

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

рдХреНрд░рдордмрджреНрдз-рд╡рд╕реНрддреБ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореАрд▓реЗ рдЬрд╣рд┐рд▓реЗ рдкрдирд┐ рд╕рдмреИрднрдиреНрджрд╛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рд╡рд╕реНрддреБ рд▓рд┐рдиреЗрдЫреМрдВ, рддрдкрд╛рдИрдВрд▓реЗ рддреНрдпрд╣рд╛рдБ рдЬрддрд┐рд╕реБрдХреИ рд░рд╛рдЦреНрдиреБрднрдПрдХреЛ рднрдП рдкрдирд┐ред рдкрд░рдо рдЖрд▓рд╕реНрдпред

рдЕрдм рддрдкрд╛рдИрдВрд▓реЗ рд╕рд░реНрднрд░рдорд╛ рдореЗрдореЛрд░реА рдЕрд╕рд╛рдЗрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐, рдкреНрд░рдгрд╛рд▓реА рдореЗрдореЛрд░реАрдХреЛ рдорд╛рддреНрд░рд╛ рд▓рд┐рдиреБрд╣реЛрд╕реН рд░ рд╕реНрдЯреНрд░рд┐рдЩрдорд╛ рдпрд╕рдХреЛ рдорд╛рддреНрд░рд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реНред

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

рд╕рд╣реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд▓реЗрдЦрдХрд▓реЗ рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрдмрд╛рдЯ .bat рдлрд╛рдЗрд▓рд╣рд░реВ рджреЗрдЦреЗрдХрд╛ рдЫрдиреН, рддрд░ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕рд░реНрднрд░ рдмрдиреНрдж рднрдПрдХреЛ рдХрд╛рд░рдгрд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреЗрдХрд╛ рдЫреИрдирдиреНред рдпреЛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ, рдпрджрд┐ рддрдкрд╛рдЗрдБ рдХреЗрд╡рд▓ рдореЛрдб рдлрд╛рдЗрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╡рд╛ рдХреЗрд╣рд┐ рдореЗрдЯрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ?
рдЕрдм рдПрдХ рдЙрдЪрд┐рдд рдкреБрди: рд╕реБрд░реБ рдЧрд░реМрдВред рд▓реЗрдЦрдХрд▓реЗ рдкрд╣рд┐рд▓реЗ рдЕрдиреМрдареЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВ рднреЗрдЯреНрдЯрд╛рдП рдЬреБрди рд╕рд░реНрднрд░ рдХрд┐рди рдмрдиреНрдж рднрдП рдкрдирд┐ рд╕рд░реНрднрд░ рдкреБрди: рд╕реБрд░реБ рднрдпреЛред рд╣рд╛рдореА exitcode рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред Java рд▓реЗ 0 рд▓рд╛рдИ рд╕рдлрд▓рддрд╛рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╣рд╛рдБрдмрд╛рдЯ рдирд╛рдЪреНрдиреЗрдЫреМрдВред

рдкрд╣рд┐рд▓реЗ, рдПрдЙрдЯрд╛ рдкреНрд░рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ рдЬреБрди рдЕрд╕рдлрд▓ рднрдПрдорд╛ рд╕рд░реНрднрд░ рдкреБрди: рд╕реБрд░реБ рд╣реБрдиреЗрдЫред

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

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реБрдкрдорд╛ рд░рд╣рдиреЗрдЫ рдЬрдмрд╕рдореНрдо рд╕рд░реНрднрд░рд▓реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдЖрдлреНрдиреИ рдХрдиреНрд╕реЛрд▓рдмрд╛рдЯ / рдмрдиреНрдж рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдмрдиреНрдж рд╣реБрдБрджреИрдиред

рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ рднрдиреЗ, рд╕реБрд░реБ рд╣реБрдиреЗ рдорд┐рддрд┐, рдкреВрд░рд╛ рд╣реБрдиреЗ рдорд┐рддрд┐, рд░ рдкреВрд░рд╛ рд╣реБрдиреЗ рдХрд╛рд░рдг рдкрдирд┐ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫред

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рд╕реНрдЯрд╛рд░реНрдЯ-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдирддрд┐рдЬрд╛рд▓рд╛рдИ рдЪрд░рдорд╛ рд▓реЗрдЦреНрдЫреМрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ рдпреЛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

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

рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдкрд░рд┐рдгрд╛рдо рдлрд╛рдЗрд▓рдорд╛ рд▓реЗрдЦреНрдЫреМрдВред рдпреЛ рдЪрд░рдорд╛ рд╣рд╛рдореАрд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ:

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

рдпреЛ рд╕рдмреИ Add-Content рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдлрд╛рдЗрд▓рдорд╛ рдердкреНрди рд╕рдХрд┐рдиреНрдЫред рдпрд╕рд▓рд╛рдИ рдереЛрд░реИ рдХрдореНрдмреЗрдб рдЧрд░реЗрдкрдЫрд┐, рд╣рд╛рдореАрд▓реЗ рдпреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рдЙрдБрдЫреМрдВ, рд░ рдпрд╕рд▓рд╛рдИ 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

рдЕрдм рд╣реНрдпрд╛рдиреНрдбрд▓рд░ рд╕реБрд░реБ рдЧрд░реНрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВред

рд╕рд╣реА рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк

рд▓реЗрдЦрдХ рдПрдХ рдореЛрдбреНрдпреБрд▓рдорд╛ рдХреБрдиреИ рдкрдирд┐ рдорд╛рд░реНрдЧрдмрд╛рдЯ тАЛтАЛMinecraft рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫ, рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлреЛрд▓реНрдбрд░рдорд╛ рд▓рдЧрд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиред

рд╕рдорд╕реНрдпрд╛ рдпреЛ рдЫ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рд▓рдЧ рдЗрди рднрдПрдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реБрд░реБ рд╣реБрдиреБрдкрд░реНрдЫред рдпреЛ рдбреЗрд╕реНрдХрдЯрдк рд╡рд╛ WinRm рдорд╛рд░реНрдлрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛ рдкреНрд░рд╢рд╛рд╕рдХрдХреЛ рд░реВрдкрдорд╛ рд╕рд░реНрднрд░ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ, рддрд░ рд▓рдЧ рдЗрди рдЧрд░реНрдиреБрд╣реБрдиреНрди рднрдиреЗ, рддрдм Server.jar eula.txt рдкрдвреНрди рд░ рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреИрдиред

рд╣рд╛рдореА рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рддреАрдирд╡рдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рд╣рд░реВ рдердкреЗрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓рдЧрдЗрди рд╕рдХреНрд╖рдо рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред

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

рдпреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЫреИрдиред рд▓рдЧрдЗрди рд░ рдкрд╛рд╕рд╡рд░реНрдб рдпрд╣рд╛рдБ рд╕рд╛рджрд╛ рдкрд╛рдардорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╕рд░реНрднрд░ рд╕реБрд░реБ рдЧрд░реНрди рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрддрд░рдорд╛ рдкрд╣реБрдБрдЪ рднрдПрдХреЛ рдЫреБрдЯреНрдЯреИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд╡рд╛ рдЕрдЭ рд╕рд╛рдБрдШреБрд░реЛ рд╕рдореВрд╣рдорд╛ред рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдирдХ рдкреНрд░рд╢рд╛рд╕рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдХрдбрд╛рдЗрдХрд╛ рд╕рд╛рде рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдПрдХреЛ рдЫреИрдиред

рд╣рд╛рдореАрд▓реЗ рд╕реНрд╡рдд: рд▓рдЧрдЗрди рдХреНрд░рдордмрджреНрдз рдЧрд░реНрдпреМрдВред рдЕрдм рддрдкрд╛рдИрдВрд▓реЗ рд╕рд░реНрднрд░рдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рдХрд╛рд░реНрдп рджрд░реНрддрд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╣рд╛рдореА Powershell рдмрд╛рдЯ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреЗрдЫреМрдВ, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

$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

рдореЛрдбреНрдпреБрд▓ рдЬрдореНрдорд╛ рдЧрд░реНрджреИ

рдЕрдм рд╕рдмреИ рдХреБрд░рд╛рд▓рд╛рдИ рдкрдЫрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рдореЛрдбреНрдпреБрд▓рдорд╛ рд░рд╛рдЦреМрдВред рд░реЗрдбрд┐рдореЗрдб рд▓рд┐рдкрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдХреЛрдб рдпрд╣рд╛рдБ рдЫ, рдЖрдпрд╛рдд рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдореЛрдбреНрдпреБрд▓рд╣рд░реВрд╕рдБрдЧ рдкрд░реЗрд╢рд╛рди рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрди рднрдиреЗ рддрдкрд╛рдЗрдБ рдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХрд╛ рд╕рдмреИ рдХреБрд░рд╛рд╣рд░реВ рдЕрд▓рдЧ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рд╕реНрдЯрд╛рд░реНрдЯ-рдорд╛рдЗрдирдХреНрд░рд╛рдлреНрдЯ

рдкрд╣рд┐рд▓реЗ, рдПрдЙрдЯрд╛ рдореЛрдбреНрдпреБрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ рдЬрд╕рд▓реЗ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реБрдиреНрди рд░ рд░реЗрдХрд░реНрдб рдЧрд░реНрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрди рдмрд╛рд╣реЗрдХ рдЕрд░реВ рдХреЗрд╣реА рдЧрд░реНрджреИрдиред

рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдмреНрд▓рдХрдорд╛, рдЙрд╕рд▓реЗ рдХреБрди рдлреЛрд▓реНрдбрд░рдмрд╛рдЯ Minecraft рд╕реБрд░реБ рдЧрд░реНрдиреЗ рд░ рд▓рдЧ рдХрд╣рд╛рдБ рд░рд╛рдЦреНрдиреЗ рднрдиреЗрд░ рд╕реЛрдзреНрдЫред

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

рд░ рддрдкрд╛рдИрдВрд▓реЗ Minecraft рдпрд╕рд░реА рд╕реБрд░реВ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ:

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

рдЕрдм рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рддрдпрд╛рд░ Handler.ps1 рдорд╛ рдЬрд╛рдФрдВ

рд╣рд╛рдореНрд░реЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрджрд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдмреНрд▓рдХ рдкрдирд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН, рдпрд╕рд▓реЗ Oracle Java рдЪрд▓рд╛рдЙрдБрдЫ, рдпрджрд┐ рддрдкрд╛рдЗрдБ рдлрд░рдХ рд╡рд┐рддрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рддрдкрд╛рдИрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рдХреЛ рдорд╛рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫред

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

рджрд░реНрддрд╛ - Minecraft

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдкрдорд╛ Start-Minecraft рдЬрд╕реНрддреИ рдЫ, рдмрд╛рд╣реЗрдХ рдпрд╕рд▓реЗ рдирдпрд╛рдБ рдХрд╛рд░реНрдп рджрд░реНрддрд╛ рдЧрд░реНрджрдЫред рдЙрд╕реНрддреИ рддрд░реНрдХрд╣рд░реВ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджрдЫред рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди рднрдиреЗ, рд╣рд╛рд▓рдХреЛ рд▓рд┐рдиреНрдЫред

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

рджрд░реНрддрд╛ - Autologon

рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдмреНрд▓рдХрдорд╛, рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд░ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджрдЫред рдпрджрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдПрди рднрдиреЗ, рд╣рд╛рд▓рдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдирд╛рдо рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

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

рдпреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрдБрджрд╛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

Set-Autologon -Password "PlaintextPassword"

рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ

рдЕрдм рд▓реЗрдЦрдХ рдЖрдлреИрд▓реЗ рдпреЛ рд╕рдмреИ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рд╣реЗрд░реМрдВред рд╡рд┐рдиреНрдбреЛрдЬрдорд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ Minecraft рд╕рд░реНрднрд░ рдХрд╕рд░реА рдареАрдХрд╕рдБрдЧ рддреИрдирд╛рдд рдЧрд░реНрдиреЗред рд╕реБрд░реБрджреЗрдЦрд┐ рдиреИ рд╕реБрд░реБ рдЧрд░реМрдВред

1. рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

2. рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрди рдХрд╛рд░реНрдп рджрд░реНрддрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рддрдкрд╛рдИрд▓реЗ рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рдореЛрдбреНрдпреБрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рджрд░реНрддрд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

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

рд╡рд╛ рдорд╛рдирдХ рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

$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. рд╕реНрд╡рдд: рд▓рдЧрдЗрди рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдореЗрд╕рд┐рди рд░рд┐рдмреБрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

рд╕рдорд╛рдкреНрддрд┐

рд▓реЗрдЦрдХрд▓реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдлреИрдВ рд╕рд╣рд┐рдд рдмрдирд╛рдПрдХрд╛ рдЫрдиреН, рддреНрдпрд╕реИрд▓реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрдзрд╛рд░ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдХрд╛ рд╕реБрдЭрд╛рд╡рд╣рд░реВ рд╕реБрдиреНрди рдкрд╛рдЙрдБрджрд╛ рдЦреБрд╕реА рд╣реБрдиреЗрдЫрдиреНред рд▓реЗрдЦрдХ рдЖрд╢рд╛ рдЫ рдХрд┐ рдпреЛ рд╕рдмреИ рдХреЛрдб рдХрдореНрддрд┐рдорд╛ рдиреНрдпреВрдирддрдо рдЙрдкрдпреЛрдЧреА рдерд┐рдпреЛ, рд░ рд▓реЗрдЦ рд░реЛрдЪрдХ рдерд┐рдпреЛред

рдЖрджрд░реНрд╢ Minecraft рд╕рд░реНрднрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди