我试图比较文件的当前时间戳和更改后的时间戳。
我会用类似的东西来表示当前的时间戳。
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 (...)
EDIT: 我现在的版本是这样的. 有一个错误,但我找不到他。
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)
)
我不知道为什么会有一个文件的时间戳比系统的当前时间还要近。这听起来像是个问题。
要在 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
}
你可以使用 锉刀, (Windows Vista+).
要了解如何 ForFiles
命令工作,请打开命令提示符窗口,输入 forfiles /?
,按 进入 键,并阅读所提供的信息。你可能会发现,你甚至可以用它来复制你的文件,而不是使用你现在的方法。
下面的例子使用了 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
它从循环。然后,它只需要稍作调整,以适应你目前提出的情况。