在应用复制提交之前,我有这个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
答案 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 /?