د بشپړ Minecraft سرور پیل کولو سکریپټ

د بشپړ Minecraft سرور پیل کولو سکریپټ

لیکوال د لوبې سره ډیره مینه لري، او هغه پخپله د کوچني سرور مدیر دی "په بشپړه توګه د ملګرو لپاره." لکه څنګه چې د شوقیانو ترمنځ معمول دی، په سرور کې هرڅه بدل شوي، او دا بې ثباتۍ ته اړتیا لري او په پایله کې، ټکر کیږي. څرنګه چې د پاورشیل لیکوال د هغه په ​​​​کوڅه کې د پلورنځیو موقعیت څخه ښه پوهیږي ، نو پریکړه یې وکړه چې "د Minecraft 2020 لانچ کولو لپاره غوره سکریپټ" ورته سکریپټ د کېنډۍ لپاره د اساس په توګه کار کاوه د Ruvds بازار. مګر ټولې سرچینې لا دمخه په مقاله کې دي. اوس، په ترتیب سره، دا ټول څنګه ترسره شوي.

هغه امرونه چې موږ ورته اړتیا لرو

بدیل ننوتل

یوه ورځ، د یو څو نورو موډونو نصبولو وروسته، ما وموندله چې سرور، ظاهرا، د جګړې اعلان کولو پرته ټکر شوی. سرور په latest.log یا debug کې تېروتنې نه دي لیکلي، او کنسول، کوم چې په تیوري کې باید دا تېروتنه لیکلې وای او بنده شوې وای.

که هغه نه غواړي لیکل وکړي، هغه اړتیا نلري. موږ د cmdlet سره Powershell لرو Tee-څیز، کوم چې یو څیز اخلي او په ورته وخت کې یې فایل او کنسول ته رسوي.

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

په دې توګه، پاورشیل به سټنډرډ آوټ پټ غوره کړي او فایل ته به یې ولیکي. د کارولو هڅه مه کوئ پیل - پروسهځکه چې دا به د StandardOutput پرځای System.ComponentModel.Component بیرته راولي، او -RedirectStandardOutput به کنسول ته د ننوتلو لپاره ناممکن کړي، کوم چې موږ یې مخنیوی غواړو.

دلیلونه پیل کړئ

د ورته جوړه ماډلونو نصبولو وروسته، لیکوال ولیدل چې سرور هم کافي رام نلري. او دا د لانچ دلیلونو بدلولو ته اړتیا لري. په start.bat کې هر ځل د دوی د بدلولو پرځای، کوم چې هرڅوک کاروي، یوازې دا سکریپټ وکاروئ.

له هغه ځایه چې Tee-Object یوازې StandardOutput لوستل کیږي کله چې د اجرا وړ "د دې په څیر" ویل کیږي، تاسو باید یو بل سکریپټ جوړ کړئ. دا سکریپټ به پخپله د Minecraft لخوا پیل شي. راځئ چې د دلیلونو سره پیل وکړو.

د دې لپاره چې په راتلونکي کې په وروستي سستۍ کې ښکیل شي، سکریپټ باید په الوتنه کې د لانچ دلیلونه راټول کړي. د دې کولو لپاره، راځئ چې د وروستي نسخې لټون پیل کړو فورج.

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

د sort-object په کارولو سره، موږ به تل د لوی شمیر سره اعتراض واخلو، مهمه نده چې تاسو د دوی څومره شمیر هلته واچوئ. حتمي سستي.

اوس تاسو اړتیا لرئ چې سرور ته حافظه وټاکئ. د دې کولو لپاره، د سیسټم حافظه اندازه واخلئ او د هغې اندازه په تار کې ولیکئ.

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

سم اتوماتیک بیا پیل کول

لیکوال د نورو خلکو .bat فایلونه لیدلي ، مګر دوی د سرور بندیدو لامل په پام کې نه دی نیولی. دا ناشونی دی، که تاسو یوازې د موډ فایل بدلولو یا یو څه حذف کولو ته اړتیا لرئ؟
اوس راځئ چې یو مناسب بیا پیل وکړو. لیکوال مخکې د عجیب سکریپټونو سره مخ شو چې سرور یې بیا پیل کړ پرته لدې چې ولې سرور بند شو. موږ به د وتلو کوډ وکاروو. جاوا 0 د بریالیتوب په توګه کاروي، نو موږ به له دې ځایه نڅا وکړو.

لومړی، راځئ چې یو فنکشن جوړ کړو چې سرور به بیا پیل کړي که دا ناکام شي.

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

سکریپټ به په لوپ کې پاتې شي تر هغه چې سرور په نورمال ډول د خپل کنسول څخه د / سټاپ کمانډ په کارولو سره بند نشي.

که موږ پریکړه وکړو چې هرڅه اتومات کړئ، نو دا به ښه وي چې د پیل نیټه، د بشپړیدو نیټه، او د بشپړیدو دلیل هم راټول کړئ.

د دې کولو لپاره، موږ د Start-Process پایله په متغیر کې لیکو. په سکریپټ کې دا داسې ښکاري:

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

او بیا موږ پایلې په فایل کې لیکو. دا هغه څه دي چې موږ ته په متغیر کې راګرځي:

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

دا ټول د Add-content په کارولو سره فایل ته اضافه کیدی شي. د دې یو څه ګډولو سره ، موږ دا سکریپټ ترلاسه کوو ، او راځئ چې ورته 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

اوس راځئ چې یو سکریپټ جوړ کړو چې هینډلر پیل کړي.

سمه پیل کول

لیکوال غواړي په یوه ماډل کې د هرې لارې څخه د Minecraft مختلف نسخې پرمخ بوځي، او همدارنګه په یو ځانګړي فولډر کې د لاګونو ذخیره کولو وړ وي.

ستونزه دا ده چې پروسه باید د یو کارونکي لخوا پیل شي چې سیسټم ته ننوتلی وي. دا د ډیسټاپ یا WinRm له لارې ترسره کیدی شي. که تاسو سرور د سیسټم کارونکي یا حتی د مدیر په توګه پرمخ وړئ ، مګر لاګ ان نه یاست ، نو Server.jar به حتی د eula.txt لوستلو او پیل کولو توان ونلري.

موږ کولی شو په راجسټری کې د دریو ننوتلو اضافه کولو سره اتوماتیک ننوتل فعال کړو.

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

دا خوندي نه دی. ننوتل او پټنوم دلته په ساده متن کې ښودل شوي ، نو د سرور پیل کولو لپاره تاسو اړتیا لرئ یو جلا کارن رامینځته کړئ چې د کارونکي په کچه لاسرسی ولري ، یا حتی په محدود ګروپ کې. دا په کلکه د دې لپاره د معیاري مدیر کارولو سپارښتنه نه کیږي.

موږ د اتوماتیک ننوتلو ترتیب کړی. اوس تاسو اړتیا لرئ د سرور لپاره نوې دنده ثبت کړئ. موږ به د پاورشیل څخه قومانده پرمخ وړو، نو دا به داسې ښکاري:

$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

د ماډل راټولول

اوس راځئ چې هرڅه په ماډلونو کې واچوو چې وروسته کارول کیدی شي. د چمتو شوي سکریپټونو لپاره ټول کوډ دلته دی، وارد او استعمال کړئ.

تاسو کولی شئ هر څه چې پورته بیان شوي په جلا توګه وکاروئ که تاسو نه غواړئ د ماډلونو سره زحمت وکړئ.

Start-Minecraft

لومړی، راځئ یو ماډل جوړ کړو چې د سکریپټ چلولو پرته به نور څه ونه کړي چې معیاري محصول ته غوږ ونیسي او ثبت کړي.

د پیرامیټرو بلاک کې ، هغه پوښتنه کوي چې له کوم فولډر څخه Minecraft لانچ کول او چیرې لاګ کیښودل شي.

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

او تاسو به د دې په څیر Minecraft لانچ کولو ته اړتیا ولرئ:

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

اوس راځئ چې د کارولو لپاره چمتو Handler.ps1 ته لاړ شو

د دې لپاره چې زموږ سکریپټ د پیرامیټرو منلو لپاره کله چې ویل کیږي، موږ باید د پیرامیټر بلاک مشخص کړو. مهرباني وکړئ په یاد ولرئ ، دا اوریکل جاوا چلوي ، که تاسو مختلف توزیع کاروئ نو تاسو به د اجرا وړ فایل ته لاره بدلولو ته اړتیا ولرئ.

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

راجستر - Minecraft

سکریپټ په عملي توګه د Start-Minecraft په څیر دی، پرته له دې چې دا یوازې یو نوی دنده راجستر کوي. ورته دلیلونه مني. کارن نوم، که مشخص شوی نه وي، اوسنی نوم اخلي.

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

راجستر - اتوماتیک

د پیرامیټر بلاک کې، سکریپټ د کارن نوم او پټنوم پیرامیټونه مني. که د کارن نوم نه وي مشخص شوی، د اوسني کارونکي نوم کارول کیږي.

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

د دې سکریپټ چلول داسې ښکاري:

Set-Autologon -Password "PlaintextPassword"

څنګه کارول کیږي

اوس راځئ وګورو چې لیکوال پخپله دا ټول کاروي. په وینډوز کې د عامه Minecraft سرور په سمه توګه ځای په ځای کولو څرنګوالی. راځئ چې له پیل څخه پیل وکړو.

1. یو کارن جوړ کړئ

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

2. د سکریپټ چلولو لپاره دنده راجستر کړئ

تاسو کولی شئ د دې ماډل په کارولو سره راجستر شئ:

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

یا معیاري وسایل وکاروئ:

$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. د اتوماتیک ننوتل فعال کړئ او ماشین ریبوټ کړئ

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

بشپړ کول

لیکوال د خپل ځان په ګډون سکریپټ جوړ کړی، نو هغه به خوشحاله وي چې د سکریپټ د ښه کولو لپاره ستاسو وړاندیزونو ته غوږ ونیسي. لیکوال هیله لري چې دا ټول کوډ لږترلږه ستاسو لپاره ګټور و، او دا مقاله په زړه پورې وه.

د بشپړ Minecraft سرور پیل کولو سکریپټ

سرچینه: www.habr.com

Add a comment