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
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.
Ffynhonnell: hab.com