Y sgript cychwyn gweinydd Minecraft perffaith

Y sgript cychwyn gweinydd Minecraft perffaith

Mae’r awdur yn caru’r gêm yn fawr iawn, ac mae ef ei hun yn weinyddwr gweinydd bach “ar gyfer ffrindiau yn unig.” Fel sy'n arferol ymhlith amaturiaid, mae popeth ar y gweinydd yn cael ei fodded, ac mae hyn yn golygu ansefydlogrwydd ac, o ganlyniad, damweiniau. Gan fod awdur Powershell yn gwybod yn well na lleoliad y siopau ar ei stryd, penderfynodd wneud "Sgript Orau i Lansio Minecraft 2020" Roedd yr un sgript yn sail i'r templed yn marchnadfa Ruvds. Ond mae'r holl ffynonellau eisoes yn yr erthygl. Yn awr, mewn trefn, sut y gwnaed y cyfan.

Y gorchmynion sydd eu hangen arnom

Logio amgen

Un diwrnod, ar ôl gosod ychydig mwy o mods, darganfyddais fod y gweinydd, mae'n debyg, yn chwalu heb ddatgan rhyfel. Ni ysgrifennodd y gweinydd wallau yn latest.log neu mewn dadfygio, a chaewyd y consol, a ddylai mewn egwyddor fod wedi ysgrifennu'r gwall hwn a stopio.

Os nad yw am ysgrifennu, nid oes angen iddo wneud hynny. Mae gennym Powershell gyda cmdlet Tee-Gwrthrych, sy'n cymryd gwrthrych ac yn ei allbynnu i ffeil ac i'r consol ar yr un pryd.

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

Fel hyn, bydd Powershell yn codi'r StandardOutput ac yn ei ysgrifennu i ffeil. Peidiwch â cheisio defnyddio Cychwyn-Prosesoherwydd bydd yn dychwelyd System.ComponentModel.Component yn hytrach na StandardOutput, a bydd -RedirectStandardOutput yn ei gwneud hi'n amhosibl mynd i mewn i'r consol, sef yr hyn yr ydym am ei osgoi.

Lansio dadleuon

Ar ôl gosod yr un pâr o mods, sylwodd yr awdur nad oedd gan y gweinydd ddigon o RAM hefyd. Ac mae hyn yn gofyn am newid y dadleuon lansio. Yn lle eu newid bob tro yn start.bat, y mae pawb yn ei ddefnyddio, dim ond defnyddio'r sgript hon.

Gan fod Tee-Object ond yn darllen y StandardOutput pan fydd y gweithredadwy yn cael ei alw'n "Dim ond fel hyn", bydd yn rhaid i chi wneud sgript arall. Bydd y sgript hon yn cael ei lansio gan Minecraft ei hun. Gadewch i ni ddechrau gyda'r dadleuon.

Er mwyn ymroi i ddiogi eithaf yn y dyfodol, rhaid i'r sgript gasglu dadleuon lansio ar y hedfan. I wneud hyn, gadewch i ni ddechrau trwy chwilio am y fersiwn diweddaraf creu.

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

Gan ddefnyddio sort-object, byddwn bob amser yn cymryd y gwrthrych gyda'r nifer mwyaf, ni waeth faint ohonynt rydych chi'n eu rhoi yno. Diogi yn y pen draw.

Nawr mae angen i chi aseinio cof i'r gweinydd. I wneud hyn, cymerwch faint o gof system ac ysgrifennwch ei swm mewn llinyn.

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

Ailgychwyn awtomatig cywir

Mae'r awdur wedi gweld ffeiliau .bat gan bobl eraill, ond nid oeddent yn ystyried y rheswm pam y cafodd y gweinydd ei stopio. Mae hyn yn anghyfleus, beth os oes angen i chi newid y ffeil mod neu ddileu rhywbeth?
Nawr gadewch i ni wneud ailgychwyn iawn. Yn flaenorol, daeth yr awdur ar draws sgriptiau rhyfedd a ailgychwynnodd y gweinydd waeth pam y caeodd y gweinydd. Byddwn yn defnyddio'r cod ymadael. Mae Java yn defnyddio 0 fel llwyddiant, felly byddwn yn dawnsio o fan hyn.

Yn gyntaf, gadewch i ni greu swyddogaeth a fydd yn ailgychwyn y gweinydd os bydd yn methu.

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

Bydd y sgript yn aros yn y ddolen nes bod y gweinydd yn cau i lawr fel arfer o'i gonsol ei hun gan ddefnyddio'r gorchymyn /stop.

Os byddwn yn penderfynu awtomeiddio popeth, yna byddai'n braf casglu'r dyddiad cychwyn, y dyddiad cwblhau, a hefyd y rheswm dros gwblhau.

I wneud hyn, rydym yn ysgrifennu canlyniad Start-Process i newidyn. Yn y sgript mae'n edrych fel hyn:

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

Ac yna rydyn ni'n ysgrifennu'r canlyniadau i ffeil. Dyma beth sy'n cael ei ddychwelyd i ni yn y newidyn:

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

Gellir ychwanegu hyn i gyd at ffeil gan ddefnyddio Ychwanegu-Cynnwys. Ar ôl ei gribo ychydig, rydyn ni'n cael y sgript hon, a gadewch i ni ei galw'n 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

Nawr, gadewch i ni greu sgript sy'n lansio handler.

Cychwyn cywir

Mae'r awdur eisiau rhedeg gwahanol fersiynau o Minecraft o unrhyw lwybr mewn un modiwl, a hefyd yn gallu storio logiau mewn ffolder penodol.

Y broblem yw bod yn rhaid i'r broses gael ei dechrau gan ddefnyddiwr sydd wedi mewngofnodi i'r system. Gellir gwneud hyn trwy'r bwrdd gwaith neu WinRm. Os ydych chi'n rhedeg y gweinydd fel defnyddiwr system neu hyd yn oed gweinyddwr, ond nad ydych chi'n mewngofnodi, yna ni fydd Server.jar hyd yn oed yn gallu darllen eula.txt a chychwyn.

Gallwn alluogi mewngofnodi awtomatig trwy ychwanegu tri chofnod i'r gofrestrfa.

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

Nid yw'n ddiogel. Mae'r mewngofnodi a'r cyfrinair wedi'u nodi yma mewn testun plaen, felly i gychwyn y gweinydd mae angen i chi greu defnyddiwr ar wahân sydd â mynediad ar lefel y defnyddiwr, neu mewn grŵp culach fyth. Ni argymhellir yn bendant defnyddio gweinyddwr safonol ar gyfer hyn.

Fe wnaethon ni ddatrys y mewngofnodi awtomatig. Nawr mae angen i chi gofrestru tasg newydd ar gyfer y gweinydd. Byddwn yn rhedeg y gorchymyn gan Powershell, felly bydd yn edrych fel hyn:

$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

Cydosod y modiwl

Nawr, gadewch i ni roi popeth mewn modiwlau y gellir eu defnyddio yn nes ymlaen. Mae'r holl god ar gyfer sgriptiau parod yma, mewnforio a defnyddio.

Gallwch ddefnyddio popeth a ddisgrifir uchod ar wahân os nad ydych am drafferthu gyda modiwlau.

Cychwyn - Minecraft

Yn gyntaf, gadewch i ni greu modiwl na fydd yn gwneud dim mwy na rhedeg sgript a fydd yn gwrando ar allbwn safonol ac yn ei recordio.

Yn y bloc paramedrau, mae'n gofyn o ba ffolder i lansio Minecraft a ble i roi'r 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

A bydd angen i chi lansio Minecraft fel hyn:

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

Nawr, gadewch i ni symud ymlaen i'r Handler.ps1 parod i'w ddefnyddio

Er mwyn i'n sgript dderbyn paramedrau pan gaiff ei alw, mae angen i ni hefyd nodi bloc paramedr. Sylwch, mae'n rhedeg Oracle Java, os ydych chi'n defnyddio dosbarthiad gwahanol bydd angen i chi newid y llwybr i'r ffeil gweithredadwy.

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

Cofrestru - Minecraft

Mae'r sgript fwy neu lai yr un peth â Start-Minecraft, ac eithrio mai dim ond tasg newydd y mae'n ei chofrestru. Yn derbyn yr un dadleuon. Mae'r enw defnyddiwr, os nad yw wedi'i nodi, yn cymryd yr un cyfredol.

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

Cofrestru-Autologon

Yn y bloc paramedrau, mae'r sgript yn derbyn y paramedrau Enw Defnyddiwr a Chyfrinair. Os na phenodwyd Enw Defnyddiwr, defnyddir enw'r defnyddiwr presennol.

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

Mae rhedeg y sgript hon yn edrych fel hyn:

Set-Autologon -Password "PlaintextPassword"

Sut i ddefnyddio

Nawr gadewch i ni edrych ar sut mae'r awdur ei hun yn defnyddio hyn i gyd. Sut i ddefnyddio gweinydd cyhoeddus Minecraft yn iawn ar Windows. Gadewch i ni ddechrau o'r cychwyn cyntaf.

1. Creu defnyddiwr

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

2. Cofrestrwch y dasg i redeg y sgript

Gallwch gofrestru gan ddefnyddio modiwl fel hyn:

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

Neu defnyddiwch offer safonol:

$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. Galluogi auto-mewngofnodi ac ailgychwyn y peiriant

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

Cwblhau

Gwnaeth yr awdur y sgript, gan gynnwys ar gyfer ei hun, felly, bydd yn hapus i wrando ar eich awgrymiadau ar gyfer gwella'r sgript. Mae'r awdur yn gobeithio bod yr holl god hwn o leiaf yn ddefnyddiol iawn i chi, a bod yr erthygl yn ddiddorol.

Y sgript cychwyn gweinydd Minecraft perffaith

Ffynhonnell: hab.com

Ychwanegu sylw