Ideyal Minecraft sèvè demaraj script la

Ideyal Minecraft sèvè demaraj script la

Otè a renmen jwèt la anpil, epi li menm se administratè yon ti sèvè "sèlman pou zanmi." Kòm nòmal nan mitan amatè, tout bagay sou sèvè a modded, e sa a enplike enstabilite ak, kòm yon rezilta, aksidan. Depi otè a nan Powershell konnen pi bon pase kote magazen yo nan lari li, li deside fè "Pi bon script pou lanse Minecraft 2020" Script la menm te sèvi kòm baz pou modèl la nan Mache Ruvds. Men, tout sous yo deja nan atik la. Koulye a, nan lòd, ki jan tout bagay te fèt.

Kòmandman nou bezwen yo

Logging altènatif

Yon jou, apre yo fin enstale yon koup plis mod, mwen te dekouvri ke sèvè a, aparamman, te fè aksidan san yo pa deklare lagè. Sèvè a pa t 'ekri erè nan latest.log oswa nan debug, ak konsole a, ki nan teyori ta dwe ekri erè sa a ak sispann, te fèmen.

Si li pa vle ekri, li pa bezwen. Nou gen Powershell ak cmdlet Tee-Objè, ki pran yon objè epi li bay li nan yon dosye ak nan konsole a an menm tan.

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

Nan fason sa a, Powershell pral ranmase StandardOutput a epi ekri li nan yon dosye. Pa eseye itilize Kòmanse-Pwosesispaske li pral retounen System.ComponentModel.Component epi li pa StandardOutput, ak -RedirectStandardOutput ap fè li enposib antre nan konsole a, ki se sa nou vle evite.

Lanse agiman

Apre enstale menm pè mods sa a, otè a remake ke sèvè a tou pa t 'gen ase RAM. Lè sa a mande pou chanje agiman yo lansman. Olye pou yo chanje yo chak fwa nan start.bat, ki tout moun itilize, jis itilize script sa a.

Depi Tee-Object sèlman li StandardOutput lè ègzekutabl la rele "Jis tankou sa a", w ap oblije fè yon lòt script. Script sa a pral lanse pa Minecraft tèt li. Ann kòmanse ak agiman yo.

Yo nan lòd yo apresye nan parès ultim nan lavni an, script la dwe kolekte agiman lansman sou vole a. Pou fè sa, ann kòmanse pa chèche vèsyon an dènye fòje.

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

Sèvi ak sort-object, nou pral toujou pran objè a ki gen pi gwo nimewo a, kèlkeswa kantite nan yo ou mete la. Ultim parès.

Koulye a, ou bezwen bay memwa nan sèvè a. Pou fè sa, pran kantite memwa sistèm lan epi ekri kantite li nan fisèl.

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

Kòrèk rekòmanse otomatik

Otè a te wè .bat dosye nan men lòt moun, men yo pa t 'pran an kont rezon ki fè sèvè a te sispann. Sa a se konvenyan, e si ou jis bezwen chanje fichye mod la oswa efase yon bagay?
Koulye a, ann fè yon rekòmanse apwopriye. Otè a te deja rankontre script etranj ki rekòmanse sèvè a kèlkeswa poukisa sèvè a fèmen. Nou pral sèvi ak exitcode. Java itilize 0 kòm yon siksè, kidonk nou pral danse soti isit la.

Premyèman, ann kreye yon fonksyon ki pral rekòmanse sèvè a si li echwe.

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

Script la ap rete nan bouk la jiskaske sèvè a fèmen nòmalman nan pwòp konsole li lè l sèvi avèk lòd /stop la.

Si nou deside otomatize tout bagay, Lè sa a, li ta bon yo kolekte dat kòmansman an, dat fini, ak tou rezon ki fè yo fini.

Pou fè sa, nou ekri rezilta Start-Process nan yon varyab. Nan script la li sanble sa a:

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

Apre sa, nou ekri rezilta yo nan yon dosye. Sa a se sa ki retounen nan nou nan varyab la:

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

Tout bagay sa a ka ajoute nan yon dosye lè l sèvi avèk Add-Content. Lè w fin penyen li yon ti kras, nou jwenn script sa a, epi ann rele li 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

Koulye a, kite a kreye yon script ki lanse moun kap okipe.

Kòrèk demaraj

Otè a vle kouri diferan vèsyon Minecraft soti nan nenpòt chemen nan yon sèl modil, epi tou li kapab estoke mòso bwa nan yon katab espesifik.

Pwoblèm lan se ke pwosesis la dwe kòmanse pa yon itilizatè ki konekte nan sistèm nan. Sa a ka fè atravè Desktop la oswa WinRm. Si ou kouri sèvè a kòm yon itilizatè sistèm oswa menm yon administratè, men ou pa konekte, Lè sa a, Server.jar pa pral menm kapab li eula.txt epi kòmanse.

Nou ka pèmèt koneksyon otomatik lè nou ajoute twa antre nan rejis la.

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

Li pa an sekirite. Login ak modpas yo endike isit la nan tèks klè, kidonk pou kòmanse sèvè a ou bezwen kreye yon itilizatè separe ki gen aksè nan nivo itilizatè, oswa nan yon gwoup menm pi etwat. Li pa rekòmande pou itilize yon administratè estanda pou sa.

Nou rezoud oto-konekte a. Koulye a, ou bezwen anrejistre yon nouvo travay pou sèvè a. Nou pral kouri kòmandman an soti nan Powershell, kidonk li pral gade tankou sa a:

$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

Rasanble modil la

Koulye a, an n mete tout bagay nan modil ki ka itilize pita. Tout kòd pou scripts pare yo isit la, enpòte epi sèvi ak.

Ou ka itilize tout sa ki dekri anwo a separeman si ou pa vle deranje ak modil yo.

Kòmanse-Minecraft

Premyèman, se pou yo kreye yon modil ki pa pral fè anyen plis pase kouri yon script ki pral koute ak anrejistre pwodiksyon estanda.

Nan blòk paramèt la, li mande nan ki katab lanse Minecraft ak ki kote yo mete boutèy la.

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

Epi w ap bezwen lanse Minecraft tankou sa a:

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

Koulye a, ann ale nan Handler.ps1 ki pare pou itilize

Nan lòd pou script nou an aksepte paramèt lè yo rele, nou bezwen tou presize yon blòk paramèt. Tanpri sonje, li kouri Oracle Java, si w ap itilize yon distribisyon diferan w ap bezwen chanje chemen an nan dosye ègzèkutabl la.

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

Enskri-Minecraft

Script la se pratikman menm jan ak Start-Minecraft, eksepte ke li sèlman anrejistre yon nouvo travay. Aksepte menm agiman yo. Non itilizatè a, si li pa espesifye, pran youn aktyèl la.

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

Enskri-Autologon

Nan blòk paramèt la, script la aksepte paramèt Non itilizatè ak Modpas. Si non itilizatè pa te espesifye, yo itilize non itilizatè aktyèl la.

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."
 
}

Kouri script sa a sanble tankou sa a:

Set-Autologon -Password "PlaintextPassword"

Kouman pou itilize

Koulye a, ann gade nan ki jan otè a li menm sèvi ak tout bagay sa yo. Ki jan yo byen deplwaye yon sèvè piblik Minecraft sou Windows. Ann kòmanse depi nan kòmansman an.

1. Kreye yon itilizatè

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

2. Anrejistre travay la pou kouri script la

Ou ka anrejistre lè l sèvi avèk yon modil tankou sa a:

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

Oswa itilize zouti estanda:

$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. Pèmèt oto-konekte ak rdemare machin nan

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

Konplete

Otè a te fè script la, ki gen ladan pou tèt li, Se poutèt sa, li pral kontan koute sijesyon ou yo pou amelyore script la. Otè a espere ke tout kòd sa a te omwen yon minimòm itil pou ou, e ke atik la te enteresan.

Ideyal Minecraft sèvè demaraj script la

Sous: www.habr.com

Add nouvo kòmantè