检查文件是否存在时未执行ELSE条件

时间:2019-04-17 07:07:23

标签: batch-file

我有一个批处理脚本,该脚本检查文件的以下内容:
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 个答案:

答案 0 :(得分:1)

以此替换整个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%

答案 1 :(得分:0)

@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 EXISTgoto :end

现在,如果文件存在并被视为有效,则其余代码可以继续。 如果您不考虑不首先检查文件是否存在,则可能会遇到if比较等语法错误以及未定义变量的情况。

答案 2 :(得分:0)

即使使用缩进,嵌套条件也不太方便阅读和理解逻辑。如果您重新考虑条件,则可以简化以下逻辑:

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"
)