我如何编写一个脚本来比较修改日期并查看哪个更新?

How can I write a script that compares modified dates and see which one is newer?

现在我找到了一些使用 java 和 python 的东西,但我想要一些使用 CMD 的东西,因为这是我们在任何 Win PC 上已经拥有的东西。我有一个从 XLS 文件创建的 CSV。 XLS 文件经常更新。我一直在尝试编写一个在登录时运行的脚本,该脚本检查 XLS 文件和 CSV 文件,如果 XLS 较新(最近修改过),它将运行一个 libreoffice 命令,将其输出为“;”分隔的 CSV。我当时做的是

FOR /F "TOKENS=1" %%A IN ('DIR /o:-d "\path" ^| FIND "Part of filename"') DO SET "Chk1=%%A" 

这给我,例如 Chk1=1/3/2015。如果 Chk2=1/2/2015 而我

IF "%Chk1%" GTR "%Chk2%" ECHO Hi

我打个招呼。问题是新年到了,如果 Chk2=12/30/2014,上面的相同代码没有 "Hi"。我假设它完全忽略了年份,只看月份和日期。这给我的另一个问题是,由于它正在查看 365 的日期,如果我在同一日期内运行脚本,它将看不到更改。原因是“1/3/2015 10:24”被视为大于“1/3/2015 10:23”但小于“12/30/2014 06:14”。

我知道我也可以在 powershell 和其他平台上做到这一点,但正如我之前所说,我不介意安装 Python,实际上,在我的电脑上安装它或在我的电脑上启用运行 PS 脚本,但我想让其他人保持不变,但仍然有能力这样做。 CMD 是每个人都拥有的东西,无需进行任何安全更改即可运行批处理脚本。

将其另存为 .bat:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)


if not exist "%~n0.exe" (
   "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0" 
)

%~n0.exe %*

endlocal & exit /b %errorlevel%

*/

import  System;
import System.IO;

var arguments:String[] = Environment.GetCommandLineArgs();
var file1=arguments[1];
var file2=arguments[2];

//print(file1+"#"+file2);

var fileCreatedDate1 = File.GetCreationTime(file1);
var fileCreatedDate2 = File.GetCreationTime(file2);
var comp=fileCreatedDate1.CompareTo(fileCreatedDate2);
if (comp==0){
    print(file1+" - "+file2+":same age");
}else if (comp>0){
    print(file1+" newer than "+file2);
} else {
    print(file1+" older than "+file2);
}
Environment.Exit(fileCreatedDate1.CompareTo(fileCreatedDate2));

它有两个参数 - 两个文件并打印 result.It 也使用 compared 的结果设置为错误级别 dates.You 可以修改输出或更改比较日期到 LastAccessed 或 LastModified(现在使用创建时间)。不验证文件的存在。

它使用 jscript.net ,但我想你已经安装了 .NET.This 方式提供了代码的健壮性和复杂性的良好比例。 这是一种纯 batch , but it depeneds on time settings.Also WSH (jscript/vbscript) can be used , but will require additional work to parse times as DateCreated 属性 不是 return 日期对象而是字符串的方法。

另一种方法是通过 WMIC 或 WSH 使用 WMI 查询,但这太慢了。

set "source=c:\somewhere\file.xls"
set "target=c:\targets\file.csv"

xcopy /l /d /y "%source%" "%target%" | findstr /b /c:"1 " >nul && (
    echo "%target%" needs to be updated
)

这使用 xcopy 仅获取将被复制的文件列表 (/l)(没有真正复制它们),尝试将源文件复制到目标上,但仅当目标文件需要更新 (/d)。如果输出在行首包含文本 1 file(或类似的,抱歉,我的 windows 副本是西班牙语),则源文件比目标文件新。

与 MC ND 显示的解决方案几乎相同,但您不需要管道或 findstr。

我将此方法用于小型构建系统,因为有时也需要比较秒数,当您在几秒后重建时。

FOR /F "usebackq delims= " %%A in (`XCOPY /y /L /D "%~1" "%~2"`) DO (
    set "isNewer=%%A"
)
echo %isNewer%