ื“ื™ ื™ื“ืขืึทืœ ืกื˜ืึทืจื˜ืึทืคึผ ืฉืจื™ืคื˜ ืคื•ืŸ Minecraft ืกืขืจื•ื•ืขืจ

ื“ื™ ื™ื“ืขืึทืœ ืกื˜ืึทืจื˜ืึทืคึผ ืฉืจื™ืคื˜ ืคื•ืŸ Minecraft ืกืขืจื•ื•ืขืจ

ื“ืขืจ ืžื—ื‘ืจ ืœื™ื‘ ื“ื™ ืฉืคึผื™ืœ ื–ื™ื™ืขืจ ืคื™ืœ, ืื•ืŸ ืขืจ ื–ื™ืš ืื™ื– ื“ืขืจ ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ ืคื•ืŸ ืึท ืงืœื™ื™ืŸ ืกืขืจื•ื•ืขืจ "ืจื™ื™ืŸ ืคึฟืึทืจ ืคืจืขื ื“ื–." ื•ื•ื™ ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš ืฆื•ื•ื™ืฉืŸ ืึทืžืึทื˜ืฉืขืจื–, ืึทืœืฅ ืื•ื™ืฃ ื“ื™ ืกืขืจื•ื•ืขืจ ืื™ื– ืžืึธื“ื“ื™ื“, ืื•ืŸ ื“ืึธืก ื™ื ืงืœื•ื“ื– ื™ื ืกื˜ืึทื‘ื™ืœื™ื˜ื™ ืื•ืŸ, ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืงืจืึทืฉื™ื–. ื–ื™ื ื˜ ื“ืขืจ ืžื—ื‘ืจ ืคื•ืŸ ืคึผืึธื•ื•ืขืจืฉืขืœืœ ื•ื•ื™ื™ืกื˜ ื‘ืขืกืขืจ ื•ื•ื™ ื“ื™ ืึธืจื˜ ืคื•ืŸ ื“ื™ ืกื˜ืึธืจื– ืื•ื™ืฃ ื–ื™ื™ืŸ ื’ืึทืก, ืขืจ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืžืึทื›ืŸ "ื‘ืขืกื˜ืขืจ ืกืงืจื™ืคึผื˜ ืฆื• ืงืึทื˜ืขืจ ืžื™ื ืขืงืจืึทืคื˜ 2020" ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฉืจื™ืคื˜ ื’ืขื“ื™ื ื˜ ื•ื•ื™ ื“ื™ ื™ืงืขืจ ืคึฟืึทืจ ื“ื™ ืžื•ืกื˜ืขืจ ืื™ืŸ Ruvds ืžืึทืจืงืขื˜. ืึธื‘ืขืจ ืึทืœืข ืžืงื•ืจื™ื ื–ืขื ืขืŸ ืฉื•ื™ืŸ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ. ืื™ืฆื˜, ืื™ืŸ ืกื“ืจ, ื•ื•ื™ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึทืœืข ื’ืขื˜ืืŸ.

ื“ื™ ืงืึทืžืึทื ื“ื– ืžื™ืจ ื“ืึทืจืคึฟืŸ

ืึทืœื˜ืขืจื ืึทื˜ื™ื•ื•ืข ืœืึธื’ื™ื ื’

ืื™ื™ืŸ ื˜ืึธื’, ื ืึธืš ื™ื ืกื˜ืึธืœื™ื ื’ ืึท ืคึผืึธืจ ืžืขืจ ืžืึธื“ืก, ืื™ืš ื“ื™ืกืงืึทื•ื•ืขืจื“ ืึทื– ื“ืขืจ ืกืขืจื•ื•ืขืจ, ืžืฉืžืขื•ืช, ืงืจืึทืฉื˜ ืึธืŸ ื“ื™ืงืœืขืจื™ื ื’ ืžืœื—ืžื”. ื“ืขืจ ืกืขืจื•ื•ืขืจ ื”ืื˜ ื ื™ืฉื˜ ืฉืจื™ื™ึทื‘ืŸ ืขืจืจืึธืจืก ืื™ืŸ ืœืขืฆื˜.ืœืึธื’ ืึธื“ืขืจ ืื™ืŸ ื“ื™ื‘ืึทื’, ืื•ืŸ ื“ื™ ืงืึทื ืกืึธื•ืœ, ื•ื•ืึธืก ืื™ืŸ ื˜ืขืึธืจื™ืข ื–ืึธืœ ื”ืึธื‘ืŸ ื’ืขืฉืจื™ื‘ืŸ ื“ืขื ื˜ืขื•ืช ืื•ืŸ ืคืืจืฉื˜ืืคื˜, ืื™ื– ื’ืขื•ื•ืขืŸ ืคืืจืžืื›ื˜.

ืื•ื™ื‘ ืขืจ ื•ื•ื™ืœ ื ื™ืฉื˜ ืฉืจื™ื™ื‘ืŸ, ื“ืืจืฃ ืขืจ ื ื™ืฉื˜. ืžื™ืจ ื”ืึธื‘ืŸ Powershell ืžื™ื˜ cmdlet ื˜ื™-ืึธื‘ื“ื–ืฉืขืงื˜, ื•ื•ืึธืก ื ืขืžื˜ ืึท ื›ื™ื™ืคืขืฅ ืื•ืŸ ืึทื•ื˜ืคึผื•ืฅ ืขืก ืฆื• ืึท ื˜ืขืงืข ืื•ืŸ ืฆื• ื“ื™ ืงืึทื ืกืึธื•ืœ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜.

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

ื“ืขื ื•ื•ืขื’, Powershell ื•ื•ืขื˜ ืงืœื™ื™ึทื‘ืŸ ื“ื™ StandardOutput ืื•ืŸ ืฉืจื™ื™ึทื‘ืŸ ืขืก ืฆื• ืึท ื˜ืขืงืข. ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื ื•ืฆืŸ ืึธื ื”ื™ื™ื‘-ืคึผืจืึธืฆืขืกื•ื•ื™ื™ึทืœ ืขืก ื•ื•ืขื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ System.ComponentModel.Component ืืœื ื•ื•ื™ StandardOutput, ืื•ืŸ -RedirectStandardOutput ื•ื•ืขื˜ ืžืึทื›ืŸ ืขืก ืื•ืžืžืขื’ืœืขืš ืฆื• ืึทืจื™ื™ึทืŸ ื“ื™ ืงืึทื ืกืึธื•ืœ, ื•ื•ืึธืก ืื™ื– ื•ื•ืึธืก ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื•ื™ืกืžื™ื™ื“ืŸ.

ืงืึทื˜ืขืจ ืึทืจื’ื•ืžืขื ื˜ืŸ

ื ืึธืš ื™ื ืกื˜ืึธืœื™ื ื’ ื“ื™ ื–ืขืœื‘ืข ืคึผืึธืจ ืคื•ืŸ ืžืึธื“ืก, ื“ืขืจ ืžื—ื‘ืจ ื‘ืืžืขืจืงื˜ ืึทื– ื“ืขืจ ืกืขืจื•ื•ืขืจ ืื•ื™ืš ื”ืื˜ ื ื™ืฉื˜ ื’ืขื ื•ื’ ื‘ืึทืจืึทืŸ. ืื•ืŸ ื“ืึธืก ืจื™ืงื•ื•ื™ื™ืขืจื– ื˜ืฉืึทื ื’ื™ื ื’ ื“ื™ ืงืึทื˜ืขืจ ืึทืจื’ื•ืžืขื ื˜ืŸ. ืึทื ืฉื˜ืึธื˜ ืฆื• ื˜ื•ื™ืฉืŸ ื–ื™ื™ ื™ืขื“ืขืจ ืžืึธืœ ืื™ืŸ start.bat, ื•ื•ืึธืก ืึทืœืขืžืขืŸ ื ื™ืฆื˜, ื ืึธืจ ื ื•ืฆืŸ ื“ืขื ืฉืจื™ืคื˜.

ื–ื™ื ื˜ ื˜ื™-ืึธื‘ื“ื–ืฉืขืงื˜ ื‘ืœื•ื™ื– ืœื™ื™ืขื ื˜ ืกื˜ืึทื ื“ืึทืจื“ืึธื•ื˜ืคึผื•ื˜ ื•ื•ืขืŸ ื“ื™ ืขืงืกืขืงื•ื˜ืึทื‘ืœืข ืื™ื– ื’ืขืจื•ืคืŸ "ืคึผื•ื ืงื˜ ื•ื•ื™ ื“ืึธืก", ืื™ืจ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืฆื• ืžืึทื›ืŸ ืืŸ ืื ื“ืขืจ ืฉืจื™ืคื˜. ื“ืขื ืฉืจื™ืคื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืœืึธื ื˜ืฉื˜ ื“ื•ืจืš 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 ื˜ืขืงืขืก ืคื•ืŸ ืื ื“ืขืจืข ืžืขื ื˜ืฉืŸ, ืึธื‘ืขืจ ื–ื™ื™ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื ืขืžืขืŸ ืื™ืŸ ื—ืฉื‘ื•ืŸ ื“ื™ ืกื™ื‘ื” ื•ื•ืึธืก ื“ื™ ืกืขืจื•ื•ืขืจ ืื™ื– ืกื˜ืึทืคึผื˜. ื“ืึธืก ืื™ื– ื•ืžื‘ืึทืงื•ื•ืขื, ื•ื•ืึธืก ืื•ื™ื‘ ืื™ืจ ื ืึธืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ืžืึธื“ ื˜ืขืงืข ืึธื“ืขืจ ื•ื™ืกืžืขืงืŸ ืขืคึผืขืก?
ืื™ืฆื˜ ืœืึธื–ืŸ ืก ื˜ืึธืŸ ืึท ื’ืขื”ืขืจื™ืง ืจื™ืกื˜ืึทืจื˜. ื“ืขืจ ืžื—ื‘ืจ ื”ืึธื˜ ืคืจื™ืขืจ ื’ืขื˜ืจืืคืŸ ืžืึธื“ื ืข ืกืงืจื™ืคึผืก ื•ื•ืึธืก ืจื™ืกื˜ืึทืจื˜ื™ื“ ื“ื™ ืกืขืจื•ื•ืขืจ ืจืึทื’ืึทืจื“ืœืึทืก ืคื•ืŸ ื•ื•ืึธืก ื“ื™ ืกืขืจื•ื•ืขืจ ืื™ื– ืคืึทืจืžืึทื›ืŸ ืึทืจืึธืคึผ. ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ืขืงืกื™ื˜ืงืึธื“ืข. 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)
    
}

ื“ืขืจ ืฉืจื™ืคื˜ ื•ื•ืขื˜ ื‘ืœื™ื™ื‘ืŸ ืื™ืŸ ื“ื™ ืฉืœื™ื™ืฃ ื‘ื™ื– ื“ืขืจ ืกืขืจื•ื•ืขืจ ื ืึธืจืžืึทืœื™ ืคืึทืจืžืึทื›ืŸ ื–ื™ืš ืคึฟื•ืŸ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืงืึทื ืกืึธื•ืœ ืžื™ื˜ ื“ื™ /stop ื‘ืึทืคึฟืขืœ.

ืื•ื™ื‘ ืžื™ืจ ื‘ืึทืฉืœื™ืกืŸ ืฆื• ืึธื˜ืึทืžื™ื™ื˜ ืึทืœืฅ, ืขืก ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ืคื™ื™ึทืŸ ืฆื• ื–ืึทืžืœืขืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ื˜ืึธื’, ืงืึทืžืคึผืœื™ืฉืึทืŸ ื˜ืึธื’ ืื•ืŸ ื“ื™ ืกื™ื‘ื” ืคึฟืึทืจ ืงืึทืžืคึผืœื™ืฉืึทืŸ.

ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืึธื ื”ื™ื™ื‘-ืคึผืจืึธืกืขืกืก ืื™ืŸ ืึท ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง. ืื™ืŸ ื“ืขื ืฉืจื™ืคื˜ ืขืก ืงื•ืงื˜ ื•ื•ื™ ื“ืึธืก:

$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. ื ืึธืš ืึท ื‘ื™ืกืœ ืงืึทื, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ืขื ืฉืจื™ืคื˜, ืื•ืŸ ืœืึธื–ืŸ ืื•ื ื“ื– ืจื•ืคืŸ ืขืก ื”ืึทื ื“ืœืขืจ.ืคึผืก1.

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

ืื™ืฆื˜ ืœืึธื–ืŸ ืก ืžืึทื›ืŸ ืึท ืฉืจื™ืคื˜ ื•ื•ืึธืก ืœืึธื ื˜ืฉื™ื– ื”ืึทื ื“ืœืขืจ.

ืจื™ื›ื˜ื™ืง ืกื˜ืึทืจื˜ืึทืคึผ

ื“ืขืจ ืžื—ื‘ืจ ื•ื•ื™ืœ ืฆื• ืœื•ื™ืคืŸ ืคืึทืจืฉื™ื“ืขื ืข ื•ื•ืขืจืกื™ืขืก ืคื•ืŸ ืžื™ื ืขืงืจืึทืคื˜ ืคึฟื•ืŸ ืงื™ื™ืŸ ื•ื•ืขื’ ืื™ืŸ ืื™ื™ืŸ ืžืึธื“ื•ืœืข, ืื•ืŸ ืื•ื™ืš ืงืขื ืขืŸ ืฆื• ืงืจืึธื ืœืึธื’ืก ืื™ืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื˜ืขืงืข.

ื“ืขืจ ืคึผืจืึธื‘ืœืขื ืื™ื– ืึทื– ื“ืขืจ ืคึผืจืึธืฆืขืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ืกื˜ืึทืจื˜ืขื“ ื“ื•ืจืš ืึท ื‘ืึทื ื™ืฆืขืจ ื•ื•ืึธืก ืื™ื– ืœืึธื’ื“ ืื™ืŸ ื“ื™ ืกื™ืกื˜ืขื. ื“ืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ื“ื•ืจืš ื“ื™ ื“ืขืกืงื˜ืึทืคึผ ืึธื“ืขืจ ื•ื•ื™ื ืจื. ืื•ื™ื‘ ืื™ืจ ืœื•ื™ืคืŸ ื“ื™ ืกืขืจื•ื•ืขืจ ื•ื•ื™ ืึท ืกื™ืกื˜ืขื ื‘ืึทื ื™ืฆืขืจ ืึธื“ืขืจ ืืคื™ืœื• ืึท ืึทื“ืžื™ื ื™ืกื˜ืจืึทื˜ืึธืจ, ืึธื‘ืขืจ ื˜ืึธืŸ ื ื™ื˜ ืงืœืึธืฅ ืื™ืŸ, 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

ืจืขื’ื™ืกื˜ืจื™ืจืŸ-ืžื™ื ืขืงืจืึทืคื˜

ื“ืขืจ ืฉืจื™ืคื˜ ืื™ื– ืคึผืจืึทืงื˜ืึทืงืœื™ ื“ื™ ื–ืขืœื‘ืข ื•ื•ื™ 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

ืจืขื’ื™ืกื˜ืจื™ืจืŸ-ืึทื•ื˜ืึธืœืึธื’ืึธืŸ

ืื™ืŸ ื“ื™ ืคึผืึทืจืึทืžืขื˜ืขืจืก ื‘ืœืึธืง, ื“ื™ ืฉืจื™ืคื˜ ืึทืงืกืขืคึผืฅ ื“ื™ ื ืืžืขืŸ ืื•ืŸ ืฉืคึผืจื™ื›ื•ื•ืึธืจื˜ ืคึผืึทืจืึทืžืขื˜ืขืจืก. ืื•ื™ื‘ ื‘ืึทื ื™ืฆืขืจ ื ืึธืžืขืŸ ืื™ื– ื ื™ืฉื˜ ืกืคึผืขืกื™ืคื™ืขื“, ื“ื™ ืงืจืึทื ื˜ ื‘ืึทื ื™ืฆืขืจ ื ืึธืžืขืŸ ืื™ื– ื’ืขื ื™ืฆื˜.

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 ืกืขืจื•ื•ืขืจ ืื•ื™ืฃ Windows. ื–ืืœ ืก ืึธื ื”ื™ื™ื‘ืŸ ืคื•ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘.

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’