我正在尝试将当前时间戳与文件更改后的时间戳进行比较。
对于当前时间戳,我会使用类似的东西:
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)
)
答案 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)
您可以使用forfiles,(Windows Vista +)。
要了解ForFiles
命令的工作方式,请打开命令提示符窗口,键入forfiles /?
,按 ENTER 键,然后阅读显示的信息。您可能会发现甚至可以使用它来复制文件,而不是使用当前的方法。
下面的示例使用forfiles.exe
命令并显示一条消息,通知您文件是否已被修改。
要使用它,请将下面的全部内容另存为完整的batch-file:
@"%__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
进行使用。然后,只需稍作调整即可适应您当前提出的情况。