如何验证文件是否存在且从今天开始?

时间:2016-08-18 20:10:40

标签: windows batch-file cmd scripting copy

在应用复制提交之前,我有这个BATCH文件,如何确保源文件C:\file.zip存在并且它是今天的文件?当我尝试时,以下功能无效:

echo off
cls

echo will do a back

if [ C:\file.zip ]
then

  echo found, will validate if its the file created today?

  copy C:\file.zip "\\to_computer_of_enterprise\\granted\\to\\upload\\here"

else:
  echo sorry do not exist

fi

2 个答案:

答案 0 :(得分:1)

这是一个不使用命令forfiles的批处理代码,默认情况下,Windows XP甚至以前的Windows版本都不提供,仅适用于Windows Vista及更高版本的Windows版本,这绝对是此任务的最佳选择。

@echo off
set "FileName=C:\file.zip"

if not exist "%FileName%" goto FileNotExist

rem Get last modification date of the file.
for %%I in ("%FileName%") do set "FileDate=%%~tI"

rem Compare the first 10 characters from file date string with the last
rem 10 characters from current local date hold in environment variable DATE.
if not "%FileDate:~0,10%" == "%DATE:~-10%" goto FileNotToday

copy "%FileName%" "\\to_computer_of_enterprise\granted\to\upload\here"
goto :EndFileCheck

:FileNotToday
echo The file %FileName% is not from today.
goto :EndFileCheck

:FileNotExist
echo The file %FileName% does not exist.

:EndFileCheck
set "FileDate="
set "FileName="

上面批处理代码中环境变量DATE的日期字符串格式和%%~tI引用的文件日期取决于Windows区域和语言设置。因此,可能需要稍微调整代码并使用 IF 条件中的其他字符索引,将文件日期与当前本地日期进行比较。

在命令提示符窗口中运行以下命令行,以查看计算机上本地日期和文件日期的日期格式:

@cls & @echo Local date: %DATE% & @for %I in ("C:\file.zip") do @echo  File date: %~tI

在我的电脑上输出:

Local date: 19.08.2016
 File date: 19.08.2016 10:53

因此,环境变量DATE(本地日期)的最后10个字符与环境变量FileDate的前10个字符(文件日期)相比,实际上比较了两个日期字符串。

独立于区域和语言设置的解决方案是:

@echo off
setlocal EnableExtensions
set "FileName=C:\file.zip"

if not exist "%FileName%" goto FileNotExist

rem The command wmic requires the name of the file with full path and
rem each backslash in path must be escaped with one more backslash.
set "EscapedFileName=%FileName:\=\\%"

rem Get last modification date of the file in region independent format.
for /F "usebackq skip=1 tokens=1 delims=." %%T in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE where "name='%EscapedFileName%'" get lastmodified`) do set "FileDate=%%T" & goto GetLocalDate

rem Get current local date in region independent format.
:GetLocalDate
for /F "tokens=2 delims==." %%T in ('%SystemRoot%\System32\wbem\wmic.exe OS get localdatetime /VALUE') do set "LocalDate=%%T"

rem Compare the first 8 characters from file date string with the first
rem 8 characters from current local date string. The format is for both
rem date strings YYYYMMDD... independent on region and language settings.
if not "%FileDate:~0,8%" == "%LocalDate:~0,8%" goto FileNotToday

copy "%FileName%" "\\to_computer_of_enterprise\granted\to\upload\here"
goto :EndFileCheck

:FileNotToday
echo The file %FileName% is not from today.
goto :EndFileCheck

:FileNotExist
echo The file %FileName% does not exist.

:EndFileCheck
endlocal

对于此解决方案,必须始终使用完整路径指定文件名。

此解决方案比第一个解决方案慢得多,因为调用两次wmic - Windows Management Instrumentation命令行实用程序 - 需要花费一秒多的时间。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • cls /?
  • copy /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

注意:文件存在检查不会检查现有文件系统条目是否真的是文件或文件夹。

答案 1 :(得分:1)

这可能有帮助

forfiles /d +0 /p C:\ file.zip /c "cmd /c copy @path [path_to_copy]"

/ d +0表示日期为今天的文件

有关更多信息,请forfiles /?