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 pawangStartup 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.ps1yang 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 mesinSet-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.