2016-03-17 33 views
1

我正在做一个批处理脚本停止一些服务,但是我会在第二的syntax is incorrect错误这在循环中serviceList.TEMP命令的语法不正确:for循环批量

setlocal EnableDelayedExpansion 
setlocal enableExtensions 


::queryex output file 
sc queryex>services.TEMP      
find /i /N "DISPLAY_NAME: Hotspot" services.TEMP>tmp1.TEMP 


FOR /F "skip=2" %%G in (tmp1.TEMP) do (

set num=%%G 
set num=!num:~1,3! 
echo !num!>serviceList.TEMP 

) 





FOR %%X in (serviceList.TEMP) do ( 

    set /a "SKIP_LINES=%%G+7" 

    set secondForFilter="skip=%SKIP_LINES%" 


FOR /F %secondForFilter% %%Z in (services.TEMP) do ( 
    call debug.cmd REM debug.cmd -> echo debug pause>nul 

set serv=%%Z 
set "serv=!serv: =!"   REM Extract PID 
set "serv=!serv::=!"   REM Extract PID       
set procID=!serv!     


taskkill /pid %procID% /f >>debug.txt 2>>debug.txt 
goto secondLoopEnd 

) 

:secondLoopEnd 

) 





del /S *.TEMP >>debug.txt 2>>debug.txt 
+0

我想这是在('services.TEMP)中执行'FOR/F%secondForFilter%%% Z'('? – npocmaka

+2

** 1 **。阅读有关命令中的[':label'或':: label-like comment' (')'圆括号](http://stackoverflow.com/a/32147995/3439404)。** 2 **。检查'%% G'循环的右括号。 – JosefZ

回答

4

的问题是在这里:

FOR %%X in (serviceList.TEMP) do ( 

    set /a "SKIP_LINES=%%G+7" 

    set secondForFilter="skip=%SKIP_LINES%" 


FOR /F %secondForFilter% %%Z in (services.TEMP) do ( 
    call debug.cmd REM debug.cmd -> echo debug pause>nul 

通常的做法,当你设置括号中的值是使用delayed expansion,但它不适用于参数化选项。

在这里你需要一个子程序。

而你在for循环中有GOTO。 GOTO中断上下文,循环在goto执行后不会被调用。

和REM不能在同一行代码中没有“&”

考虑这样的事情(虽然我无法确认蝙蝠的逻辑):

setlocal EnableDelayedExpansion 
setlocal enableExtensions 


::queryex output file 
sc queryex>services.TEMP      
find /i /N "DISPLAY_NAME: Hotspot" services.TEMP>tmp1.TEMP 


FOR /F "skip=2" %%G in (tmp1.TEMP) do (

set num=%%G 
set num=!num:~1,3! 
echo !num!>serviceList.TEMP 

) 



FOR %%X in (serviceList.TEMP) do ( 

    call :subroutine %%G 

) 

del /S *.TEMP >>debug.txt 2>>debug.txt 
exit /b %errorlevel% 

:subroutine 
setlocal enableDelayedExpansion 

set /a skiplines=%~1+7 
set "filter="skip=%skiplines%"" 

    FOR /F %filter% %%Z in (services.TEMP) do ( 
     call debug.cmd 

     set serv=%%Z 
     rem extract PID 
     set "serv=!serv: =!" 
     set "serv=!serv::=!"       
     set procID=!serv!     


     taskkill /pid !procID! /f >>debug.txt 2>>debug.txt 
     goto :break_for 

    ) 
    :break_for 
endlocal 
exit /b 
1

如若>你的回声serviceList.TEMP是一个>>,以便您追加到文件?

echo !num!>>serviceList.TEMP 

在这种情况下,您还应该确保文件在附加操作之前被删除。

此外,我假设您错过了FOR循环中的/ F,因为您正尝试读取serviceList.TEMP文件的行,是的?

FOR %%X in (serviceList.TEMP) do (

应该是...

FOR /F %%X in (serviceList.TEMP) do (

另外,还可以追加到既STD出同一个文件,并通过这样做,嗯...

someprocesshere 1> out.log 2>&1