如何将今天的日期与文件的上次修改日期进行比较,而不受区域设置的影响?

时间:2017-03-23 10:56:18

标签: batch-file command-line windows-7

可以在Windows系统上获取当前日期以及文件的最后修改日期,例如:

  • 当前日期:date /T
  • 上次修改日期:±echo %~tI%(其中%IFOR循环中的文件)

然而,两者都取决于区域设置,因此需要用其他东西替换它们:

  • 当前日期:wmic os get localdatetime
  • 最后修改日期:???

有人知道如何填写问号吗?

背景信息,其目的是获得如下结果:

  • 当前日期:20170323115047.782000 + 060
  • 最后修改日期:20170323120513.0123

砍掉前八个字符(为了得到这一天)

  • 当前日期:20170323
  • 最后修改日期:20170323

这样就可以看到文件今天确实被修改了 我想避免区域设置,以确保我需要切断的字符数量。

6 个答案:

答案 0 :(得分:4)

LotPings'脚本为您提供了如何开始的想法,但还有一些关于完整检查的内容。试试这个:

@echo off
setlocal
::change to the needed file or to the command line argument
set fileLoc=%~f0
set fileLoc=%fileLoc:\=\\%

for /f "tokens=* delims=" %%# in ('wmic os get localdatetime /format:value') do (
    for  /f "tokens=* delims=" %%a in ("%%#") do set "%%a"
)

::echo %LocalDateTime%
set today=%LocalDateTime:~0,8%
echo today: %today%




for /f "tokens=* delims=" %%# in ('wmic  DataFile where "Name='%fileLoc%'" get lastmodified /format:Value ') do (

    for /f "tokens=* delims=" %%a in ("%%#") do set "%%a"
)

echo %lastmodified%
set lmodified=%lastmodified:~0,8%

if "%lmodified%" equ "%lmodified%" (
    echo modified today
) else (
    echo hasnt been modified today
)
endlocal

解释了这里的子字符串:https://ss64.com/nt/syntax-substring.html

答案 1 :(得分:3)

以下批次通过wmic输出它自己的最后修改日期时间。

@Echo off&SetLocal
set File=%~f0
:: need to escape \ with another one \\
set File=%File:\=\\%
for /f %%a in (
    'wmic  DataFile where "Name='%File%'" get lastmodified   ^| findstr "^[0-9]" '
) do Echo File:%File% lastmodified:%%a

示例输出

> 12-16.cmd
File:Q:\\Test\\2017-03\\23\\12-16.cmd lastmodified:20170323123900.908030+060

答案 2 :(得分:3)

对于时间戳比较,您可以使用forfiles查找今天修改的文件。这个解决方案比从我认为的WMI查询结果中删除子字符串更优雅。

@echo off & setlocal

set "file=notes.txt"

forfiles /d +0 /m "%file%" >NUL 2>NUL && (
    echo %file% was modified today.
) || (
    for %%I in ("%file%") do echo %%~I was last modified %%~tI
)
cmd控制台中的

forfiles /?了解详情。 forfiles命令在匹配时退出0,在不匹配时退出1,允许使用conditional execution。另外,see this related question

答案 3 :(得分:3)

Rojo是正确的,FORFILES可用于列出今天已修改的文件。但它是S.L..O ...... W .....

ROBOCOPY要快得多: - )

以下将列出当前目录中最近修改过的文件。

robocopy . . /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp

如果需要,您可以指定特定路径

robocopy "c:\your\path" "c:\your\path" /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp

您可以添加/S以递归方式搜索所有子文件夹

robocopy "c:\your\path" "c:\your\path" /l /is /maxage:1 /njh /njs /nc /ns /ndl /fp /s

答案 4 :(得分:0)

经过一番努力,我找到了办法让一切运转起来(根据Lotping的答案):

set Filename=F:\\DIR\\Filename.exe
for /f %%a in ('wmic datafile where "Name='!Filename!'" get "lastmodified"^|findstr [0-9]') do set Filename_DATE=%%a
echo Filename_DATE=!Filename_DATE!
set FilenameFinalDATE=!Filename_DATE:~0,8!
echo !FilenameFinalDATE!

(注意,这里的一切都很重要(双斜线,双倍百分比,单引号和双引号,......))

答案 5 :(得分:0)

尽管date /T / %DATE%%%~tI返回了与语言环境相关的日期格式,但它们仍可用于(非)相等比较,因为格式相同,因为你在第一个 SPACE 处拆分%%~tI的时间部分,并且 SPACE 不用作日期分隔符(这是非常不可能和不常见的):

for %%I in ("C:\TEMP\test.txt") do set "AGE=%%~tI"
set "AGE=%AGE: =" & rem "%"
if "%AGE%"=="%DATE%" echo File has been modified today.