如何在不受区域设置影响的情况下将今天的日期与文件的最后修改日期进行比较?
How to compare today's date with a file's last modification date without regional settings influence?
可以获取 Windows 系统的当前日期和文件的最后修改日期,如下所示:
- 当前日期:
date /T
- 最后修改日期:±
echo %~tI%
(其中 %I
是 FOR
循环中的文件)
但是两者都取决于区域设置,因此需要将它们替换为其他内容:
- 当前日期:
wmic os get localdatetime
- 最后修改日期:???
有人知道如何填写问号吗?
背景资料,思路是得到如下结果:
- 当前日期:20170323115047.782000+060
- 最后修改日期:20170323120513.0123
砍掉前八个字符(为了得到天)
- 当前日期:20170323
- 最后修改日期:20170323
这样可以看出文件今天确实被修改过
我想避免区域设置,以确保我需要删除的字符数量。
以下批处理通过 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.
可以获取 Windows 系统的当前日期和文件的最后修改日期,如下所示:
- 当前日期:
date /T
- 最后修改日期:±
echo %~tI%
(其中%I
是FOR
循环中的文件)
但是两者都取决于区域设置,因此需要将它们替换为其他内容:
- 当前日期:
wmic os get localdatetime
- 最后修改日期:???
有人知道如何填写问号吗?
背景资料,思路是得到如下结果:
- 当前日期:20170323115047.782000+060
- 最后修改日期:20170323120513.0123
砍掉前八个字符(为了得到天)
- 当前日期:20170323
- 最后修改日期:20170323
这样可以看出文件今天确实被修改过
我想避免区域设置,以确保我需要删除的字符数量。
以下批处理通过 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.