比较文件时间戳和当前时间戳

时间:2020-04-28 10:37:33

标签: windows batch-file cmd

我正在尝试将当前时间戳与文件更改后的时间戳进行比较。

对于当前时间戳,我会使用类似的东西:

set d=%date:~6,4%-%date:~3,2%-%date:~0,2%
set t=%time::=.%
set t=%t: =0%
set currentstamp="%d%  %t%"

对于修改后的时间戳,我会使用类似的东西:

set filetimestamp=dir /T:W  C:\test.txt

然后我将比较这些变量:

if filetimestamp>currentstamp (...) 

编辑:我当前的版本如下所示。有一个错误,但我找不到他。

set NEWDIRECTORY=D:\test
set PROJECTNAMES=(projekt1)

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set TIMESTAMP2=%%I
set TIMESTAMP2=%TIMESTAMP2:~0,8%-%TIMESTAMP2:~8,6%

rem do some things

for %%A in %PROJECTNAMES% do (
    for %%F in (C:\%%A.exe) do set file=%%~fF
    for /f "tokens=2 delims==" %%I in ('wmic datafile where name^="%file:\=\\%" get lastmodified /format:list') do set TIMESTAMP1=%%I
    if %TIMESTAMP1% lss %TIMESTAMP2% (XCOPY "C:\%%A.exe" "%NEWDIRECTORY%\%%A.exe" /Y)
)

2 个答案:

答案 0 :(得分:0)

我不确定为什么会有一个时间戳比系统当前时间更晚的文件。听起来像个问题。

要在cmd.exe .bat文件脚本中执行此操作,我将使用PowerShell避免字符串处理和本地化问题。

powershell -NoLogo -NoProfile -Command ^
    "(Get-ChildItem -Path '.\xyx.txt').LastWriteTime -gt (Get-Date)"

在.bat文件脚本中,这会将X变量设置为True或False。

FOR /F %%A IN ('powershell -NoLogo -NoProfile -Command ^
    "(Get-ChildItem -Path '.\xyx.txt').LastWriteTime -gt (Get-Date)"') DO (SET "X=%%A")
IF /I %X% == True (
    REM Do True work
)

当然,如果脚本只能用PowerShell编写,则编写起来会更容易阅读。

if ((Get-ChildItem -Path '.\xyx.txt').LastWriteTime -gt (Get-Date)) {
    # Do True work
}

答案 1 :(得分:0)

您可以使用(Windows Vista +)

要了解ForFiles命令的工作方式,请打开命令提示符窗口,键入forfiles /?,按 ENTER 键,然后阅读显示的信息。您可能会发现甚至可以使用它来复制文件,而不是使用当前的方法。

下面的示例使用forfiles.exe命令并显示一条消息,通知您文件是否已被修改。

要使用它,请将下面的全部内容另存为完整的

@"%__AppDir__%forfiles.exe" /P "%~dp1." /M "%~nx1" /D +0 /C "Cmd /C If @IsDir==FALSE Exit /B 0">NUL 2>&1&(If ErrorLevel 1 (Echo File was not modified today.) Else Echo File has a modified date of today.)&Pause

然后将文件拖放到保存的脚本上。

如果要在提供的上下文中使用它,则可以将代码放在脚本的带标签的部分中,并从循环中Call进行使用。然后,只需稍作调整即可适应您当前提出的情况。