2014-12-04 38 views
2

我使用这个脚本来计算文件的时间早:文件比批处理文件4分钟

set "filename=myfile.txt" 
rem extract current date and time 
for /f "tokens=1-5 delims=.:, " %%a in ("%date% %time%") do (
    set day=%%a&set mon=%%b&set yr=%%c&set hr=%%d&set min=%%e 
) 
rem extract file date and time 
for /f "tokens=1-5 delims=.:, " %%a in ('"dir %filename%|find "%filename%""') do 
(
    set fday=%%a&set fmon=%%b&set fyr=%%c&set fhr=%%d&set fmin=%%e 
) 
rem calculate age of file (in minutes) 
set /a "age=((hr*60+min)-(fhr*60+fmin)+(24*60))%%(24*60)" 
set /a "max=8" 
if %age% geq %max% echo.file is older than 8 minutes 

但我有一些错误,并纠正我不得不使用下列条件:

if %hr% EQU 08 set hr=8 
if %hr% EQU 09 set hr=9 
if %min% EQU 08 set min=8 
if %min% EQU 09 set min=9 
if %fhr% EQU 08 set fhr=8 
if %fhr% EQU 09 set fhr=9 
if %fmin% EQU 08 set fmin=8 
if %fmin% EQU 09 set fmin=9 

有没有更简单的方法来解决问题,而不必使用我创建的那些条件?

+0

是的。批处理日期/时间数学是可怕的。使用其他语言可能会更好 - VBScript或JScript。我会稍微回答一个概念证明。 – rojo 2014-12-04 15:04:47

+0

@rojo:或PowerShell,因为它的日期非常好。 – jftuga 2014-12-04 15:18:44

+0

我必须在WIN2K服务器上批量运行这个脚本。根据微软的说法, 08和09不是有效的数字,因为8和9不是有效的八进制数字。 我只是想简化这些条件。 – 2014-12-04 17:48:20

回答

1

正如我上面评论的那样,在数学日期,纯批次是可怕的。这是一个混合批处理/ JScript脚本,可以非常轻松地计算文件的年龄(编辑:或目录)。无需担心小时滚动,日期更改,夏令时或任何其他垃圾。这一切都易peasy柠檬挤-Y自午夜1月1日根据毫秒,1970年

@if (@[email protected]) @then 

:: age.bat filename.ext 
:: get age of file in minutes 

@echo off 
setlocal 

if "%~1"=="" echo Usage: age.bat filename.ext && goto :EOF 
if not exist "%~1" echo %1 not found. && goto :EOF 

for /f %%I in ('cscript /nologo /e:JScript "%~f0" "%~1"') do (
    echo %1 is %%I minutes old. 

    rem :: Now use "if %%I gtr 4" here to take whatever actions you wish 
    rem :: on files that are over 4 minutes old. 

) 

goto :EOF 

:: end batch portion/begin JScript 
@end 

var fso = new ActiveXObject("scripting.filesystemobject"), 
    arg = WSH.Arguments(0), 
    file = fso.FileExists(arg) ? fso.GetFile(arg) : fso.GetFolder(arg); 

// Use either DateCreated, DateLastAccessed, or DateLastModified. 
// See http://msdn.microsoft.com/en-us/library/1ft05taf%28v=vs.84%29.aspx 
// for more info. 

var age = new Date() - file.DateLastModified; 
WSH.Echo(Math.floor(age/1000/60)); 

有关批次/混合动力的JScript脚本,see this GitHub page更多信息。上面使用的样式与该页面上的Hybrid.bat类似。

+0

我必须在WIN2K服务器上批量运行这个脚本。根据微软的说法, 08和09不是有效的数字,因为8和9不是有效的八进制数字。我只是想简化这些条件。不管怎么说,还是要谢谢你! – 2014-12-04 17:52:37

+0

呃......你可以打开回声,看看这个错误发生在哪一行?这肯定是一个简单的修复。 – rojo 2014-12-05 00:41:36