我如何编写一个脚本来比较修改日期并查看哪个更新?
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%
现在我找到了一些使用 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%