Проблемы автоматизации пакетных файлов

381
Fire Dragon

Итак, я хочу создать пакетный файл для моего сервера Minecraft для запуска, а затем перезапускать сервер в конце каждого дня (желательно в полночь, но также работает 24-часовой период)

Это мой загрузочный пакет, который вызывает другие пакетные файлы, чтобы открыть и запустить серверы по отдельности:

start cmd /k call BungeeStartup.bat start cmd /k call HUBStartup.bat start cmd /k call PvEStartup.bat start cmd /k call PvPStartup.bat start cmd /k call MinigamesStartup.bat start cmd /k call TownyStartup.bat start cmd /k call SecQStartup.bat 

И каждый «Startup.bat» вызывает запуск сервера следующим образом:

D: cd Minecraft 1.12 Server Files cd BungeeCord <-- and each it's respective server, of course, so I don't have to type it all out again RUNGEE.bat 

И, наконец, файлы RUN.bat выглядят так:

java -jar -Xmx350M spigot-1.12.2.jar -o true 

И это запускает все мои серверы в различных командных приглашениях. Но проблема в том, что нет никакого способа (который я знаю) с этим завершить серверы без того, чтобы я вручную вводил / останавливался на каждом сервере командной строки, а затем снова «выходил» в каждую командную строку, чтобы выйти из него. Затем я должен выполнить командный файл вручную.

Итак, мои вопросы:

  • Как мне (с пакетными файлами) завершить работу каждого сервера, а затем каждого окна командной строки, не делая это вручную
  • Как мне перезапустить их автоматически после выхода.
  • И как сделать так, чтобы это происходило один раз каждые 24 часа (или, предпочтительно, в полночь каждую ночь)

РЕДАКТИРОВАТЬ:

Итак, чтобы уточнить, как работает сервер Minecraft, я добавляю это редактирование.

Когда вы запускаете сервер, очевидно, что он запускает сервер и все, и люди могут подключаться и играть. У него есть командная строка, которую вы используете для выполнения команд и просмотра информации и всего такого. Чтобы правильно завершить работу сервера, на котором он все сохраняет и не повреждает файлы, введите в командной строке «stop». Затем он выходит из сервера и обычно выходит из командной строки, чтобы вы могли снова открыть его по желанию. Затем, с настроенными мной пакетными файлами, он не просто выходит из командной строки после ввода 'stop', он возвращает вас в каталог, чтобы вы могли продолжать использовать командную строку, как будто он больше не работает на сервере (потому что это не так), и вы должны набрать 'exit', чтобы закрыть командную строку.

1

1 ответ на вопрос

0
Pimp Juice IT

Приложение MineCraft Game Остановите и перезапустите автоматизацию - Windows

Я включил решение для двухкомпонентного сценария. Первая часть потребует установки заголовка, соответствующего строке имени приложения, чтобы команды выполняющегося приложения содержали эти метаданные. Вторая часть будет использовать комбинацию appactivate для активации командных окон с названиями приложений, а также sendkeys для эмуляции нажатий клавиш для закрытия и перезапуска приложений.


1. Пакетный скрипт (установить заголовок)

Примечание: вы просто добавляете новую строку title "<appname>"в тот же пакетный скрипт, который вы используете в данный момент, но в строке над java -jar ~командами, которые вы выполняете. Очевидно, вам нужно заменить <appname>значение на имя приложения, которое нужно остановить и т. Д.

title "BungeeCord" java -jar -Xmx350M spigot-1.12.2.jar -o true 

2. Пакетный скрипт (остановите приложение и перезапустите его)

Примечания: вы захотите установить AppName=значение равным тому же значению и регистру, что и для каждого сценария, в котором вы устанавливаете title. StopApp=Значение должно быть установлено на значение, которое вы используете, что набрано, чтобы остановить коррелированное приложение, например end, stopи т.д.

@ECHO OFF  SET AppName=BungeeCord SET StopApp=end SET StopPauseSec=5 SET StartPauseSec=10  SET TempVBSFile=%temp%\~tmpSendKeysTemp.vbs IF EXIST "%TempVBSFile%" DEL /F /Q "%TempVBSFile%"  ECHO Set WshShell = WScript.CreateObject("WScript.Shell") >>"%TempVBSFile%" ECHO Wscript.Sleep 900 >>"%TempVBSFile%" ECHO WshShell.AppActivate "%AppName%" >>"%TempVBSFile%" ECHO Wscript.Sleep 900 >>"%TempVBSFile%" ECHO WshShell.SendKeys "%StopApp%" >>"%TempVBSFile%" ECHO Wscript.Sleep 500 >>"%TempVBSFile%" ECHO WshShell.SendKeys "" >>"%TempVBSFile%" ECHO Wscript.Sleep %StopPauseSec%000 >>"%TempVBSFile%" ECHO WshShell.SendKeys "%%" >>"%TempVBSFile%" CSCRIPT //nologo "%TempVBSFile%"  timeout /t %StartPauseSec% start "" "cmd /k call BungeeStartup.bat" EXIT /B 

планирование

Вы можете использовать планировщик заданий для создания нового задания. На вкладке « Общие » дайте заданию подходящее имя, а затем обязательно проверяйте « Запускать» только при входе пользователя в систему и « Запускать с наивысшими привилегиями» .

enter image description here

На вкладке « Триггеры » выберите « Новые параметры», чтобы создать новый триггер. Затем убедитесь, что для Begin this taskполя установлено значение « По расписанию», а для Settingsпараметров задано значение « Один раз», при этом Startзначениями поля будут дата, когда он будет в полночь, где вы находитесь (например 7/12/2018), и значение времени, установленное как 12:00: 00 утра, чтобы убедиться, что он будет работать в указанное время. Теперь, перейдя в Advanced settingsраздел, вы хотите убедиться, что Repeat task everyзначение 24 часа (введите его вручную, если необходимо), и значение for a duration ofустановлено на неопределенное время, и это обеспечит его запуск каждую ночь в 12 часов ночи.

enter image description here

Из Действия вкладки, выберите Новый параметр, чтобы создать новое действие. Затем в окне « Новое действие» убедитесь, что в Actionполе установлено « Запуск программы», и в Program/scriptполе указан полный путь к сценарию, который необходимо запустить, а в Start inполе указан только путь к папке, в которой будет находиться сценарий, который будет выполняться. Нажмите OK и OK снова, и теперь все должно быть автоматизировано.

enter image description here


Дополнительные ресурсы

@FireDragon Хорошо, для строки `timeout / t% StartPauseSec%` вы можете сделать это `:: timeout / t% StartPauseSec%`, чтобы закомментировать его, а затем запустить без него, чтобы увидеть, работает ли оно без этого или нет. Если это работает, то вы также можете удалить или закомментировать строку `:: SET StartPauseSec = 10`. Я не мог полностью протестировать эти процессы на моей стороне, но небольшой период ожидания для определенных вещей никогда не повредит, и обычно всегда помогает мне для вещей, которые я автоматизирую с помощью таких решений, но у меня нет сервера Mine Craft на моей стороне, чтобы полностью проверить. Pimp Juice IT 5 лет назад 0
Что я мог сделать, так это запланировать каждое событие после того, как другое, якобы, закончено, но я бы предпочел не делать это таким образом Fire Dragon 5 лет назад 0
Хорошо, хорошо с моим тестированием это, оно закрывает BungeeCord, закрывает HUB, и снова открывает HUB, закрывает его, открывает новый PvE без закрытия уже существующего, закрывает его и делает то же самое для всех остальных серверы, заканчивающиеся SecQ, но не закрывающиеся от него. Fire Dragon 5 лет назад 0
Итак, я снял видео о том, что происходит в точности, и он также показывает коды установочных и пакетных файлов, которые у меня есть, и прочее. Как я могу поделиться с вами? Fire Dragon 5 лет назад 0
Кроме того, это один экран, чтобы вы знали Fire Dragon 5 лет назад 0
Ладно, круто. [Вот видео] (https://vimeo.com/279926376) Я не нажимаю на что-либо после запуска файла Master Kill.bat, пока не увижу, где я случайно нажал клавишу Windows. Fire Dragon 5 лет назад 0
@FireDragon Не беспокойтесь о дальнейших видео, но попробуйте с этим, о котором я говорил выше https://pastebin.com/V8XYvTSE Pimp Juice IT 5 лет назад 0
Хорошо. Раньше у меня было 10 секунд, и он делал то же самое. Я просто вынул его, чтобы я мог видеть, что происходит быстрее Fire Dragon 5 лет назад 0
Только что проверил, он делает то же самое. Хотя обратите внимание: в вашем коде есть пробел в строке 25 перед StopApp и после цитаты, удалите его, потому что он не выполняет процесс остановки, так как он вводит его в консоль. Но да, он завершает BungeeCord, выходит из консоли, перезапускает BungeeCord, затем вводит остановки в BungeeCord, а затем после этого фокусируется на HUB Fire Dragon 5 лет назад 0
Я думаю, что будет лучше, если он сначала выйдет из них, а потом попытается их перезапустить. Fire Dragon 5 лет назад 0
@FireDragon Мне пришлось отойти в сторону, чтобы помочь кому-то в этом на несколько минут… Вот новая логика скрипта, чтобы проверить и посмотреть, как она работает. Любопытно услышать результаты https://pastebin.com/xj5Pak6L Pimp Juice IT 5 лет назад 0
Хорошо, хорошо, он отлично работает для BungeeCord, HUB и PvE. Затем он переходит к SecQ, «входит», затем вводит «стоп», не входя, затем переходит в PvP и делает то же самое и просто странно оттуда, но в основном делает то же самое. Тем не менее, он продолжает запускать резервное копирование всех серверов снова. Просто некоторые из них не закрылись, поэтому все равно не работали должным образом Fire Dragon 5 лет назад 0
В конце BungeeCord, HUB и PvE, выйдите и перезапустите идеально. Затем в SecQ ничего не произошло, за исключением того, что клавиша Enter была нажата один раз, в PvP нажата клавиша Enter, а затем написано «Стоп», но клавиша Enter не нажимается снова, и в Minigames есть то же самое, кроме «Стоп-стоп» - это то, что было напечатано. идти на работу сейчас, так что я не смогу ответить некоторое время Fire Dragon 5 лет назад 0
Ох, и Тауни работал нормально, я думаю (не цитируйте меня об этом) должен идти Fire Dragon 5 лет назад 0