2017-02-13 2 views
0

Это продолжение с этого поста: Comparing string literals and timeBatch сценариев: Вызов команды запуска внутри если-оператора блока

Сравнение строковых литералов и время теперь правильны, спасибо всем, кто внесли свой вклад в мой предыдущий вопрос.

Однако проблема заключается в вызове команды «start» внутри оператора if-block.

Давайте посмотрим этот код,

setlocal EnableDelayedExpansion 


For /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x 


SET triggerFolderPath=D:\InputFiles 

SET month=%MyDate:~4,2% 
SET day=%MyDate:~6,2% 
SET year=%MyDate:~0,4% 
SET dateToday=%year%%month%%day% 
SET currentTime=%Time: =0% 

. 
. 
. 

for %%F in (%triggerFolderPath%\*.*) do ( 
    echo %%~nxF  

    IF "%%~nxF"=="file_one.txt" (
     IF %currentTime:~0,2% GEQ 18 (IF %currentTime:~0,2% LEQ 23 (echo success 
      echo process_one 
      start /b "" "C:\Program Files\Process.exe" -process ProcessOne)) 
     )    
    IF "%%~nxF"=="file_two.txt" (
     IF %currentTime:~0,2% GEQ 08 (IF %currentTime:~0,2% LEQ 23 (echo success 
      echo process_two 
      start /b "" "C:\Program Files\Process.exe" -process ProcessTwo)) 
. 
. 
. 

     ) 
endlocal 

exit /b 0 
EXIT /B %ERRORLEVEL% 

Дано: %% ~ nxf = file_two; Я добавил команду echo, чтобы увидеть, было ли условие удалено.

Программа была способна выводить вторит для этого, если условия

IF "%%~nxF"=="file_two" (
    IF %currentTime:~0,2% GEQ 08 (IF %currentTime:~0,2% LEQ 23 (echo success 
     echo process_two 
     start /b "" "C:\Program Files\Process.exe" -process ProcessTwo)) 
    ) 

Однако ошибка, он продолжает выполнение ProcessOne, вместо ProcessTwo. Я попытался поместить стартовую команду сразу после открытия скобки "(" или перед командой, но она все еще обрабатывает ProcessOne. Почему она обрабатывает ProcessOne, если она не включена в последний оператор if-block, который обрабатывает ProcessTwo/

+0

Учитывая, что вы используете переменную команды FOR, этот код находится внутри блока кода. Поэтому, если переменная currentTime установлена ​​в этом кодовом блоке, тогда ей необходимо ссылаться на Delayed Expansion. Таким образом, вы не показываете нам весь код, который влияет на вашу существующую проблему. – Squashman

+0

Хотя я все еще придерживаюсь своего предыдущего заявления, вы столкнетесь с проблемами с ведущими нулями в ваших номерах. Возьмите это, например: 'IF 1 GTR 08 echo yes'. На самом деле это даст да. – Squashman

+0

@Squashman, привет, я отредактировал мое сообщение. Для вашего последнего комментария я думаю, что это 'SET currentTime =% Time: = 0%' уменьшает проблему с ведущими нулями ... правильно? – newbie

ответ

0

все! еще раз спасибо за ваши идеи. Я узнал много в пакетном сценарии.

Я нашел причину проблемы. файлы .dll для приложения, которое я должен позвонить внутри цикла FOR не обновляются. Поэтому убедитесь, что при запуске приложения файлы dll или все файлы, необходимые для запуска этого приложения, обновлены.

Кроме того, я использовал CALL вместо START для вызова файла .exe. программа работает плавно по сравнению с использованием START

Еще раз спасибо!

+0

Вам не нужно 'start' и' call' запускать файл '.exe' ... – aschipfl