2015-10-21 2 views
1

В следующем коде я хочу прекратить ABClient.exe и ABClientMonitor.exe если он находится работает Однако при попытке запуска кода я получаю Unexpected use of ( ошибкуНеожиданное использование (пакетного файла

Код:.

@echo off 
color 0b 
:loop 
tasklist | find /i "ABClient.exe" > nul 
set processFound1=%errorlevel% 
tasklist | find /i "ABClientMonitor.exe" > nul 
set processFound2=%errorlevel% 
if %processFound1% == 0 (
    echo ABClient has been detected. Terminating... 
    taskkill /f /im "ABClient.exe" > nul 
    set process1lvl=%errorlevel% 
    if %process1lvl% == 0 (
     echo ABClient has been terminated successfully! 
     goto loop2 
    ) ELSE (
     echo Failed to terminate ABClient! 
     goto loop2 
    ) 
) 
:loop2 
if %processFound2% == 0 (
    echo ABClientMonitor has been detected. Terminating... 
    taskkill /f /im "ABClientMonitor.exe" > nul 
    set process2lvl=%errorlevel% 
    if %process2lvl% == 0 (
     echo ABClientMonitor has been terminated successfully! 
     goto loop 
    ) ELSE (
     echo Failed to terminate ABClientMonitor! 
    goto loop 
    ) 
) 

ответ

6

Переменные, объявленные внутри круглых скобок, необходимо вызывать с задержкой расширения, в противном случае они фактически не существуют. В этом случае из-за положения переменных %process1lvl% и %process2lvl% ваши внутренние операторы if оцениваются в if == 0 (, который вызывает синтаксическую ошибку.

Чтобы исправить это, добавьте строку setlocal enabledelayedexpansion в начале вашего скрипта и заменить %process1lvl% с !process1lvl! и заменить %process2lvl% с !process2lvl!.

@echo off 
setlocal enabledelayedexpansion 
color 0b 
:loop 
tasklist | find /i "ABClient.exe" > nul 
set processFound1=%errorlevel% 
tasklist | find /i "ABClientMonitor.exe" > nul 
set processFound2=%errorlevel% 
if %processFound1% == 0 (
    echo ABClient has been detected. Terminating... 
    taskkill /f /im "ABClient.exe" > nul 
    set process1lvl=!errorlevel! 
    if !process1lvl! == 0 (
     echo ABClient has been terminated successfully! 
     goto loop2 
    ) ELSE (
     echo Failed to terminate ABClient! 
     goto loop2 
    ) 
) 
:loop2 
if %processFound2% == 0 (
    echo ABClientMonitor has been detected. Terminating... 
    taskkill /f /im "ABClientMonitor.exe" > nul 
    set process2lvl=!errorlevel! 
    if !process2lvl! == 0 (
     echo ABClientMonitor has been terminated successfully! 
     goto loop 
    ) ELSE (
     echo Failed to terminate ABClientMonitor! 
    goto loop 
    ) 
) 
+0

Благодарим вас за это! Просто интересно, что бы я сделал, если переменная была в круглых скобках - внутри круглых скобок. Будет ли это по-прежнему переменным !? – Ice

+1

Да, в любое время, когда переменная находится по крайней мере в одном наборе круглых скобок, вам нужно отложить расширение, иначе значение переменной не будет обновляться. – SomethingDark

Смежные вопросы