如何在不受区域设置影响的情况下将今天的日期与文件的最后修改日期进行比较?

How to compare today's date with a file's last modification date without regional settings influence?

可以获取 Windows 系统的当前日期和文件的最后修改日期,如下所示:

但是两者都取决于区域设置,因此需要将它们替换为其他内容:

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

背景资料,思路是得到如下结果:

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

这样可以看出文件今天确实被修改过
我想避免区域设置,以确保我需要删除的字符数量。

以下批处理通过 wmic 输出它自己的 lastmodified 日期时间。

@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

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

对于时间戳比较,您可以使用 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
)

forfiles /? 在 cmd 控制台中获取更多信息。 forfiles 命令在匹配时退出 0,在不匹配时退出 1,允许使用 conditional execution. Also, .

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

经过相当多的工作后,我找到了一种让一切都起来的方法 运行(基于 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!

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

尽管 date /T/%DATE% and %%~tI return 依赖于语言环境的日期格式,它们仍然可以用于(非)相等比较,因为格式相同,前提是您将时间部分分开%%~tI 在第一个 SPACE,并且 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.