2014-12-04 2 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

+0

@rojo: Или PowerShell, как и даты, очень хорошо. – jftuga

+0

Мне нужно запустить этот скрипт в пакетном режиме на сервере WIN2K. Согласно Microsoft, 08 и 09 являются недопустимыми числами, потому что 8 и 9 не являются действительными восьмеричными цифрами. Я просто хотел упростить эти условия. –

ответ

1

Как я уже отмечал выше, чистая партия ужасна на математике. Вот гибридный пакетный/JScript-скрипт, который довольно легко вычислит возраст файла (изменить: или каталог). Не нужно беспокоиться о часовых опросах, дневных изменениях, летнем времени или любом другом мусоре. Это все легко Peasy лимона отжимают-у на основе миллисекунд с полуночи 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. Согласно Microsoft, 08 и 09 являются недопустимыми числами, потому что 8 и 9 не являются действительными восьмеричными цифрами. Я просто хотел упростить эти условия. Спасибо, в любом случае! –

+0

Ух ... вы можете включить эхо и посмотреть, в какой строке эта ошибка возникает? Там должно быть простое исправление. – rojo

Смежные вопросы