Autori e do të lodhë lojën dhe ai është gjithashtu administrator i një serveri të vogël "për shokët e mi". Si zakonisht mes adhuruesve, gjithçka në server është modifikuar, gjë që sjell paqëndrueshmëri në punë dhe, si pasojë, rëniet. Duke qenë se ai e njeh Powershell më mirë se vendndodhjen e dyqaneve në rrugën e tij, ai mori vendimin të bëjë "Skripti më i Mirë për Nisjen e Minecraft 2020“. Ky skript shërbeu gjithashtu si themel për një model në . Por të gjitha burimet janë tashmë në artikull. Tani, hap pas hapi, si ndodhi gjithçka.
Komandat që na duhen
Logimin alternativ
Njëherë, pasi vendosa disa modifikime të tjera, zbulova se serveri, për sa duket, po rrëzohej pa paralajmërim. Serveri nuk shkroi gabime në latest.log ose në debug, dhe konsola, e cila teori duhet ta kishte shkruar këtë gabim dhe duhej të kishte ndaluar, ishte mbyllur.
Nëse nuk dëshiron të shkruajë – nuk është nevojë. Ne kemi Powershell me komandletin Tee-Object, i cili merr objektin dhe e nxjerr atë në një skedar dhe në konsolë njëkohësisht.
.handler.ps1 | Tee-Object .StandardOutput.txt -AppendKështu, Powershell do të marrë StandardOutput dhe do ta regjistrojë atë në skedar. Mos e provoni të përdorni Start-Process, sepse ai do të kthejë System.ComponentModel.Component, jo StandardOutput, dhe -RedirectStandardOutput do ta bllokojë futjen në konsolë, gjë që duam të evitojmë.
Argumentet e nisjes
Pasi vendosa atë çiftin e modifikimeve, autori vuri re se serverit i mungonte gjithashtu RAM-i. Dhe kjo kërkon të ndryshoni argumentet e nisjes. Në vend që ta ndryshoni çdo herë në start.bat, të cilin të gjithë e përdorin, thjesht përdorni këtë skript.
Duke qenë se Tee-Object lexon StandardOutput, vetëm kur skedari ekzekutohet "Saktësisht kështu", do të duhet të bëjmë një skript tjetër. Ky skript do të nisë Minecraft-in. Të fillojmë me argumentet.
Për ta bërë për të ardhmen të përkushtoheni në një leni ultimate, skripti duhet të mbledhë argumentet e nisjes në flakë. Prandaj, do të fillojmë me gjetjen e versionit të fundit forge.
$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1Me ndihmën e sort-object ne gjithmonë do të marrim objektin me numrin më të madh, pavarësisht se sa do t'i vendosni atje. Lenia ultimate.
Tani duhet të caktojmë RAM-in e serverit. Për këtë, marrim numrin e memories sistemike dhe e regjistrojmë summën e saj në string.
$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"Rikthimi automatik i duhur
Autori ka parë skedarë .bat nga njerëz të tjerë, por ata nuk merreshin me arsyen pse serveri ishte ndalur. Nuk është e lehtë, çfarë nëse thjesht duhej të ndryshoja skedarin e modës apo të hiqja diçka?
Tani do ta bëjmë rikthimin e duhur. Autori më parë kishte hasur në skripta të çuditshme që rikthenin serverin pa marrë parasysh arsyen pse ai shkëputej. Ne do të përdorim exitcode. Java përdor 0 si përfundim të suksesshëm, për këtë do të merremi.
Së pari, do të krijojmë një funksion që do të rikthejë serverin në rast se ai ndalet në mënyrë të paracaktuar.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Skripti do të qëndrojë në cikël derisa serveri të ndalojë punën në mënyrë normale, me anë të komandës /stop nga konsola e tij.
Nëse gjithçka duam ta automatizojmë, atëherë do të ishte mirë të mbledhim datën e nisjes, përfundimit dhe po ashtu arsyen e përfundimit.
Për këtë, ne regjistrojmë rezultatin e Start-Process në një variabël. Në skript, kjo duket kështu:
$global:Process = Start-Process -FilePath "C:Program Files (x86)common filesOracleJavajavapath_target_*java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThruDhe më pas regjistrojmë rezultatet në skedar. Kështu kthehet në variablin tonë:
$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTimeTë gjitha këto me ndihmën e Add-Content mund të shtohen në skedar. Pas pak rregullimi, ne kemi këtë skript dhe do ta quajmë handler.ps1.
Add-Content -Value "Koha e nisjes:" -Path $Logfile
$global:Process.StartTime
Add-Content -Value "Kod i daljes:" -Path $Logfile
$global:Process.ExitCode | Add-Content $Logfile
Add-Content -Value "Koha e daljes:" -Path $Logfile
$global:Process.ExitTime | Add-Content $Logfile
Tani le ta organizojmë skriptin me nisjen e handler-it.
Autonizimi i duhur
Autori dëshiron të nisë Minecraft-in e versioneve të ndryshme nga çdo rrugë me një modul, dhe gjithashtu të ketë mundësinë të ruajë loget në një dosje të caktuar.
Problemi është se procesi duhet ta nxisë përdoruesi që është në sistem. Kjo mund të bëhet përmes desktopit ose WinRm. Nëse e nisni serverin nën emrin e sistemit ose madje si administrator, por pa u identifikuar, atëherë Server.jar nuk do të mund të lexojë as eula.txt dhe të nisë.
Të aktivizojmë hyrjen automatike në sistem mund të bëhet duke shtuar tre regjistra në regjistor.
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 SilentlyContinueKjo nuk është e sigurt. Emri i përdoruesit dhe fjalëkalimi jepen këtu në format tekst, prandaj për lansimin e serverit duhet të krijoni një përdorues tjetër, i cili ka qasje në nivel përdoruesi, ose në ndonjë grup më të ngushtë. Përdorimi i administratorit standard për këtë është kategorikisht i papranueshëm.
Kemi përfunduar me autologimin. Tani duhet të regjistrojmë një detyrë të re për serverin. Do ta ekzekutojmë komandën nga Powershell, ndaj do të duket kështu:
$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 HighestPo krijojmë modul
Tani le të organizojmë gjithçka në module, të cilat mund të përdoren më vonë. Të gjithë kodin e skriptit të gatshëm e gjeni këtu, importoni dhe përdorni.
E gjithë ajo që përshkruam më sipër mund të përdoret veçmas, nëse nuk doni të merakoseni me modulet.
Start-Minecraft
Së pari, do të krijojmë një modul, i cili do të bëjë vetëm se do të nisë skriptin, i cili do të dëgjojë dhe regjistrojë standardoutput.
Në bllokun e parametrave, ai kërkon nga cili folder të ekzekutohet Minecraft dhe ku të ruhet logu.
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-MinecraftDhe për të nisur Minecraft duhet ta bëjmë kështu:
Start-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft"Tani kalojmë në Handler.ps1 të gatshme për përdorim
Që skripti ynë të mund të pranojë parametra kur thirret, gjithashtu duhet të specifikohet blloku i parametrave. Vini re, ai nis Oracle Java, nëse përdorni një shpërndarje tjetër, do të duhet të ndryshoni rrugën te skedari ekzekutiv.
param (
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$type,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$MinecraftPath,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$StandardOutput
)
Set-Location $MinecraftPath
function Restart-Minecraft {
Write-host "=============== Duke nisur serverin e lojërave ============"
$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 "Koha e nisjes:" $global:Process.StartTime
Write-host "Kodi i daljes:" $global:Process.ExitCode
Write-host "Koha e daljes:" $global:Process.ExitTime
Write-host "=============== Serveri i lojërave u ndal ============="
}
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
Regjistro-Minecraft
Skripti, në thelb, është një ripërsëritje e Start-Minecraft, përveç faktit se regjistron vetëm një detyrë të re. Pranon të njëjtat argumente. Emri i përdoruesit, nëse nuk është specifikuar, merr emrin e përdoruesit aktual.
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-MinecraftRegjistro-Autologon
Në bllokun e parametrave, skripti pranon parametrin Username dhe Password. Nëse Username nuk është specifikuar, përdoret emri i përdoruesit aktual.
function Set-Autologon {
param (
[Parameter(
HelpMessage="Emri i përdoruesit për autologin")]
$Username = $env:USERNAME,
[Parameter(Mandatory=$true,
HelpMessage="Fjalëkalimi i përdoruesit")]
[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 do të mundësojë autologimin e përdoruesit."
}
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 "Autologimi u vendos me sukses."
}
Startimi i këtij skripti duket kështu:
Set-Autologon -Password "PlaintextPassword"Si të përdorni
Tani do të shqyrtojmë se si autori përdor të gjitha këto. Si të krijoni një server publik Minecraft në Windows. Le të fillojmë nga fillimi.
1. Krijoni një përdorues
$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword2. Regjistroni detyrën për ekzekutimin e skriptit
Mund ta regjistroni duke përdorur modul, kështu:
Register-Minecraft -Type Forge -LogFile "C:minecraftstdout.txt" -MinecraftPath "C:minecraft" -User "MInecraftServer" -TaskName "MinecraftStarter"Ose mund të përdorni mjetet standarde:
$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 Highest3. Aktivizoni hyrjen automatike në sistem dhe rinisni makinën
Set-Autologon -Username "MinecraftServer" -Password "Qw3"Përfundimi
Autori krijoi skriptin, duke përfshirë edhe për vete, prandaj do të jetë i lumtur të dëgjojë propozimet tuaja për përmirësimin e skriptit. Autori shpreson që i gjithë ky kod ishte për ju të paktën minimalisht i dobishëm, dhe artikulli është interesant.
Burimi: habr.com
