从文件名比较批处理文件中的日期

时间:2015-03-25 15:11:44

标签: date batch-file math cmd compare

如果文件名中的datetime已经过去,则需要一个将移动文件的脚本。

这是我尝试过的,但它总是移动所有文件。

@ECHO OFF
set hr=%time:~0,2%
if "%hr:~0,1%" equ " " set hr=0%hr:~1,1%
SET CurrTime=%date:~-4,4%%date:~-10,2%%date:~-7,2%%hr%%time:~3,2%%time:~6,2%

FOR /F "tokens=*" %%G IN ('dir /b E:\FileLoc\A_ChangePrice_*txt') DO (
    SET "LL=%%G"
    SET CurrFileTime=%LL:~16,-4%
    SET "FileTime=%%CurrFileTime%%"
    CALL ECHO %CurrTime%
    CALL ECHO %FileTime%

    IF %CurrTime% GTR %FileTime% (MOVE E:\FileLoc\%%G CALL ECHO F:\PriceChanges\%%G)
)

CurrTime = 20150325104003 FILETIME = 20160425192500

我发现这个脚本存在2个问题。

  1. 第一次脚本运行FileTime是空的?!
  2. 即使FileTime较大,它也会移动文件。
  3. 可能有一个比这更简单的解决方案,我可以提出建议。

    提前致谢。

2 个答案:

答案 0 :(得分:0)

这很有用。如果您有更清洁的解决方案,请设置正确的答案。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

set hr=%time:~0,2%
if "%hr:~0,1%" equ " " set hr=0%hr:~1,1%
SET CurrDateTime=%date:~-2,4%%date:~-10,2%%date:~-7,2%%hr%%time:~3,2%

FOR /F "tokens=*" %%G IN ('dir /b E:\FileLoc\A_ChangePrice_*txt') DO (
    SET "FileName=%%G"
    SET /a "FileDateTime=!FileName:~16,-4%!"
    IF %CurrDateTime% GTR !FileDateTime! (CALL MOVE E:\FileLoc\%%G CALL ECHO F:\PriceChanges\%%G)
)
ENDLOCAL

答案 1 :(得分:0)

很好地解决您的问题。我前一段时间尝试过类似的东西,但是看到你的代码让我走上了正确的道路(多亏了这一点),我对你的代码进行了重新设计(几乎相同,除了我选择了另一种方法来设置当前datetime ) 在下面。我使用不同的pathfilename结构对其进行了测试,似乎可行。就像我说的那样几乎相同但扩展修饰符较少。

@echo off
setlocal enabledelayedexpansion

for /f "tokens=1-3 delims=/ " %%i in ('date /t') do (set currdate=%%k%%j%%i)
for /f "tokens=1-2 delims=:. " %%i in ("%time%") do (set currtime=%%i%%j)
set currdt=%currdate:~2%%currtime%

for /f "tokens=*" %%i in ('dir /b C:\XXX\*.txt') do (
    set filename=%%i
    set filedt=!filename:~7%,-4!
    if %currdt% gtr !filedt! (move "C:\XXX\%%i" "C:\YYY\%%i")
)
pause