写 Windows 脚本启动某个服务进程的时候需要先判断该进程是否已经存在,在参考了 Kafka 的 Windows 启动脚本后找到一个取巧的办法。Kafka 启动时需要判断系统是否是32位系统,它的办法是通过 wmic 命令查询操作系统信息,然后查询字符串。如果字符串不存在,ERRORLEVEL 值为 1。类似的,我们可以查询进程的ID,如果ID不存在,则启动服务。Kafka 的启动代码如下:
IF ["%KAFKA_HEAP_OPTS%"] EQU [""] (
rem detect OS architecture
wmic os get osarchitecture | find /i "32-bit" >nul 2>&1
IF NOT ERRORLEVEL 1 (
rem 32-bit OS
set KAFKA_HEAP_OPTS=-Xmx512M -Xms512M
) ELSE (
rem 64-bit OS
set KAFKA_HEAP_OPTS=-Xmx1G -Xms1G
)
)
以记事本为例。记事本启动时能够查询到进程ID:
依靠上面的区别,结合 Kafka 的方案,解决方案如下:
以下是完整的代码示例:
@echo off
SetLocal
wmic process where (name="notepad.exe") get ProcessId | find /i "ProcessId" >nul 2>&1
if ERRORLEVEL 1 (
rem 执行启动命令
)
EndLocal