如果服务存在条件

时间:2009-12-16 16:55:16

标签: windows batch-file cmd

您如何检查WIN32服务是否存在,如果存在,请执行某些操作?

7 个答案:

答案 0 :(得分:18)

你不能在DOS中这样做,因为DOS不是Windows,甚至没有“服务”的概念。

在Windows批处理文件中,您可以使用sc命令查找服务:

sc query | findstr SERVICE_NAME

这将枚举所有服务并产生各自的名称。

您可以使用

搜索特定服务
sc query | findstr /C:"SERVICE_NAME: myservice"

请记住,此搜索区分大小写。您可以将/I切换添加到findstr以避免这种情况。

答案 1 :(得分:12)

在我的脑海中,您可以检查特定服务是否正在运行,如bmargulies所述,使用“net”命令,将结果传送到“find”。 以下内容将检查服务是否正在运行,如果是,则停止它。然后你可以启动它而不用担心它是否已经运行:

net start | find "SomeService"
if ERRORLEVEL 1 net stop "SomeService"
net start "SomeService"

如果您正在使用findstr进行搜索,正如其他一些答案所建议的那样,那么您将检查ERRORLEVEL是否等于0(零)...如果是,那么您找到了字符串就是寻找:

net start | findstr "SomeService"
if ERRORLEVEL 0 net stop "SomeService"
net start "SomeService"

基本上大多数DOS命令都会设置ERRORLEVEL,允许你检查像find这样的东西是否成功。

答案 2 :(得分:5)

只是接受答案的附录。如果您正在寻找其他事情,而不仅仅是重新启动服务,并且正在寻找是否已安装该服务。

sc query state= all | findstr /C:"SERVICE_NAME: MyService" 
if ERRORLEVEL 0 (**My Operation**)

在这种情况下, state = all 很重要,因为如果服务没有启动,它将被解释为未安装,这是两个不同的东西。

答案 3 :(得分:3)

不应该成功测试:“if(not)errorlevel 1”??

在windows shell中,“如果errorlevel#”表示错误级别为#或更高,那么“if errorlevel 0”总是如此。

答案 4 :(得分:3)

我使用以下代码:

SC QUERY | FIND "SERVICE_NAME: MyService"
IF %ERRORLEVEL% EQU 0 NET STOP MyService

如果找不到 MyService ,则FIND将%ERRORLEVEL%设置为1,否则它将保持为0.指令IF%ERRORLEVEL%EQU 0允许您测试最后一个案例和继续对您的服务进行操作。

IF ERRORLEVEL 0 NET STOP MyService

将无效,因为如果%ERRORLEVEL%大于或等于零,它将执行命令。

在Visual Studio post build事件中,您必须输入:

EXIT 0

最后因为VS会检测到%ERRORLEVEL%!= 0并且它会认为post build事件失败了。请小心使用它,因为这会隐藏命令序列中的所有错误。

使用此技巧,您可以忽略该错误并在post build事件中使用它来重新启动您的服务:

NET STOP MyService
NET START MyService
EXIT 0

答案 5 :(得分:1)

如何使用WMIC

首先列出所有进程,然后grep您的进程名称。如果不存在,则不会打印结果。

wmic service |findstr "ProcessName"

示例:

C:\>wmic service |findstr "Search"
FALSE        TRUE        Windows Search

答案 6 :(得分:0)

尽管使用wmic有一个答案,但是您也可以使用命令附带的wql语法:

/* 
this custom hook creates a ref for fn, and updates it on every render. 
The new value is always the same fn, 
but the fn's context changes on every render
*/
const useRefEventListener = fn => {
  const fnRef = useRef(fn);
  fnRef.current = fn;
  return fnRef;
};

export default memo(() => {
  const [activePoint, setActivePoint] = useState(null);

  const handleResize = () => {
    console.log(activePoint);
  };

  // use the custom hook declared above
  const hanleResizeRef = useRefEventListener(handleResize)

  const resizerMouseDown = (e, point) => {
    setActivePoint(point);
    // use the handleResizeRef, wrapped by an arrow function, as a callback
    window.addEventListener('mousemove', e => handleResizeRef.current(e));
    window.addEventListener('mouseup', cleanup); // removed for clarity
  };

  return (
    <div className="interfaceResizeHandler">
      {resizePoints.map(point => (
        <div
          key={ point }
          className={ `interfaceResizeHandler__resizer interfaceResizeHandler__resizer--${ point }` }
          onMouseDown={ e => resizerMouseDown(e, point) }
        />
      ))}
    </div>
  );
});

这里是使用上面查询的整个脚本

wmic service where "name like '%%32TimeXXX%%'" get /Format:Value