【问题标题】:Writing a simple batch file that checks if a program is running编写一个简单的批处理文件来检查程序是否正在运行
【发布时间】:2015-02-17 11:30:03
【问题描述】:

我和我的几个朋友正在使用 Dropbox 上的共享文件夹,其中上传了我们的 Minecraft 服务器。这样做的重点是,任何人都可以随时启动服务器,而不需要一个人一直运行它。

唯一的问题是,两个人可能同时启动服务器,并且可能会出现重叠的保存文件。为了解决这个问题,我想编写一个简单的批处理文件。

逻辑是这样的:

  1. 如果进程“minecraft_server.1.8.1”正在运行,请将服务器文件夹重命名为“RUNNING AS _INSERT_NAME_HERE_”,否则将其重命名为“Minecraft 服务器”

  2. NAME 将被读取为计算机名称(如果可能的话),或从用户创建的某个 txt 文件中读取(写入自己的名称)

我从未编写过批处理文件,我不知道这是否可能,但它似乎很简单,任何帮助将不胜感激。

提前谢谢你。

好的,经过一番修改,我编写了我的第一个批处理文件。在大多数情况下,它似乎在工作,但是我似乎无法实现正确的循环。

@echo off
IF EXIST *_RUNNING.txt (
echo "ERROR, SERVER ALREADY RUNNING as %computername%"
pause
EXIT
) ELSE (
copy NUL %computername%_RUNNING.txt 
START /WAIT minecraft_server.1.8.1.exe
tasklist /FI "IMAGENAME eq javaw.exe" 2>NUL | find /I /N "javaw.exe">NUL
:loop 
IF "%ERRORLEVEL%"=="0" (
TIMEOUT /t 5
GOTO loop
) ELSE (
del %computername%_RUNNING.txt
echo "Server ended."
pause
EXIT ) )

当我启动 minecraft_server.1.8.1.exe 时,它​​会启动 javaw.exe,这就是启动服务器的实际进程。之后,我只检查进程是否仍在运行。但是我似乎无法循环代码的特定部分,我不断收到语法错误。

【问题讨论】:

  • 通过重命名文件夹,您将触发 dropbox 重新上传文件夹的内容,这将导致大量额外的网络流量和延迟,同时将更改同步到所有用户。如何使用一个小的临时文件(例如 MinecraftIsRunning.txt)来表示我的世界服务器正在运行?批处理文件可以在您运行它时检查该文件是否存在 - 如果它存在就退出,否则创建文件并运行我的世界服务器并让批处理文件等到我的世界服务器退出

标签: windows batch-file


【解决方案1】:

这不是您在问题主题中寻找的内容,但如果我做对了,您希望避免服务器启动两次。所以我会做以下事情:

创建一个批处理文件:

首先检查是否存在名为 *_MinecraftServer.txt 的文件。如果是,它假定服务器已经在运行并简单地退出。 如果不存在这样的文件,它会创建该文件。 然后它启动服务器。 一旦服务器退出,文件就会被删除。

这将是这样的:

@echo off
REM Define a filename for the text-file informing other people that a server is running
SET FILENAME=%computername%_MinecraftServer.txt
REM Check if such a file already exists, if not refuse to start:
if exist *_MinecraftServer.txt (
  REM Such a file exists, print the content of the file:
  echo "ERROR, SERVER ALREADY RUNNING"
  type *_MinecraftServer.txt
) else (
  REM No such file is found. Create a file, then start the server process.
  echo "SERVER is running on %computername%" > %FILENAME%
  REM replace the notepad.exe with the name of the server.exe (and all    params it requires)
  REM Maybe you will also need to write the full-path to the server
  notepad.exe
  REM Once the server exits, remove the file
  del %FILENAME%
  echo "Server exited"
)
REM Require the user to hit a key before exiting the batch:
pause

这个示例批处理启动了一个 notepad.exe 并创建了一个文件 COMPUTERNAME_MinecraftServer.txt。 您必须将 notepad.exe 替换为 minecraft 服务器 exe 的路径。 请注意,如果涉及的任何目录包含空格,我不确定此批处理是否有效。

当然,这只有在从现在开始所有人都只使用批处理文件启动服务器时才有效。 此外,理论上,如果多个用户或多或少同时启动服务器,则可以运行多个服务器,因为在 dropbox 上传和分发创建的 txt 文件之前会有一些延迟。

【讨论】:

  • +1 干得好!这道题其实很好的介绍了并发和线程/进程同步的概念
  • 我试用了您的代码,但无论出于何种原因,我不断收到语法错误。
  • 啊。看来我不小心输入了错误的东西。我的错误,它确实有效。但是我仍然有一个小问题。如前所述,server.exe似乎启动了一个javaw.exe进程,在javaw.exe停止运行后应该删除txt文件。
  • 如果 javaw.exe 停止运行,那么 server.exe 是否也会退出?还是 server.exe 立即退出?比如:server.exe 启动 javaw.exe 然后 server.exe 已经退出?
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多