Windows 如何编写一个脚本来比较修改后的日期,并查看哪个日期较新?

Windows 如何编写一个脚本来比较修改后的日期,并查看哪个日期较新?,windows,csv,batch-file,command-line,Windows,Csv,Batch File,Command Line,现在我发现了一些使用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 fil

现在我发现了一些使用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,上面的代码不会给我“嗨”。我假设它完全忽略了一年,只是看了一个月和一天而已。这给我的另一个问题是,由于它正在查看365以外的日期,如果我在同一日期内运行脚本,它将不会看到更改。原因是“1/3/2015 10:24”被视为大于“1/3/2015 10:23”,但小于“12/30/2014 06:14”

我知道我也可以在powershell和其他平台上实现这一点,但正如我之前所说的,我不介意在我的pc上安装Python,或者在我的pc上启用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));
它接受两个参数-两个文件并打印结果。它还使用日期的重新分配设置为errorlevel。您可以修改输出或将比较的日期更改为LastAccess或LastModified(现在使用创建时间)。不验证文件的存在性

它使用jscript.net,但我想您已经安装了.net。这种方式提供了代码的健壮性和复杂性的良好比率。 在pure中有一种方法,但它依赖于时间设置。也可以使用WSH(jscript/vbscript),但需要额外的工作来解析时间,因为属性不返回日期对象,而是返回字符串

另一种方法是通过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文件(或类似文件,抱歉,我的windows副本是西班牙语),则源文件比目标文件新。

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

我在一个小型构建系统中使用了这种方法,因为有时在几秒钟后重建时,也需要比较秒数

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

这是基于裸字符串比较日期吗?您可能需要提取M、D和Y并逐一比较。这不是完全相同的副本,但可能有助于您确定这两个文件是否位于同一目录中?您知道它们的名称吗?这些文件位于不同的目录中,并且具有不同的名称/扩展名。基本上,定期更新的原始文件是name.xls,我使用脚本将其转换为“;”分隔的name.csv文件。这是一个好主意。这也保证可以跨网络共享工作。哇……我从来没有想过使用xcopy来实现这一点。我从来没有真正使用过xcopy,因为我从来都不需要额外的开关。也就是说,我认为类似的事情应该可以用机器人技术来完成?我知道xcopy已经被弃用,所以我想对脚本进行操作系统验证。虽然我将使用xcopy,但我已经研究了robocopy,它具有大多数相同的开关,除了我不知道如何使用robocopy复制和重命名文件之外。Robocopy允许您设置源文件夹和目标文件夹,然后设置要从一个文件夹复制到另一个文件夹的文件,但不涉及重命名。这是一个问题,因为目标文件夹中不存在name.xls。使用robocopy进行复制,而不是检查修改日期,我可以复制它,然后单独重命名,但对于我的意图来说,这是无用的。有人知道如何使用robocopy重命名吗?@user3377627,1)虽然vista
xcopy
命令包含了弃用消息,但它在较新的操作系统版本中,消息已被删除。2) 不,robocopy不包括重命名目标文件的选项。我对.net不太熟悉。我查看了您提供的链接,但它与我以前的脚本几乎相同,但也包含相同的错误。如果我有两个文件,一个是2015年1月1日修改的,另一个是2014年12月31日修改的,我使用for/f命令和forfiles命令将2015年的文件设置为变量a,将2014年的文件设置为变量B以运行:如果%a%GTR%B%Echo成功,它将失败,因为它仍然将2014年12月31日计算为GTR而不是2014年1月1日。我假设CMD将2014年日期的值视为365,将2015年日期的值视为1。我认为这归结为没有比运营商更新的运营商,只有GTR和LSS运营商,因此CMD将日期读取为数字,可以成功用于比较。不过,感谢您的帮助,我不知道forfiles,我已经想到了使用它而不是一堆IFs和FORs来修改一些预先存在的脚本的方法。