ΠΠ²ΡΠΎΡ ΠΎΡΠ΅Π½Ρ Π»ΡΠ±ΠΈΡ ΠΈΠ³ΡΡ, ΠΈ ΡΠ°ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° Β«ΡΠΈΡΡΠΎ Π΄Π»Ρ Π΄ΡΡΠ·Π΅ΠΉΒ». ΠΠ°ΠΊ Π²ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ΅Π΄ΠΈ Π»ΡΠ±ΠΈΡΠ΅Π»Π΅ΠΉ, Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π·Π°ΠΌΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΎ Π²ΡΠ΅, Π° ΡΡΠΎ Π²Π»Π΅ΡΡΡ Π·Π° ΡΠΎΠ±ΠΎΠΉ Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΠΏΠ°Π΄Π΅Π½ΠΈΡ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Powershell Π°Π²ΡΠΎΡ Π·Π½Π°Π΅Ρ Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠ² Π½Π° ΡΠ²ΠΎΠ΅ΠΉ ΡΠ»ΠΈΡΠ΅, ΠΎΠ½ ΠΏΡΠΈΠ½ΡΠ» ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Β«ΠΡΡΡΠΈΠΉ Π‘ΠΊΡΠΈΠΏΡ ΠΠ»Ρ ΠΠ°ΠΏΡΡΠΊΠ° ΠΠ°ΠΉΠ½ΠΊΡΠ°ΡΡ 2020Β». ΠΡΠΎΡ ΠΆΠ΅ ΡΠΊΡΠΈΠΏΡ ΠΏΠΎΡΠ»ΡΠΆΠΈΠ» ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½Π° Π²
ΠΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ΄Π½Π°ΠΆΠ΄Ρ ΠΏΠΎΡΡΠ°Π²ΠΈΠ² Π΅ΡΠ΅ ΠΏΠ°ΡΡ ΠΌΠΎΠ΄ΠΎΠ² Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ, ΡΡΠ΄Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ, ΠΏΠ°Π΄Π°Π΅Ρ Π±Π΅Π· ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π²ΠΎΠΉΠ½Ρ. Π‘Π΅ΡΠ²Π΅Ρ Π½Π΅ ΠΏΠΈΡΠ°Π» ΠΎΡΠΈΠ±ΠΊΠΈ Π² latest.log ΠΈΠ»ΠΈ Π² debug, Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎ ΠΈΠ΄Π΅Π΅ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΠ»Π° Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ, Π±ΡΠ»Π° Π·Π°ΠΊΡΡΡΠ°.
ΠΠ΅ Ρ ΠΎΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ β Π½Π΅ Π½ΡΠΆΠ½ΠΎ. Π£ Π½Π°Ρ Π΅ΡΡΡ Powershell Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅ΡΠΎΠΌ Tee-Object, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΉΠ» ΠΈ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Powershell Π±ΡΠ΄Π΅Ρ Π·Π°Π±ΠΈΡΠ°ΡΡ StandardOutput ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΉΠ». ΠΠ΅ ΠΏΡΡΠ°ΠΉΡΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Start-Process, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ Π²Π΅ΡΠ½Π΅Ρ System.ComponentModel.Component, Π° Π½Π΅ StandardOutput, Π° -RedirectStandardOutput ΡΠ΄Π΅Π»Π°Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ Π²Π²ΠΎΠ΄ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ, ΡΠ΅Π³ΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ.
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ Π·Π°ΠΏΡΡΠΊΠ°
ΠΠΎΡΡΠ°Π²ΠΈΠ² ΡΡ ΡΠ°ΠΌΡΡ ΠΏΠ°ΡΡ ΠΌΠΎΠ΄ΠΎΠ², Π°Π²ΡΠΎΡ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΡΡΠΎ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΊ ΡΠΎΠΌΡ ΠΆΠ΅ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. Π ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π·Π°ΠΏΡΡΠΊΠ°. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎΒ ΡΡΠΎΠ±ΡΒ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΌΠ΅Π½ΡΡΡ ΠΈΡ Π² start.bat, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΒ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠΎΡ ΡΠΊΡΠΈΠΏΡ.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Tee-Object ΡΠΈΡΠ°Π΅Ρ StandardOutput,Β ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Β«ΠΡΡΠΌΠΎ ΡΠ°ΠΊΒ», ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΊΡΠΈΠΏΡ. ΠΡΠΎΡ ΡΠΊΡΠΈΠΏΡ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ°ΠΌ ΠΌΠ°ΠΉΠ½ΠΊΡΠ°ΡΡ. ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
Π§ΡΠΎΠ±Ρ Π²Β Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ ΡΠ»ΡΡΠΈΠΌΠ°ΡΠΈΠ²Π½ΠΎΠΉ Π»Π΅Π½ΠΈ, ΡΠΊΡΠΈΠΏΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π·Π°ΠΏΡΡΠΊΠ° Π½Π° Π»Π΅ΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΡΠ½Π΅ΠΌ Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ sort-object ΠΌΡ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΠΌ Π±ΡΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΡΠ°ΠΌΠΎΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Ρ Π²Ρ ΡΡΠ΄Π° ΠΈΡ Π½Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ. Π£Π»ΡΡΠΈΠΌΠ°ΡΠΈΠ²Π½Π°Ρ Π»Π΅Π½Ρ.
Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ Π½Π°Π·Π½Π°ΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π±Π΅ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ ΡΡΠΌΠΌΡ Π² string.
$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)
}
Π‘ΠΊΡΠΈΠΏΡ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π² ΡΠΈΠΊΠ»Π΅ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠ· ΡΠ²ΠΎΠ΅ΠΉ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠ°ΡΠ½ΠΎ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ /stop.
ΠΡΠ»ΠΈ ΠΌΡ Π²ΡΠ΅ ΡΠ΅ΡΠΈΠ»ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ, ΡΠΎ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ Π±Ρ ΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π΄Π°ΡΡ Π·Π°ΠΏΡΡΠΊΠ°, Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅, ΠΏΡΠΈΡΠΈΠ½Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Start-Process Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ. Π ΡΠΊΡΠΈΠΏΡΠ΅ ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
$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
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΎΡΠΎΡΠΌΠΈΠΌ ΡΠΊΡΠΈΠΏΡ Ρ Π·Π°ΠΏΡΡΠΊΠΎΠΌ handlerβa.
ΠΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ Π°Π²ΡΠΎΠ·Π°Π³ΡΡΠ·ΠΊΠ°
ΠΠ²ΡΠΎΡ Ρ ΠΎΡΠ΅Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΌΠ°ΠΉΠ½ΠΊΡΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π²Π΅ΡΡΠΈΠΉ ΠΈΠ· Π»ΡΠ±ΡΡ ΠΏΡΡΠ΅ΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΠ°ΠΏΠΊΡ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΡΠΎΠ» ΠΈΠ»ΠΈ 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
Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΎΡΠΎΡΠΌΠΈΠΌ Π²ΡΠ΅ Π² ΠΌΠΎΠ΄ΡΠ»ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. ΠΠ΅ΡΡ ΠΊΠΎΠ΄ Π³ΠΎΡΠΎΠ²ΡΡ ΡΠΊΡΠΈΠΏΡΠΎΠ² ΡΡΡ, ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΠΈ ΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ.
ΠΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅ Π·Π°ΠΌΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ Ρ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ.
Start-Minecraft
Π‘Π½Π°ΡΠ°Π»Π° ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΈ Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π°ΡΡ, ΡΡΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ»ΡΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ standardoutput.
Π Π±Π»ΠΎΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΎΠ½ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ· ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΌΠ°ΠΉΠ½ΠΊΡΠ°ΡΡ ΠΈ ΠΊΡΠ΄Π° ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ Π»ΠΎΠ³.
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
Π Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΌΠ°ΠΉΠ½ΠΊΡΠ°ΡΡ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊ:
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
Register-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
Register-Autologon
Π Π±Π»ΠΎΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΊΡΠΈΠΏΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Username ΠΈ Password. ΠΡΠ»ΠΈ Username Π½Π΅ Π±ΡΠ» ΡΠΊΠ°Π·Π°Π½, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠΌΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
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"
ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ²ΡΠΎΡ Π΄Π΅Π»Π°Π» ΡΠΊΡΠΈΠΏΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π΄Π»Ρ ΡΠ΅Π±Ρ, ΠΏΠΎΡΡΠΎΠΌΡ, Ρ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ΠΌ Π²ΡΡΠ»ΡΡΠ°Π΅Ρ Π²Π°ΡΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ°. ΠΠ²ΡΠΎΡ Π½Π°Π΄Π΅Π΅ΡΡΡ, ΡΡΠΎ Π²Π΅ΡΡ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π±ΡΠ» Π΄Π»Ρ Π²Π°Ρ Ρ ΠΎΡΡ Π±Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π° ΡΡΠ°ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com