ELSE условие не выполняется при проверке, существует ли файл - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть пакетный скрипт, который проверяет следующее о файле:
1. Если файл существует
2. Если файл пуст
3. Если файл обновлен (по сравнению с текущей датой)

Я могу получать результаты для всех условий всякий раз, когда запускаю пакет и файл присутствует в папке, которую я использую.Тем не менее, он завершается, когда я удаляю файл, а затем запускаю сценарий для проверки условия # 1.

Я заметил, что инструкция ELSE для условия, которое проверяет, существует ли файл, не выполняется.Ниже приведен код:

@echo off  
setlocal   
set strpath="C:\SAMPLE.txt"  
set $strErrorMessage="No Error"  

set datenow=%DATE:~4,13%  
FOR %%A IN (%strpath%) DO set filelastmodifieddate=%%~tA  
FOR %%A IN (%strpath%) DO set filesize=%%~zA  

set filelastmodifieddate=%filelastmodifieddate:~0,10%  

IF EXIST %strpath% (  
   IF %filesize% NEQ 0 (  
      IF %filelastmodifieddate% EQU %datenow% (rem do something  
      ) ELSE (SET strErrorMessage=FILE IS NOT UDPATED)  
   ) ELSE (SET strErrorMessage=ZERO BYTE FILE)  
) ELSE (SET strErrorMessage=FILE DOES NOT EXIST)  

echo %strErrorMessage%

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Замените весь блок операторов if этим. Это немного более простой и понятный способ сделать то, что вы хотите:

if not exist %strpath% (
     set "strErrorMessage=File does not exist!"
     goto :end
  )
if %filesize% equ 0 (
     set "strErrorMessage=Zero Byte file!"
     goto :end
  ) 
if %filelastmodifieddate% neq %datenow% (
     set "strErrorMessage=File not updated!"
     goto :end
  )
rem If we get to this pint, we have met all the requirements and we DO SOMETHING here
set "strErrorMessage=Success!"

:end
echo %strErrorMessage%
0 голосов
/ 17 апреля 2019

Вложенные условия не совсем удобны для чтения и понимания логики даже с отступами.Если вы переосмыслите условия, вы сможете упростить логику, как показано ниже:

set "strErrorMessage=NO ERROR"

for %%a in ( %strpath% ) do if not exist "%%~a" (
    SET "strErrorMessage=FILE DOES NOT EXIST"
) else if %%~za equ 0 (
    SET "strErrorMessage=ZERO BYTE FILE"
) else if %%~ta neq %datenow% (
    SET "strErrorMessage=FILE IS NOT UDPATED"
)
0 голосов
/ 17 апреля 2019
@echo off
setlocal
set "strpath=C:\SAMPLE.txt"
set "strErrorMessage=No Error"

set "datenow=%DATE:~4,13%"

if not exist "%strpath%" (
    set "strErrorMessage=FILE DOES NOT EXIST"
    goto :end
)

for %%A in ("%strpath%") do set "filelastmodifieddate=%%~tA"
for %%A in ("%strpath%") do set "filesize=%%~zA"

set "filelastmodifieddate=%filelastmodifieddate:~0,10%"

if %filesize% EQU 0 (
    set "strErrorMessage=ZERO BYTE FILE"
) else if %filelastmodifieddate% NEQ %datenow% (
    set "strErrorMessage=FILE IS NOT UDPATED"
)

:end
echo(%strErrorMessage%

Кажется нелогичным делать циклы for или что-то еще, если файл не существует.Поэтому, если файл существует, выполните циклы for, чтобы получить метку времени и размер файла, в противном случае установите FILE DOES NOT EXIST и goto :end.

Теперь остальная часть кода может продолжиться, если файлсуществуют и считаются действительными.Если вы сначала не будете проверять, существует ли файл, то вы можете столкнуться с синтаксическими ошибками при if сравнении и т. Д. С неопределенными переменными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...