Kirjoittaja rakastaa peliä erittäin paljon, ja hän itse on pienen palvelimen ylläpitäjä "puhtaasti ystäville". Kuten amatöörien keskuudessa tavallista, kaikki palvelimella on modifioitua, mikä johtaa työn epävakauteen ja seurauksena kaatumiseen. Koska kirjoittaja tuntee Powershellin paremmin kuin kauppojen sijainnit kadullaan, hän päätti tehdä "Paras käsikirjoitus Minecraft 2020:n käynnistämiseen". Sama skripti toimi pohjana mallille
Tarvitsemme komennot
Vaihtoehtoinen kirjaus
Kun asensin vielä pari modia, huomasin, että palvelin ilmeisesti kaatui julistamatta sotaa. Palvelin ei kirjoittanut virheitä latest.logiin tai debugiin, ja konsoli, jonka teoriassa piti kirjoittaa tämä virhe ja pysähtyä, suljettiin.
Jos et halua kirjoittaa, älä kirjoita. Meillä on Powershell cmdletillä Tee-Object, joka ottaa objektin ja tulostaa sen tiedostoon ja konsoliin samanaikaisesti.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
Joten Powershell poimii StandardOutput ja kirjoittaa sen tiedostoon. Älä yritä käyttää Aloitusprosessi, koska se palauttaa System.ComponentModel.Component, ei StandardOutput, ja -RedirectStandardOutput tekevät mahdottomaksi kirjoittaa konsoliin, mitä haluamme välttää.
Käynnistä Argumentit
Asennuksen jälkeen samat modit kirjoittaja huomasi, että palvelimella ei myöskään ollut tarpeeksi RAM-muistia. Ja tämä edellyttää käynnistysargumenttien muuttamista. Sen sijaan, että muuttaisit niitä joka kerta start.batissa, jota kaikki käyttävät, käytä vain tätä komentosarjaa.
Koska Tee-Object lukee StandardOutput vain, kun suoritettavaa tiedostoa kutsutaan "Just like that", yksi lisäskripti on tehtävä. Tämä skripti ajaa itse minecraftia. Aloitetaan argumenteista.
Voidakseen nauttia äärimmäisestä laiskuudesta tulevaisuudessa, käsikirjoituksen on kerättävä laukaisuargumentteja lennossa. Aloitetaan etsimällä uusin versio väärentää.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Lajittele-objektilla otamme aina suurimman numeron omaavan kohteen riippumatta siitä, kuinka monta sinne laitat. Loputonta laiskuutta.
Nyt meidän on määritettävä muisti palvelimelle. Tätä varten otamme järjestelmämuistin määrän ja kirjoitamme sen määrän merkkijonoon.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Oikea automaattinen uudelleenkäynnistys
Kirjoittaja on nähnyt .bat-tiedostoja muilta ihmisiltä, mutta he eivät huomioineet palvelimen pysäyttämisen syytä. Se on hankalaa, entä jos sinun tarvitsee vain muuttaa mod-tiedostoa tai poistaa jotain?
Tehdään nyt kunnollinen uudelleenkäynnistys. Kirjoittaja törmäsi aiemmin outoihin komentosarjoihin, jotka käynnistivät palvelimen uudelleen riippumatta siitä, miksi palvelin poistui. Käytämme poistumiskoodia. Java käyttää nollaa menestyksenä, joten tanssitaan siitä eteenpäin.
Luodaan ensin toiminto, joka käynnistää palvelimen uudelleen, jos se epäonnistuu.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Komentosarja pysyy silmukassa, kunnes palvelin poistuu normaalisti omasta konsolistaan /stop-komennolla.
Jos päätimme automatisoida kaiken, olisi mukava kerätä julkaisupäivä, lopetus ja myös lopettamisen syy.
Tätä varten kirjoitamme Start-Processin tuloksen muuttujaan. Skriptissä se näyttää tältä:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Ja sitten kirjoita tulokset tiedostoon. Tässä on se, mitä meille palautetaan muuttujana:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Kaikki tämä voidaan lisätä tiedostoon Add-Content-toiminnolla. Hieman harjaamalla saamme tällaisen skriptin, mutta kutsumme sitä handler.ps1:ksi.
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
Suunnitellaan nyt käsikirjoitus käsittelijän käynnistämisen kanssa.
Oikea automaattilataus
Kirjoittaja haluaa ajaa eri versioiden minecraftia mistä tahansa polusta yhdellä moduulilla ja pystyä myös sijoittamaan lokit tiettyyn kansioon.
Ongelmana on, että sisäänkirjautuneen käyttäjän on aloitettava prosessi. Tämä voidaan tehdä työpöydän tai WinRm:n kautta. Jos käytät palvelinta järjestelmänä tai jopa järjestelmänvalvojana, mutta et kirjaudu sisään, Server.jar ei edes pysty lukemaan eula.txt-tiedostoa ja käynnistämään sitä.
Voimme ottaa automaattisen sisäänkirjautumisen käyttöön lisäämällä kolme merkintää rekisteriin.
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
Se ei ole turvallista. Kirjautumistunnus ja salasana ilmoitetaan tässä selkeällä tekstillä, joten palvelimen käynnistämiseksi sinun on luotava erillinen käyttäjä, jolla on käyttöoikeus käyttäjätasolla tai vielä suppeammassa ryhmässä. Vakiojärjestelmänvalvojan käyttämistä tähän ei suositella.
Selvitimme automaattisen sisäänkirjautumisen. Nyt sinun on rekisteröitävä uusi tehtävä palvelimelle. Suoritamme komennon Powershellistä, joten se näyttää tältä:
$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
Moduulin kokoaminen
Järjestetään nyt kaikki moduuleiksi, joita voidaan käyttää myöhemmin. Kaikki valmiiden skriptien koodi on täällä, tuo ja käytä.
Voit käyttää kaikkea yllä kuvattua erikseen, jos et halua vaivautua moduuleiden kanssa.
aloita minecraft
Tehdään ensin moduuli, joka ei tee muuta kuin ajaa komentosarjan, joka kuuntelee ja kirjoittaa standardilähtöön.
Parametrilohkossa hän kysyy, mistä kansiosta minecraft käynnistetään ja mihin loki sijoitetaan.
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
Ja sinun on suoritettava minecraft näin:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"
Siirrytään nyt käyttövalmiin Handler.ps1:een
Jotta skriptimme voi hyväksyä parametreja kutsuttaessa, meidän on myös määritettävä parametrilohko. Huomaa, että se käyttää Oracle Javaa. Jos käytät eri jakelua, sinun on vaihdettava suoritettavan tiedoston polku.
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
rekisteröi minecraft
Käsikirjoitus on käytännössä sama kuin Start-Minecraft, paitsi että se rekisteröi vain uuden tehtävän. Hyväksyy samat väitteet. Jos käyttäjätunnusta ei ole määritetty, se ottaa nykyisen tunnuksen.
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
Rekisteröidy - Autologon
Parametrilohkossa komentosarja hyväksyy käyttäjätunnus- ja salasanaparametrit. Jos käyttäjätunnusta ei ole määritetty, käytetään nykyisen käyttäjän nimeä.
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."
}
Tämän skriptin suorittaminen näyttää tältä:
Set-Autologon -Password "PlaintextPassword"
Kuinka käyttää
Mieti nyt, kuinka kirjoittaja itse käyttää tätä kaikkea. Kuinka ottaa Minecraft-julkinen palvelin oikein käyttöön Windowsissa. Aloitetaan aivan alusta.
1. Luo käyttäjä
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Rekisteröi tehtävä komentosarjan suorittamiseksi
Voit rekisteröityä moduuliin seuraavasti:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"
Tai käytä vakiotyökaluja:
$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. Kytke automaattinen sisäänkirjautuminen päälle ja käynnistä kone uudelleen
Set-Autologon -Username "MinecraftServer" -Password "Qw3"
Valmistuminen
Kirjoittaja teki käsikirjoituksen, myös itselleen, joten hän kuuntelee mielellään ehdotuksiasi käsikirjoituksen parantamiseksi. Kirjoittaja toivoo, että kaikki tämä koodi oli sinulle ainakin vähän hyödyllinen, ja artikkeli on mielenkiintoinen.
Lähde: will.com