ืืืืืจ ืืืื ืืืื ืืช ืืืฉืืง, ืืืื ืขืฆืื ืื ืื ืฉืจืช ืงืื "ืจืง ืืืืจืื". ืืืงืืื ืืงืจื ืืืืืื, ืืื ืืฉืจืช ืืืืืื, ืืื ืืืจืจ ืื ืืฆืืืืช ืืืชืืฆืื ืืื ืงืจืืกืืช. ืืืืืื ืฉืืืืืจ ืฉื Powershell ืืืืข ืืื ืืืชืจ ืืืืืงืื ืฉื ืืื ืืืืช ืืจืืื ืฉืื, ืืื ืืืืื ืืขืฉืืช "ืืชืกืจืื ืืืื ืืืืชืจ ืืืฉืืง ืืช Minecraft 2020" ืืืชื ืกืงืจืืคื ืฉืืืฉ ืืืกืืก ืืชืื ืืช ื
ืืคืงืืืืช ืฉืื ืื ื ืฆืจืืืื
ืจืืฉืื ืืืืคื
ืืื ืืื, ืืืืจ ืืชืงื ืช ืขืื ืืื ืืืคื ืื, ืืืืืชื ืฉืืฉืจืช, ืืื ืื ืจืื, ืงืืจืก ืืืื ืืืืจืื ืืืืื. ืืฉืจืช ืื ืืชื ืฉืืืืืช ื- latest.log ืื ื-debug, ืืืงืื ืกืืื, ืฉืืชืืืืจืื ืืืืชื ืฆืจืืื ืืืชืื ืืช ืืฉืืืื ืืื ืืืืคืกืืง, ื ืกืืจื.
ืื ืืื ืื ืจืืฆื ืืืชืื, ืืื ืื ืฆืจืื. ืืฉ ืื ื Powershell ืขื cmdlet ืื-ืืืืืืงื, ืฉืืืงื ืืืืืืงื ืืืืฆืื ืืืชื ืืงืืืฅ ืืืงืื ืกืืื ืื ืืื ืืช.
.handler.ps1 | Tee-Object .StandardOutput.txt -Append
ืืืจื ืื, Powershell ืชืืกืืฃ ืืช StandardOutput ืืชืืชืื ืืืชื ืืงืืืฅ. ืื ืชื ืกื ืืืฉืชืืฉ ืืชืื-ืชืืืืืื ืื ืืืืืจ ืืช System.ComponentModel.Component ืืื StandardOutput, ื-RedirectStandardOutput ืื ืืืคืฉืจ ืืืืื ืก ืืงืื ืกืืื, ืืื ืื ืฉืื ืื ื ืจืืฆืื ืืืืื ืข.
ืืคืขื ืืืขืื ืื
ืืืืจ ืืชืงื ืช ืืืชื ืืื ืืืคื ืื, ืืืืืจ ืฉื ืื ืฉืื ืืฉืจืช ืืื ืืกืคืืง ืืืืจืื RAM. ืืื ืืืืื ืืฉื ืืช ืืช ืืืขืื ื ืืืฉืงื. ืืืงืื ืืฉื ืืช ืืืชื ืืื ืคืขื ื-start.bat, ืฉืืืื ืืฉืชืืฉืื ืื, ืคืฉืื ืืฉืชืืฉ ืืกืงืจืืคื ืืื.
ืืืืืื ืฉ-Tee-Object ืงืืจื StandardOutput ืจืง ืืืฉืจ ืงืืืฅ ืืืคืขืื ื ืงืจื "Just Like This", ืชืฆืืจื ืืืฆืืจ ืกืงืจืืคื ืืืจ. ืกืงืจืืคื ืื ืืืฉืง ืขื ืืื 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 ืืื ืฉืื ืืืจืื, ืื ืื ืื ืืงืื ืืืฉืืื ืืช ืืกืืื ืฉืืืืื ืืฉืจืช ืืืคืกืง. ืื ืื ื ืื, ืื ืื ืืชื ืจืง ืฆืจืื ืืฉื ืืช ืืช ืงืืืฅ ืืืื ืื ืืืืืง ืืฉืื?
ืขืืฉืื ืืืื ื ืขืฉื ืืคืขืื ืืืืฉ ืืื ืฉืฆืจืื. ืืืืืจ ื ืชืงื ืืขืืจ ืืกืงืจืืคืืื ืืืืจืื ืฉืืคืขืืื ืืืืฉ ืืช ืืฉืจืช ืืื ืงืฉืจ ืืื ืืฉืจืช ื ืืื. ื ืฉืชืืฉ ืืงืื ืืฆืืื. Java ืืฉืชืืฉืช ื-0 ืืืฆืืื, ืื ื ืจืงืื ืืืื.
ืจืืฉืืช, ืืืื ื ืืฆืืจ ืคืื ืงืฆืื ืฉืชืคืขืื ืืืืฉ ืืช ืืฉืจืช ืื ืืื ื ืืฉืืช.
function Get-MinecraftExitCode {
do {
if ($global:Process.ExitCode -ne 0) {
Write-Log
Restart-Minecraft
}
else {
Write-Log
}
} until ($global:Process.ExitCode -eq 0)
}
ืืกืงืจืืคื ืืืฉืืจ ืืืืืื ืขื ืฉืืฉืจืช ืืืื ืืจืืื ืืืืกืืฃ ืฉืื ืืืืฆืขืืช ืืคืงืืื /stop.
ืื ื ืืืื ืืืคืื ืืื ืืืืืืืื, ืื ืื ืืืื ื ืืื ืืืกืืฃ ืืช ืชืืจืื ืืืชืืื, ืชืืจืื ืืืฉืืื, ืืื ืืช ืกืืืช ืืืฉืืื.
ืืฉื ืื, ืื ื ืืืชืืื ืืช ืืชืืฆืื ืฉื 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
ืื ืื ืืืื. ืืื ืืกื ืืืกืืกืื ืืกืืื ืื ืืื ืืืงืกื ืคืฉืื, ืื ืฉืืื ืืืคืขืื ืืช ืืฉืจืช ืฆืจืื ืืืฆืืจ ืืฉืชืืฉ ื ืคืจื ืฉืืฉ ืื ืืืฉื ืืจืืช ืืืฉืชืืฉ, ืื ืืงืืืฆื ืฆืจื ืขืื ืืืชืจ. ืื ืืืืื ืื ืืืืืฅ ืืืฉืชืืฉ ืืื ืื ืืขืจืืช ืจืืื ืืฉืืื ืื.
ืกืืืจื ื ืืช ืืืชืืืจืืช ืืืืืืืืืช. ืืขืช ืขืืื ืืจืฉืื ืืฉืืื ืืืฉื ืขืืืจ ืืฉืจืช. ืื ื ื ืจืืฅ ืืช ืืคืงืืื ื- Powershell, ืื ืฉืืื ืชืืจืื ืื:
$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
ืืจืืืช ืืืืืื
ืขืืฉืื ืืืื ื ืื ืืก ืืื ืืืืืืืื ืฉื ืืชื ืืืฉืชืืฉ ืืื ืืืืืจ ืืืชืจ. ืื ืืงืื ืืกืงืจืืคืืื ืืืื ืื ื ืืฆื ืืื, ืืืื ืืืฉืชืืฉ.
ืืชื ืืืื ืืืฉืชืืฉ ืืื ืื ืฉืชืืืจ ืืขืื ืื ืคืจื ืื ืืชื ืื ืจืืฆื ืืืจืื ืขื ืืืืืืื.
ืืชืื-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 ืืืืื ืืฉืืืืฉ
ืืื ืฉืืกืงืจืืคื ืฉืื ื ืืงืื ืคืจืืืจืื ืืฉื ืงืจื, ืขืืื ื ืืฆืืื ืื ืืืืง ืคืจืืืจืื. ืฉืื ืื, ืืื ืืจืืฅ ืืช Oracle Java, ืื ืืชื ืืฉืชืืฉ ืืืคืฆื ืืืจืช ืชืฆืืจื ืืฉื ืืช ืืช ืื ืชืื ืืงืืืฅ ืืืคืขืื.
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 ืฆืืืืจื ื-Windows. ืืืื ื ืชืืื ืืืืชืืื.
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"
ืืฉืืื
ืืืืืจ ืืืื ืืช ืืชืกืจืื, ืืืื ืืขืฆืื, ืืื ืืื ืืฉืื ืืืงืฉืื ืืืฆืขืืช ืฉืืื ืืฉืืคืืจ ืืชืกืจืื. ืืืืืจ ืืงืืื ืฉืื ืืงืื ืืื ืืื ืืืขืื ืื ืืคืืืช ืืืืคื ืืื ืืืื, ืืฉืืืืืจ ืืื ืืขื ืืื.
ืืงืืจ: www.habr.com