L'auteur aime beaucoup le jeu et il est lui-mĂȘme l'administrateur d'un petit serveur "purement pour les amis". Comme d'habitude chez les amateurs, tout est modulĂ© sur le serveur, et cela entraĂźne l'instabilitĂ© du travail et du fait de la chute. Ătant donnĂ© que l'auteur connaĂźt mieux Powershell que l'emplacement des magasins dans sa rue, il a dĂ©cidĂ© de faire "Le meilleur script de lancement de Minecraft 2020 ". Le mĂȘme script a servi de base au modĂšle sur le marchĂ© Ruvds . Mais toutes les sources sont dĂ©jĂ dans l'article. Maintenant, dans l'ordre, comment tout cela s'est produit.Nous avons besoin d'Ă©quipes
Journalisation alternative
AprĂšs avoir mis quelques mods de plus, j'ai trouvĂ© que le serveur semblait planter sans dĂ©clarer la guerre. Le serveur n'a pas Ă©crit d'erreurs dans latest.log ou debug, et la console, qui Ă©tait censĂ©e Ă©crire et arrĂȘter cette erreur, a Ă©tĂ© fermĂ©e.Ne veut pas Ă©crire - pas besoin. Nous avons Powershell avec l' applet de commande Tee-Object , qui prend un objet et l'affiche dans un fichier et dans la console en mĂȘme temps..\handler.ps1 | Tee-Object .\StandardOutput.txt -Append
De cette façon, Powershell récupérera StandardOutput et l'écrira dans un fichier. N'essayez pas d'utiliser Start-Process car il renverra System.ComponentModel.Component, pas StandardOutput, et -RedirectStandardOutput rendra impossible l'accÚs à la console, ce que nous voulons éviter.Lancer des arguments
En mettant la mĂȘme paire de mods, l'auteur a remarquĂ© que le serveur manque Ă©galement de RAM. Et cela doit changer les arguments de dĂ©marrage. Au lieu de les changer Ă chaque fois dans start.bat, que tout le monde utilise, utilisez simplement ce script.Puisque Tee-Object ne lit StandardOutput que lorsque l'exĂ©cutable est appelĂ© «Right So», vous devrez crĂ©er un autre script. Ce script exĂ©cutera Minecraft lui-mĂȘme. Commençons par les arguments.Afin de se livrer Ă la paresse ultime Ă l'avenir, le script doit collecter les arguments de dĂ©marrage Ă la volĂ©e. Pour ce faire, commencez par rechercher la derniĂšre version de forge .$forge = ((Get-ChildItem | Where-Object Name -Like "forge*").Name | Sort-Object -Descending) | Select-Object -last 1
Avec l'aide de sort-object, nous prendrons toujours l'objet avec le plus grand chiffre, peu importe combien vous les y mettez. La paresse ultime.Vous devez maintenant affecter de la mémoire au serveur. Pour ce faire, prenez la quantité de mémoire systÚme et écrivez sa quantité en chaßne.$ram = ((Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb)
$xmx = "-Xms" + $ram + "G"
Redémarrage automatique correct
L'auteur a vu des fichiers .bat d'autres personnes, mais ils n'ont pas pris en compte la raison pour laquelle le serveur a Ă©tĂ© arrĂȘtĂ©. Est-il gĂȘnant que si vous avez juste besoin de modifier le fichier mod ou de supprimer quelque chose?Faisons maintenant le bon redĂ©marrage. L'auteur a prĂ©cĂ©demment rencontrĂ© d'Ă©tranges scripts qui ont redĂ©marrĂ© le serveur malgrĂ© le fait que le serveur s'est arrĂȘtĂ©. Nous utiliserons exitcode. Java utilise 0 comme rĂ©ussite, donc nous danserons.CrĂ©ez d'abord une fonction qui redĂ©marrera le serveur s'il ne se termine pas.function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
Le script restera dans la boucle jusqu'Ă ce que le serveur de sa propre console s'arrĂȘte normalement Ă l'aide de la commande / stop.Si nous dĂ©cidions tous d'automatiser, ce serait bien de recueillir la date de lancement, l'achĂšvement, ainsi que la raison de l'achĂšvement.Pour ce faire, nous Ă©crivons le rĂ©sultat Start-Process dans une variable. Dans le script, cela ressemble Ă ceci:$global:Process = Start-Process -FilePath "C:\Program Files (x86)\common files\Oracle\Java\javapath_target_*\java.exe" -ArgumentList "$xmx -server -jar $forge nogui" -Wait -NoNewWindow -PassThru
Et puis nous écrivons les résultats dans un fichier. Voici ce qui nous revient dans la variable:$global:Process.StartTime
$global:Process.ExitCode
$global:Process.ExitTime
Tout cela en utilisant Add-Content peut ĂȘtre ajoutĂ© au fichier. AprĂšs avoir peignĂ© un peu, nous obtenons un tel script, et l'appelons 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
Exécutons maintenant le script avec le lancement du gestionnaire.Démarrage correct
L'auteur veut qu'un module lance Minecraft de diffĂ©rentes versions Ă partir de n'importe quel chemin, et puisse Ă©galement mettre les journaux dans un dossier spĂ©cifique.Le problĂšme est que le processus doit ĂȘtre dĂ©marrĂ© par l'utilisateur qui est sur le systĂšme. Cela peut ĂȘtre fait via le bureau ou WinRm. Si vous dĂ©marrez le serveur au nom du systĂšme ou mĂȘme de l'administrateur, mais que vous ne vous connectez pas, Server.jar ne pourra mĂȘme pas lire eula.txt et dĂ©marrer.Nous pouvons activer la connexion automatique au systĂšme en ajoutant trois entrĂ©es au registre.New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1 -ErrorAction SilentlyContinue
Ce n'est pas prudent. Le login et le mot de passe sont indiqués ici en texte clair, vous devez donc démarrer un utilisateur individuel qui a accÚs au niveau utilisateur, ou dans un groupe encore plus restreint, pour démarrer le serveur. L'utilisation d'un administrateur standard pour cela est fortement déconseillée.Avec saisie automatique triée. Vous devez maintenant enregistrer une nouvelle tùche sous le serveur. Nous exécuterons la commande à partir de Powershell, elle ressemblera donc à ceci:$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
Assembler le module
Maintenant, transformons tout en modules qui peuvent ĂȘtre utilisĂ©s plus tard. Tout le code des scripts prĂȘts Ă l'emploi est ici, importez et utilisez.Vous pouvez utiliser sĂ©parĂ©ment tout ce qui est dĂ©crit ci-dessus si vous ne voulez pas vous embĂȘter avec les modules.Start-minecraft
Tout d'abord, nous allons crĂ©er un module qui ne fera que cela, exĂ©cuter un script qui Ă©coutera et enregistrera la sortie standard.Dans le bloc de paramĂštres, il demande Ă partir de quel dossier lancer Minecraft et oĂč mettre le journal.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
Et vous devrez exécuter minecraft comme ceci:Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"
Passons maintenant au Handler.ps1 prĂȘt Ă l'emploiPour que notre script puisse accepter des paramĂštres lors de son appel, nous devons Ă©galement spĂ©cifier un bloc de paramĂštres. Veuillez noter qu'il dĂ©marre Oracle Java, si vous utilisez une distribution diffĂ©rente, vous devrez modifier le chemin d'accĂšs au fichier exĂ©cutable.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 files\Oracle\Java\javapath_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
Register-minecraft
Le script rĂ©pĂšte pratiquement Start-Minecraft, sauf qu'il n'enregistre qu'une nouvelle tĂąche. Accepte les mĂȘmes arguments. Le nom d'utilisateur, s'il n'est pas spĂ©cifiĂ©, prend le nom actuel.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
S'inscrire-connexion automatique
Dans le bloc de paramÚtres, le script accepte le paramÚtre Username et Password. Si le nom d'utilisateur n'a pas été spécifié, le nom de l'utilisateur actuel est utilisé.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:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
if ($null -eq $i) {
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
Write-Verbose "Set-Autologon will enable user auto logon."
}
else {
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value $Username
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $Password
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value 1
}
Write-Verbose "Autologon was set successfully."
}
L'exécution de ce script ressemble à ceci:Set-Autologon -Password "PlaintextPassword"
Comment utiliser
Nous allons maintenant examiner comment l'auteur lui-mĂȘme utilise tout cela. Comment dĂ©ployer le serveur public Minecraft sur Windows. Commençons par le tout dĂ©but.1. CrĂ©ez un utilisateur$pass = Get-Credential
New-LocalUser -Name "MinecraftServer" -Password $pass.Password -AccountNeverExpires -PasswordNeverExpires -UserMayNotChangePassword
2. Enregistrez la tùche d'exécution du script.Vous pouvez vous inscrire à l'aide du module, comme suit:Register-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\" -User "MInecraftServer" -TaskName "MinecraftStarter"
Ou utilisez les outils standard:$Trigger = New-ScheduledTaskTrigger -AtLogOn
$User = "ServerAdmin"
$PS = New-ScheduledTaskAction -Execute 'PowerShell.exe" -Argument "Start-Minecraft -Type Forge -LogFile "C:\minecraft\stdout.txt" -MinecraftPath "C:\minecraft\"'
Register-ScheduledTask -TaskName "StartSSMS" -Trigger $Trigger -User $User -Action $PS -RunLevel Highest
3. Activez la connexion automatique au systÚme et redémarrez la machineSet-Autologon -Username "MinecraftServer" -Password "Qw3"
AchĂšvement
L'auteur a fait le script, y compris pour lui-mĂȘme, par consĂ©quent, il sera heureux d'entendre vos suggestions pour amĂ©liorer le script. L'auteur espĂšre que tout ce code vous a Ă©tĂ© au moins d'une utilitĂ© minimale, et l'article est intĂ©ressant.