在/ F语句的批处理文件中合并dow

时间:2014-12-31 15:50:28

标签: windows batch-file token

我有一个Windows批处理文件,它调用另一个文件,服务,它有一个需要重新启动的服务和机器列表,但是其中一个服务不需要在周末启动。有谁知道如何在服务文件中加入%dow%函数然后根据dow调用服务? PS - 它调用另一个批处理文件STOPANDWAIT,以确保服务尚未运行。

这是我的代码:

:start_services
set SECTION=start_services
REM We will try to start all services
echo.
echo       ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo                  Starting services                             
echo       ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
%TIME_STAMP% BEFORE Starting services >> %TIMETRAC_FILE%
REM Make sure the file that contains the services to be stopped and started actually exists
if not exist %SERVICES_FILE% (
    %TIME_STAMP% Services file not found. >> %TIMETRAC_FILE%
    echo Services file not found.
    goto ERROR_FOUND
)

for /F "tokens=1,2* delims=," %%i in (%SERVICES%) do (
    %TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
    @echo Calling StartServiceAndWait for %%i on %%j
    call StartServiceAndWait %%j %%i
    %TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
)


%TIME_STAMP% AFTER Starting services >> %TIMETRAC_FILE%
if "%END_TAG%" == "start_services" goto PARTIAL_SUCCESS

我的%SERVICES%文件如下所示:

"EMSXComplianceService",\\bosxiptest
"Mxs.Xom",\\bosxiptest
"Mfs.Xom.Emsx",\\bosxiptest
"Mxs.Xom",\\bosxiptest
"Mxs.Xns",\\bosxiptest
"Mfs Wrangler Messanger",\\bosxiptest

我确实有一个全球%dow%,其中Wed设置为星期三等。

提前谢谢!

谢谢!

3 个答案:

答案 0 :(得分:0)

您没有说出%dow%的内容和%services%文件的样本,所以让我们开始猜测。

尝试将过程中的主循环修改为:

SET "runtoday="
for /F "tokens=1,2* delims=," %%i in (%SERVICES%) do IF "%%j%%k"=="" (
 if defined runtoday (
    %TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
    @echo Calling StartServiceAndWait for %%i on %%j
    call StartServiceAndWait %%j %%i
    %TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
 )
) ELSE (
 echo %%i|findstr "%dow%">nul
 if errorlevel 1 (set "runtoday=") else (set "runtoday=Y")
)

然后在您的%SERVICES%文件中

[Mon]
service1,runs,Monday
service2,runs,Monday
[Tue Fri]
service3,runs,Tuesday and Friday
service4,runs,Tuesday and Friday

你的日期名/数字/在包含逗号的行上的任何内容。我按照.INI文件中的样式将它们放在括号中以使它们显而易见。

注意:如果您将runtoday设置为最初为空,则文件开头(直到第一个[dayname]行)的进程将运行。如果您最初将其设置为非空,则每行运行,直到遇到[dayname]行,从而开启审查。

答案 1 :(得分:0)

你可以使用' SET MYDATE =%DATE:~0.3%'获得当前的DOW。

假设您的服务文件类似于:

ServiceName1,Machine1
ServiceName2,Machine2

将行更改为:

ServiceName1,Machine1,1,1,1,1,1,1,1
ServiceName2,Machine2,0,1,1,1,1,1,0

你的For循环看起来像这样:

SET MYDATE=%DATE:~0,3%

for /F "tokens=1,2,3,4,5,6,7,8,9 delims=," %%i in (C:\Temp\ServiceList.txt) do (
    ECHO Checking %%i on %%j

IF %MYDATE% == Mon (IF %%k == 1 (
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
))

IF %MYDATE% == Tue (IF %%l == 1 (
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
))

IF %MYDATE% == Wed (IF %%m == 1 (
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
))

IF %MYDATE% == Thu (IF %%n == 1 (
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
))

IF %MYDATE% == Fri (IF %%o == 1 (
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
))

IF %MYDATE% == Sat (IF %%p == 1 (
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
))

IF %MYDATE% == Sun (IF %%q == 1 (
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
))

)

就个人而言,我会把

(
%TIME_STAMP% Starting %%i on %%j >> %TIMETRAC_FILE%
@echo Calling StartServiceAndWait for %%i on %%j
call StartServiceAndWait %%j %%i
%TIME_STAMP% Starting %%i Done >> %TIMETRAC_FILE%
)

进入一个单独的批处理文件并调用它,这样它就不会在批处理文件中重复七次。

这可能是一种更干净的方式,但这就是你在NYE上发布问题的方法。 :)

答案 2 :(得分:0)

如果您的%date%变量中嵌入了该日期(这取决于区域用户设置),请尝试以下操作:

set "skip="
echo %date%|find /i "sat" >nul && set skip=1
echo %date%|find /i "sun" >nul && set skip=1
if not defined skip (call "your batch file to change services.bat") else (goto :weekend)