2017-08-31 81 views
1

我遇到了我编写的批处理文件的问题,它假设检测进程A何时未运行,然后终止进程B.我检查进程A是否与wmic存在(并在这种情况下循环),当我检测到它没有运行时,我只是在另一个进程上使用taskkill。问题是,它不进入if语句由于某种原因虽然值似乎是相等..批处理文件不会进入如果语句

SETLOCAL EnableExtensions 
set EXE=python.exe 

    :RUNNERON 
    FOR /F "skip=1 delims=" %%x IN ('wmic process where "CommandLine Like '%%some text to match%%' and Caption='python.exe'" get caption') DO for /F "delims=" %%j in ("%%x") do (

     echo Current process name: %%j :: This prints "python.exe" 
     echo Required process is: %EXE% :: This prints "python.exe" 
     IF %%j == %EXE% (
      echo inside if 
      goto RUNNERON 
     ) ELSE (
      echo inside else 
     ) 
    ) 
    echo Runner is done - killing watchdog process 
    taskkill /F /im "pythonw.exe" 

    pause 

在任务管理器我有一个相匹配的WMIC条件和运行,因此python.exe过程它应该被卡在循环中,但出于某种原因,“内部其他”正在打印到控制台,我不知道我在做什么错误,它似乎像我比较两种方式中的东西..

谢谢

编辑: 我解决了这个问题,这个问题是在第一个for循环的“delims”。一旦我删除了它的一切工作得很好。 因此得出结论 - 这是工作 “为” 行:

FOR /F "skip=1" %%x IN ('wmic process where "CommandLine Like '%%forking import main%%' and Caption='python.exe'" get caption') DO for /F "delims=" %%j in ("%%x") do (
+1

几个秘诀:可能更好使用'if/i“%% j”==“%exe%”...'。 '/ i'表示不区分大小写(以防万一),如果任何一方都是空字符串(这里可能不是问题),那么在每边放置双引号可以保护您。如果有空位(如建议删除的答案),请使用'echo当前进程是:%% j:'(在打印的值的任意一边立即有冒号),以便查看是否有空闲空间(和'%EXE%'相同)。 – TripeHound

+0

谢谢你的提示 – Noam

回答

1


脚本中最重要的部分:

FOR /F "skip=1 delims=" %%x IN ('wmic process where "CommandLine Like '%%some text to match%%' and Caption='python.exe'" get caption') DO for /F "delims=" %%j in ("%%x") do (

应改为:

For /F "Skip=1 Delims=" %%x In ('"WMIC Process Where (Caption='%EXE%' And CommandLine Like '%%some text to match%%') Get Caption"') Do For /F "Delims=" %%j IN ("%%x") Do (
+0

谢谢你的回答,但我用不同的方式解决了这个问题,看到我更新的帖子 – Noam