您如何检查WIN32服务是否存在,如果存在,请执行某些操作?
答案 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