Skrip peluncuran server Minecraft yang sempurna



Penulis sangat menyukai permainan ini, dan ia sendiri adalah administrator dari sebuah server kecil "murni untuk teman-teman." Seperti biasa di kalangan amatir, semuanya dimodulasi di server, dan ini memerlukan ketidakstabilan kerja dan sebagai akibat dari kejatuhan. Karena penulis tahu Powershell lebih baik daripada lokasi toko di jalannya, ia memutuskan untuk membuat "The Best Minecraft 2020 Launch Script ." Script yang sama berfungsi sebagai dasar untuk templat di pasar Ruvds . Tetapi semua sumber sudah ada di artikel. Sekarang, secara berurutan, bagaimana itu semua terjadi.

Kami membutuhkan tim


Penebangan alternatif


Setelah menempatkan beberapa mod lagi, saya menemukan bahwa server tampaknya mogok tanpa menyatakan perang. Server tidak menulis kesalahan di latest.log atau debug, dan konsol, yang seharusnya menulis dan menghentikan kesalahan ini, ditutup.

Tidak mau menulis - tidak perlu. Kami memiliki Powershell dengan cmdlet Tee-Object , yang mengambil objek dan menampilkannya dalam file dan di konsol pada saat yang sama.

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

Dengan cara ini, Powershell akan mengambil StandardOutput dan menulisnya ke file. Jangan mencoba menggunakan Start-Process , karena akan mengembalikan System.ComponentModel.Component, bukan StandardOutput, dan -RedirectStandardOutput akan membuat tidak mungkin untuk memasuki konsol, yang ingin kita hindari.

Luncurkan Argumen


Menempatkan pasangan mod yang sama, penulis memperhatikan bahwa server juga kekurangan RAM. Dan ini perlu mengubah argumen startup. Alih-alih mengubahnya setiap kali di start.bat, yang digunakan semua orang, cukup gunakan skrip ini.

Karena Tee-Object membaca StandardOutput hanya ketika executable disebut "Right So", Anda harus membuat skrip lain. Script ini akan menjalankan minecraft itu sendiri. Mari kita mulai dengan argumen.

Untuk menikmati kemalasan terakhir di masa depan, skrip harus mengumpulkan argumen awal dengan cepat. Untuk melakukan ini, mulailah dengan mencari forge versi terbaru .

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

Dengan bantuan sort-object, kami akan selalu mengambil objek dengan digit terbesar, tidak peduli berapa banyak Anda meletakkannya di sana. Kemalasan yang luar biasa.

Sekarang Anda perlu menetapkan memori ke server. Untuk melakukan ini, ambil jumlah memori sistem dan tulis jumlahnya dalam string.

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

Restart otomatis yang benar


Penulis melihat file .bat dari orang lain, tetapi mereka tidak memperhitungkan alasan server dihentikan. Apakah tidak nyaman jika Anda hanya perlu mengubah file mod atau menghapus sesuatu?
Sekarang mari kita lakukan restart dengan benar. Penulis sebelumnya menemukan skrip aneh yang me-restart server terlepas dari kenyataan bahwa server dimatikan. Kami akan menggunakan kode akses. Java menggunakan 0 sebagai penyelesaian yang berhasil, maka kita akan menari.

Pertama, buat fungsi yang akan me-restart server jika gagal untuk menyelesaikan.

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

Script akan tetap berada di loop sampai server dari konsol sendiri dimatikan secara normal menggunakan perintah / stop.

Jika kita semua memutuskan untuk mengotomatisasi, akan lebih baik untuk mengumpulkan tanggal peluncuran, penyelesaian, serta alasan penyelesaiannya.

Untuk melakukan ini, kami menulis hasil Mulai-Proses ke variabel. Dalam skrip, tampilannya seperti ini:

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

Dan kemudian kami menulis hasilnya ke file. Inilah yang mengembalikan kepada kita dalam variabel:

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

Semua ini menggunakan Add-Content dapat ditambahkan ke file. Setelah menyisir sedikit, kami mendapatkan skrip seperti itu, dan menyebutnya 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

Sekarang mari kita jalankan skrip dengan peluncuran pawang

Startup yang tepat


Penulis menginginkan satu modul untuk meluncurkan minecraft dari berbagai versi dari jalur apa pun, dan juga dapat meletakkan log di folder tertentu.

Masalahnya adalah bahwa proses tersebut harus dimulai oleh pengguna yang ada di sistem. Ini dapat dilakukan melalui desktop atau WinRm. Jika Anda memulai server atas nama sistem atau bahkan administrator, tetapi jangan login, maka Server.jar bahkan tidak akan dapat membaca eula.txt dan memulai.

Kami dapat mengaktifkan masuk otomatis ke sistem dengan menambahkan tiga entri ke registri.

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password  -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue

Itu tidak aman. Login dan kata sandi ditunjukkan di sini dalam plaintext, jadi Anda perlu memulai pengguna individu yang memiliki akses di tingkat pengguna, atau dalam kelompok yang lebih sempit, untuk memulai server. Menggunakan administrator standar untuk ini sangat tidak disarankan.

Dengan input otomatis diurutkan. Sekarang Anda perlu mendaftarkan tugas baru di bawah server. Kami akan menjalankan perintah dari Powershell, sehingga akan terlihat seperti ini:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

Menyatukan modul


Sekarang mari kita buat semuanya menjadi modul yang bisa digunakan nanti. Semua kode skrip siap pakai ada di sini, impor dan gunakan.

Anda dapat menggunakan semua yang dijelaskan di atas secara terpisah jika Anda tidak ingin repot dengan modul.

Mulai-minecraft


Pertama, kami akan membuat modul yang hanya akan melakukan itu, menjalankan skrip yang akan mendengarkan dan merekam keluaran standar.

Di blok parameter, ia bertanya dari folder mana untuk meluncurkan minecraft dan di mana harus meletakkan log.

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

Dan Anda perlu menjalankan minecraft seperti ini:

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

Sekarang mari kita beralih ke Handler.ps1

yang siap digunakan agar skrip kita dapat menerima parameter saat dipanggil, kita juga perlu menentukan blok parameter. Harap perhatikan bahwa ini memulai Oracle Java, jika Anda menggunakan distribusi yang berbeda, Anda perlu mengubah path ke file yang dapat dieksekusi.

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 files\Oracle\Java\javapath_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

Daftar-minecraft


Script praktis mengulangi Start-Minecraft, kecuali bahwa itu hanya mendaftarkan tugas baru. Terima argumen yang sama. Nama pengguna, jika tidak ditentukan, mengambil yang saat ini.

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

Daftarkan-autologon


Di blok parameter, skrip menerima parameter Nama Pengguna dan Kata Sandi. Jika Nama pengguna tidak ditentukan, nama pengguna saat ini digunakan.

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:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
 
    if ($null -eq $i) {
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password 
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
        Write-Verbose "Set-Autologon will enable user auto logon."
 
    }
    else {
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
    }
 
    
    Write-Verbose "Autologon was set successfully."
 
}

Menjalankan skrip ini terlihat seperti ini:

Set-Autologon -Password "PlaintextPassword"

Cara Penggunaan


Sekarang kita akan mempertimbangkan bagaimana penulis sendiri menggunakan semua ini. Cara menggunakan server publik Minecraft di Windows. Mari kita mulai dari awal.

1. Buat pengguna

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

2. Daftarkan tugas menjalankan skrip.

Anda dapat mendaftar menggunakan modul, sebagai berikut:

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

Atau gunakan alat standar:

$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest

3. Nyalakan login otomatis ke sistem dan reboot mesin

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

Penyelesaian


Penulis membuat skrip, termasuk untuk dirinya sendiri, oleh karena itu, ia akan senang mendengar saran Anda untuk meningkatkan skrip. Penulis berharap bahwa semua kode ini setidaknya bermanfaat minimal untuk Anda, dan artikel ini menarik.


All Articles