Iskripthi esifanelekile sokuqalisa iseva ye-Minecraft

Iskripthi esifanelekile sokuqalisa iseva ye-Minecraft

Umbhali uwuthanda kakhulu umdlalo, futhi yena ngokwakhe ungumqondisi weseva encane “eyabangane kuphela.” Njengenjwayelo phakathi kwabasafufusa, yonke into ekuseva iyashintshwa, futhi lokhu kuhlanganisa ukungazinzi futhi, ngenxa yalokho, ukuphahlazeka. Njengoba umbhali we-Powershell azi kangcono kunendawo yezitolo emgwaqweni wakhe, unqume ukwenza "Iskripthi Esingcono Kakhulu Sokwethula i-Minecraft 2020" Iskripthi esifanayo sisebenze njengesisekelo sesifanekiso ku Imakethe yaseRuvds. Kodwa yonke imithombo isivele ikusihloko. Manje, ngokulandelana, ukuthi konke kwenziwa kanjani.

Imiyalo esiyidingayo

Okunye ukugawula

Ngolunye usuku, ngemuva kokufaka amanye ama-mods ambalwa, ngathola ukuthi iseva, ngokusobala, yayiphahlazeka ngaphandle kokumemezela impi. Iseva ayizange ibhale amaphutha kokuthi latest.log noma ku-debug, futhi ikhonsoli, okufanele ibhale leli phutha ngokombono futhi ime, ivaliwe.

Uma engafuni ukubhala, akadingi. Sine-Powershell ene-cmdlet I-Tee-Object, ethatha into futhi iyikhiphele kufayela naku-console ngesikhathi esifanayo.

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

Ngale ndlela, i-Powershell izothatha i-StandardOutput futhi iyibhale efayeleni. Ungazami ukusebenzisa Qala-Inqubongoba izobuyisela i-System.ComponentModel.Component hhayi i-StandardOutput, futhi -RedirectStandardOutput izokwenza kungenzeki ukungena kukhonsoli, okuyilokho esifuna ukukugwema.

Yethula izimpikiswano

Ngemva kokufaka leyo pair of mods, umbhali waqaphela ukuthi iseva nayo ayinayo i-RAM eyanele. Futhi lokhu kudinga ukushintsha izimpikiswano zokuqalisa. Esikhundleni sokuzishintsha njalo ku-start.bat, esetshenziswa wonke umuntu, vele usebenzise lesi script.

Njengoba i-Tee-Object ifunda kuphela i-StandardOutput lapho okusebenzisekayo kubizwa ngokuthi "Just Like This", kuzodingeka wenze esinye iskripthi. Lesi script sizokwethulwa yiMinecraft uqobo. Ake siqale ngezimpikiswano.

Ukuze uzitike ngobuvila bokugcina ngokuzayo, iskripthi kufanele siqoqe izimpikiswano zokuqalisa ngokuphazima kweso. Ukwenza lokhu, ake siqale ngokucinga inguqulo yakamuva yakha.

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

Sisebenzisa i-sort-object, sizohlala sithatha into enenombolo enkulu kunazo zonke, kungakhathaliseki ukuthi zingaki ozibeke lapho. Ubuvila bokugcina.

Manje udinga ukunika iseva imemori. Ukuze wenze lokhu, thatha inani lememori yesistimu bese ubhala inani layo ngochungechunge.

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

Lungisa ukuqalisa kabusha okuzenzakalelayo

Umbhali ubone amafayela .bat esuka kwabanye abantu, kodwa abazange bacabangele isizathu sokuthi kungani iseva imisiwe. Lokhu akulungile, kuthiwani uma udinga nje ukushintsha ifayela le-mod noma ukususa okuthile?
Manje masenze ukuqala kabusha okufanele. Umbhali ngaphambilini uhlangane nemibhalo engajwayelekile eqale kabusha iseva ngokunganaki ukuthi kungani iseva ivaliwe. Sizosebenzisa i-exitcode. I-Java isebenzisa u-0 njengempumelelo, ngakho-ke sizodansa kusuka lapha.

Okokuqala, masidale umsebenzi ozoqala kabusha iseva uma yehluleka.

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

Umbhalo uzohlala ku-loop kuze kube yilapho iseva ivala ngokujwayelekile kukhonsoli yayo isebenzisa umyalo othi/stop.

Uma sinquma ukwenza yonke into ngokuzenzakalelayo, khona-ke kungaba kuhle ukuqoqa idethi yokuqala, idethi yokuqeda, kanye nesizathu sokuqeda.

Ukuze senze lokhu, sibhala umphumela we-Start-Process ube oguquguqukayo. Kuskripthi kubonakala kanje:

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

Bese sibhala imiphumela efayeleni. Yilokhu okubuyiselwa kithi kokuguquguqukayo:

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

Konke lokhu kungengezwa kufayela kusetshenziswa okuthi Engeza-Okuqukethwe. Ngemva kokuyikama kancane, sithola lesi sikripthi, futhi masiyibize nge-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

Manje ake sakhe iskripthi esivula isibambi.

Ukuqalisa okulungile

Umbhali ufuna ukusebenzisa izinguqulo ezahlukene ze-Minecraft kusuka kunoma iyiphi indlela kumojula eyodwa, futhi akwazi ukugcina izingodo kufolda ethile.

Inkinga ukuthi inqubo kumele iqalwe ngumsebenzisi ongene ohlelweni. Lokhu kungenziwa ngedeskithophu noma ngeWinRm. Uma usebenzisa iseva njengomsebenzisi wesistimu noma njengomlawuli, kodwa ungangeni, i-Server.jar ngeke ikwazi nokufunda i-eula.txt bese iqala.

Singavumela ukungena ngemvume okuzenzakalelayo ngokungeza okufakiwe okuthathu kurejista.

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

Akuphephile. Ukungena ngemvume nephasiwedi kukhonjiswe lapha embhalweni osobala, ngakho-ke ukuze uqale iseva udinga ukwakha umsebenzisi ohlukile onokufinyelela ezingeni lomsebenzisi, noma eqenjini elincane nakakhulu. Akunconywa neze ukusebenzisa umlawuli ojwayelekile kulokhu.

Silungise ukungena ngemvume okuzenzakalelayo. Manje udinga ukubhalisa umsebenzi omusha weseva. Sizosebenzisa umyalo ovela ku-Powershell, ngakho-ke uzobukeka kanje:

$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

Ukuhlanganisa imojula

Manje ake sifake yonke into kumamojula angasetshenziswa kamuva. Yonke ikhodi yemibhalo esenziwe ngomumo ilapha, ngenisa futhi uyisebenzise.

Ungasebenzisa yonke into echazwe ngenhla ngokwehlukana uma ungafuni ukuzihlupha ngamamojula.

Qala-Minecraft

Okokuqala, ake sakhe imojuli engeke yenze lutho ngaphezu kokusebenzisa iskripthi esizolalela futhi sirekhode okukhiphayo okujwayelekile.

Ebhulokhini lemingcele, ubuza ukuthi iyiphi ifolda ezokwethula i-Minecraft nokuthi uyibeke kuphi ilogi.

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

Futhi uzodinga ukwethula i-Minecraft kanje:

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

Manje ake siqhubekele ku-Handler.ps1 elungele ukusetshenziswa

Ukuze iskripthi sethu samukele amapharamitha lapho sibizwa, sidinga futhi ukucacisa ibhulokhi yepharamitha. Sicela uqaphele, isebenzisa i-Oracle Java, uma usebenzisa ukusatshalaliswa okuhlukile uzodinga ukushintsha indlela eya efayeleni elisebenzisekayo.

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

Bhalisa-Minecraft

Umbhalo ucishe ufane ne-Start-Minecraft, ngaphandle kokuthi ubhalisa kuphela umsebenzi omusha. Yamukela izimpikiswano ezifanayo. Igama lomsebenzisi, uma lingashiwongo, lithatha elamanje.

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

Bhalisa-Autogon

Kubhulokhi yemingcele, umbhalo wamukela igama lomsebenzisi nemingcele yephasiwedi. Uma igama lomsebenzisi lingashiwongo, igama lomsebenzisi wamanje liyasetshenziswa.

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

Ukuqalisa lesi script kubonakala kanje:

Set-Autologon -Password "PlaintextPassword"

Ungayisebenzisa kanjani

Manje ake sibheke ukuthi umlobi ngokwakhe usebenzisa kanjani konke lokhu. Ungayifaka kanjani kahle iseva ye-Minecraft yomphakathi ku-Windows. Ake siqale kusukela ekuqaleni.

1. Dala umsebenzisi

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

2. Bhalisa umsebenzi ukuze uqalise iskripthi

Ungabhalisa usebenzisa imojuli efana nale:

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

Noma sebenzisa amathuluzi ajwayelekile:

$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. Nika amandla ukungena ngokuzenzakalelayo bese uqalisa kabusha umshini

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

Ukuqedela

Umbhali wenze iskripthi, kufaka phakathi yena, ngakho-ke, uzokujabulela ukulalela iziphakamiso zakho zokuthuthukisa iskripthi. Umbhali uthemba ukuthi yonke le khodi okungenani ibe usizo kancane kuwe, nokuthi isihloko besithakazelisa.

Iskripthi esifanelekile sokuqalisa iseva ye-Minecraft

Source: www.habr.com

Engeza amazwana