दिलचस्प पोस्ट
स्ट्रिंग / पूर्णांक के सभी क्रमबद्धताओं को सूचीबद्ध करना Hadoop java.io.IOException: Mkdirs बनाने में विफल / कुछ / पथ आवेदन में अंतर / जेसन और आवेदन / एक्स-www-फॉर्म-यूआरएलएक्सोडेड node.js – gzip / deflate संपीड़न के साथ आसान http अनुरोध जेएस की जगह स्ट्रिंग पर काम नहीं बदली Google पर प्रमाणीकरण: OAuth2 'invalid_grant' लौटाता रहता है आर आंकड़ों में डमी वैरिएबल बनाना डायलॉगफ्रैगमेंट से एक टुकड़े तक डेटा कैसे भेजा जाए? पंक्तियों का चयन करना जहां स्तंभ में 'hsa ..' की तरह एक स्ट्रिंग है (आंशिक स्ट्रिंग मैच) यूटीएफ -8 पात्रों के साथ परेशानी; मैं जो देखता हूं वह नहीं है जो मैंने संग्रहीत किया है मुझे अंतरफलक और एक सार वर्ग के बीच अंतर कैसे समझाया जाना चाहिए? PHP सहयोगी सरणी डुप्लिकेट कीज़ Brk () सिस्टम कॉल क्या करता है? एकाधिक शब्द खोज और नोटपैड में बदलें ++ खाली सूची में क्यों असाइन नहीं किया जा रहा है (जैसे = "") एक त्रुटि?

पता करें कि फ़ाइल बैच फ़ाइल में 4 घंटे से अधिक पुरानी है

काफी आसानी से, मैं कैसे पता चलेगा कि फ़ोल्डर में एक विशिष्ट फाइल X घंटे से पुरानी है? फ़ाइल का नाम और स्थान हमेशा समान होगा

धन्यवाद

वेब के समाधान से एकत्रित समाधान "पता करें कि फ़ाइल बैच फ़ाइल में 4 घंटे से अधिक पुरानी है"

बैच कोड के साथ फाइल टाइम्स की तुलना करने के बारे में निम्नलिखित को ध्यान में रखा जाना चाहिए:

  1. दिनांक और समय प्रारूप सेटिंग्स
  2. भंडारण मीडिया की फाइल सिस्टम
  3. समय क्षेत्र, डेलाइट सेविंग टाइम
  4. डेलाइट सेविंग टाइम के लिए स्वचालित समायोजन
  5. विंडोज़ का संस्करण

1. दिनांक और समय प्रारूप सेटिंग्स

पर्यावरण चर और DATE है जो एक्सेस पर (और बैच निष्पादन की शुरूआत पर नहीं) विंडोज क्षेत्र और भाषा सेटिंग्स के आधार पर प्रारूप में वर्तमान दिनांक और समय लौटाते हैं । देश तिथि और समय प्रारूप को परिभाषित करता है।

यह भी संभव है कि जर्मन लघु प्रारूप के लिए DD.MM.YYYY (दिन और महीने के अग्रणी शून्य के साथ) और समय प्रारूप HH:mm:ss (24 घंटे का प्रारूप, जो कि शून्य, मिनट और सेकंड के लिए अग्रणी शून्य के साथ होता है) )। लेकिन इसका मतलब यह नहीं है कि DATE और TIME का मान वास्तव में इस प्रारूप का उपयोग कर रहा है। उदाहरण के लिए H:mm:ss,ms प्रारूप में H:mm:ss,ms चयन करते समय HH:mm:ss साथ भी परिभाषित किया जाता है जिसका मतलब है कि कोई भी अग्रणी शून्य नहीं है, परन्तु मिनट और सेकंड पर, तथा समय सीमा में कॉमा के बाद मिलीसेकंड । दिनांक स्ट्रिंग क्षेत्र सेटिंग के आधार पर या बिना सप्ताह के दिन भी हो सकता है

और एक निर्देशिका या फाइल के अंतिम संशोधन दिनांक और समय प्राप्त करने के लिए पैटर्न %~t है। एक कमांड प्रॉम्प्ट विंडो call /? में चलाएं call /? और for /? और विवरण के लिए उन दो कमांडों के लिए प्रदर्शित सभी सहायता पृष्ठों को पढ़ें। दिनांक और समय स्ट्रिंग का प्रारूप %~t द्वारा दिया गया है और साथ ही कमान डीआईआर के आउटपुट पर प्रदर्शित किया जाता है, विंडोज क्षेत्र सेटिंग्स पर भी निर्भर करता है, लेकिन आमतौर पर वेरिएबल्स के प्रारूप के बराबर नहीं है, जो DATE और TIME है । फ़ाइल या निर्देशिका के अंतिम संशोधन समय का समय आमतौर पर दिनांक / समय स्ट्रिंग में दूसरे मान के बिना वापस किया जाता है।

सबसे अच्छा निम्नलिखित बैच फ़ाइल को सबसे अच्छा 10:00 पूर्वाह्न से पहले निष्पादित करने के लिए पता है कि वर्तमान उपयोगकर्ता के लिए मौजूदा मशीन पर प्रारूप क्या हैं।

 @echo off echo Current date/time: %DATE% %TIME% for %%I in ("%~f0") do echo Batch file time: %%~tI pause 

2. स्टोरेज मीडिया की फाइल सिस्टम

विंडोज़ फाइल सिस्टम पर दो भंडारण प्रारूप फाइल टाइम्स के लिए उपयोग किए जाते हैं:

  • एनटीएफएस का इस्तेमाल करते हुए भंडारण मीडिया में NTFS परिशुद्धता समय का उपयोग किया जाता है जो कि 12-बिट 1 जनवरी, 1601 समन्वित यूनिवर्सल टाइम (यूटीसी) से समाप्त होने वाले 100-नैनोसेकेंड अंतराल की 64-बिट संख्या है।

  • संचिका मीडिया में FAT, FAT16, FAT32 या exFAT का उपयोग फाइल समय दो 16-बिट मानों के साथ दो सेकंड के संकल्प के साथ डॉस दिनांक समय स्वरूप का उपयोग करके संग्रहीत किया जाता है और वर्तमान स्थानीय समय का उपयोग कर रहा है।

इसका अर्थ है कि एक अस्थायी दूसरा फ़ाइल एफएटी मीडिया पर संभव नहीं है, परन्तु NTFS मीडिया पर। आखिरी संशोधन समय में 1 सेकंड के अंतर के साथ समान फाइलों में होने वाले FAT32 ड्राइव परिणामों में अंतिम संशोधन समय में एक अजीब सेकंड के साथ एक NTFS ड्राइव पर एक फ़ाइल की प्रतिलिपि।

NTFS मीडिया पर फ़ाइल का समय यूटीसी में जमा होता है। तो जो कि %~t या कमांड डीआईआर द्वारा दिया जाता है व साथ ही विंडोज एक्सप्लोरर में उदाहरण के लिए प्रदर्शित किया जाता है

  • वर्तमान समय क्षेत्र,
  • इस समय क्षेत्र के लिए डेलाइट सेविंग टाइम,
  • अगर वर्तमान समय डेलाइट की बचत समय अवधि के भीतर है,
  • और यदि डेलाइट सेविंग टाइम के लिए स्वत: समायोजन वर्तमान में सक्षम है।

उन 4 पैरामीटर परिणामों में से किसी एक को बदलने से परिणामस्वरूप सभी फाइलों और निर्देशिकाओं के फ़ाइल स्वरूपों के तत्काल परिवर्तन में NTFS संग्रहण मीडिया

एफएटी मीडिया पर फ़ाइल समय अधिक या कम स्थिर है, निर्माण, संशोधन या अंतिम पहुंच पर स्थानीय समय का उपयोग करते हुए, लेकिन विवरण के लिए आगे पढ़ें।


3. समय क्षेत्र, डेलाइट सेविंग टाइम

जैसा कि NTFS मीडिया पर फाइल टाइम्स को यूटीसी में जमा किया जाता है, लेकिन स्थानीय समय में प्रदर्शित किया जाता है, वर्तमान समय क्षेत्र और इस समय क्षेत्र के लिए डेलाइट सेविंग टाइम फाइल टाइम तुल्यता के लिए महत्वपूर्ण है, खासकर जब NTFS और FAT32 ड्राइव पर फ़ाइलों के लिए किया जाता है

लेकिन FAT मीडिया पर फ़ाइलों के लिए, विंडोज के संस्करण के आधार पर टाइम ज़ोन और डेलाइट बचत समय सेटिंग महत्वपूर्ण हो सकती हैं विवरण के लिए नीचे पढ़ें


4. डेलाइट सेविंग टाइम के लिए स्वचालित समायोजन

डेलाइट सेविंग टाइम के लिए स्वचालित समायोजन की सेटिंग होती है जो डिफ़ॉल्ट रूप से सक्षम होने पर महत्वपूर्ण हो जाती है और वर्तमान में टाइम ज़ोन सेट करते समय डेलाइट सेविंग टाइम एडजस्टमेंट निर्धारित किया जाता है।

उदाहरण के लिए डेलाइट सेविंग टाइम वर्तमान में यूरोप में सक्रिय है। विंडोज के घड़ी सेटिंग्स में इस विकल्प को अक्षम करना, एनटीएफएस मीडिया पर 1 घंटे के द्वारा प्रदर्शित फ़ाइल समय के तत्काल परिवर्तन में, और Windows के संस्करण के आधार पर फ़ैट मीडिया पर कई फाइलें भी हैं।

डेलाइट सेविंग टाइम समायोजन के कारण यह 1 घंटा का समय अंतर एनटीएफएस और एफएटी मीडिया पर फ़ाइल समय की तुलना करने के लिए ध्यान में रखा जाना चाहिए।


5. विंडोज के संस्करण

NTFS सभी Windows NT संस्करणों द्वारा समर्थित है फाइल समय व्यवहार NTFS के समर्थन वाले सभी विंडोज संस्करणों पर फ़ाइलों और निर्देशिकाओं के लिए बराबर है।

लेकिन FAT मीडिया पर फ़ाइल समय कैसे व्याख्या की जाती है Windows के संस्करण पर निर्भर करता है पूर्व विंडोज विस्टा, फ़ैट मीडिया पर फ़ाइल का समय समय क्षेत्र के परिवर्तन, डेलाइट सेविंग टाइम सेटिंग और डेलाइट सेविंग टाइम के स्वत: समायोजन पर स्वतंत्र है। एक फ़ाइल का अंतिम संशोधन दिनांक / समय Windows 2000 और Windows XP पर निरंतर है।

लेकिन विंडोज़ विस्टा पर और बाद में फ़ैट मीडिया पर प्रदर्शित फ़ाइल बार डेलाइट सेविंग टाइम और डेलाइट सेविंग टाइम के लिए स्वचालित समायोजन पर निर्भर करता है। समय क्षेत्र सीधे बात नहीं करता है वर्तमान में उपयोग किए जाने वाले अन्य समय क्षेत्र का चयन FAT मीडिया पर फ़ाइलों के प्रदर्शित फ़ाइल समय को नहीं बदलता है जैसे कि NTFS मीडिया पर फ़ाइलों के लिए होता है लेकिन अगर वर्तमान समय सक्रिय समय क्षेत्र की डेलाइट बचत समय अवधि में है और डेलाइट सेविंग टाइम के लिए स्वत: समायोजन सक्षम है और फ़ाइल या निर्देशिका का स्थानीय समय डेलाइट की बचत समय अवधि के भीतर है, तो +1 विन्डो द्वारा 1 घंटा जोड़ा जाता है और बादमें। अंतिम समय में फ़ैट ड्राइव पर अंतिम रूप से संशोधित फाइलें वर्ष में स्थिर होती हैं; बस डीएसटी अवधि के भीतर अंतिम रूप से संशोधित फाइलें, सक्रिय डीएसटी समायोजन सक्षम होने के साथ वर्तमान समय के साथ +1 घंटे या बिना प्रदर्शित की जाती हैं।

उदाहरण के लिए विंडोज़ 7 मशीन पर एक FAT32 ड्राइव पर एक फ़ोल्डर का एक सार्वजनिक हिस्सा होने और Windows XP मशीन के साथ इस सार्वजनिक फ़ोल्डर से जुड़ा होने पर, यह अलग FAT फ़ाइल टाइम प्रबंधन बेहद भ्रामक हो सकता है। एक फ़ाइल आखिरी बार संशोधित 2015-09-19 17:39:08 विंडोज 7 पर एफएटी 32 ड्राइव पर संग्रहीत है, विंडोज 7 के द्वारा जर्मन टाइम ज़ोन के साथ आज फाइल टाइम 19.09.2015 17:39:08 के साथ प्रदर्शित किया गया है, लेकिन 2 महीने में 1 9 .9.2015 16:39:08 के साथ संशोधित नहीं है, और विंडोज़ एक्सपी विंडोज 7 से जुड़ी फाइलों को आज और भविष्य में लगातार फाइल फाइल के साथ प्रदर्शित करता है। 1 9 .9.2015 17:39:08।

NTFS या FAT मीडिया पर फ़ाइलों के साथ अभिलेखागार (ज़िप, आरएआर, …) में संग्रहीत फ़ाइलों के फ़ाइल समय की तुलना करना वास्तव में एक दुःस्वप्न हो सकता है


6. वर्तमान समय के साथ फाइल समय की तुलना करना

इस कार्य के लिए वर्तमान समय के साथ फ़ाइल के अंतिम संशोधन समय की तुलना करने के लिए, यह केवल तिथि और समय प्रारूप सेटिंग्स को खाते में लेने के लिए पर्याप्त होना चाहिए।

बैच कोड नीचे दिए गए कोड का विस्तार करते हुए विस्तार से समझाया बैक फ़ाइल पर मेरे जवाब में एन दिन से पुराने फ़ाइलों को हटाने के लिए । नीचे दिए गए कोड का उपयोग करने से पहले यह स्पष्टीकरण पढ़ा जाना चाहिए।

स्थानीय विंडोज पीसी पर फ़ाइल के लिए %~tI / %~tI द्वारा दिनांक और समय की तारीख / समय प्रारूप और तिथि / समय की स्ट्रिंग के आधार पर निर्भर होने पर, कोड के लिए छोटे बदलाव करना आवश्यक हो सकता है। बैच कोड की टिप्पणी लाइनों में उचित संकेत दिए गए हैं।

 @echo off setlocal EnableExtensions rem Get seconds since 1970-01-01 for current date and time. rem From date string only the last 10 characters are passed to GetSeconds rem which results in passing dd/mm/yyyy or dd.mm.yyyy in expected format rem to this subroutine independent on date string of environment variable rem DATE is with or without abbreviated weekday at beginning. call :GetSeconds "%DATE:~-10% %TIME%" rem Subtract seconds for 4 hours (4 * 3600 seconds) from seconds value. set /A "CompareTime=Seconds-4*3600" rem Define batch file itself as the file to compare time by default. set "FileToCompareTime=%~f0" rem If batch file is started with a parameter and the parameter rem specifies an existing file (or directory), compare with last rem modification date of this file. if not "%~1" == "" ( if exist "%~1" set "FileToCompareTime=%~1" ) rem Get seconds value for the specified file. for %%F in ("%FileToCompareTime%") do call :GetSeconds "%%~tF:0" rem Compare the two seconds values. if %Seconds% LSS %CompareTime% ( echo File %FileToCompareTime% was last modified for more than 4 hours. ) else ( echo File %FileToCompareTime% was last modified within the last 4 hours. ) endlocal goto :EOF rem No validation is made for best performance. So make sure that date rem and hour in string is in a format supported by the code below like rem MM/DD/YYYY hh:mm:ss or M/D/YYYY h:m:s for English US date/time. :GetSeconds rem If there is " AM" or " PM" in time string because of using 12 hour rem time format, remove those 2 strings and in case of " PM" remember rem that 12 hours must be added to the hour depending on hour value. set "DateTime=%~1" set "Add12Hours=0" if "%DateTime: AM=%" NEQ "%DateTime%" ( set "DateTime=%DateTime: AM=%" ) else if "%DateTime: PM=%" NEQ "%DateTime%" ( set "DateTime=%DateTime: PM=%" set "Add12Hours=1" ) rem Get year, month, day, hour, minute and second from first parameter. for /F "tokens=1-6 delims=,-./: " %%A in ("%DateTime%") do ( rem For English US date MM/DD/YYYY or M/D/YYYY set "Day=%%B" & set "Month=%%A" & set "Year=%%C" rem For German date DD.MM.YYYY or English UK date DD/MM/YYYY rem set "Day=%%A" & set "Month=%%B" & set "Year=%%C" set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F" ) rem Remove leading zeros from the date/time values or calculation could be wrong. if "%Month:~0,1%" EQU "0" ( if "%Month:~1%" NEQ "" set "Month=%Month:~1%" ) if "%Day:~0,1%" EQU "0" ( if "%Day:~1%" NEQ "" set "Day=%Day:~1%" ) if "%Hour:~0,1%" EQU "0" ( if "%Hour:~1%" NEQ "" set "Hour=%Hour:~1%" ) if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" ) if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" ) rem Add 12 hours for time range 01:00:00 PM to 11:59:59 PM, rem but keep the hour as is for 12:00:00 PM to 12:59:59 PM. if "%Add12Hours%" == "1" ( if %Hour% LSS 12 set /A Hour+=12 ) set "DateTime=" set "Add12Hours=" rem Must use 2 arrays as more than 31 tokens are not supported rem by command line interpreter cmd.exe respectively command FOR. set /A "Index1=Year-1979" set /A "Index2=Index1-30" if %Index1% LEQ 30 ( rem Get number of days to year for the years 1980 to 2009. for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y" for /F "tokens=%Index1% delims= " %%L in ("YNNNYNNNYNNNYNNNYNNNY NNNYNNNYN") do set "LeapYear=%%L" ) else ( rem Get number of days to year for the years 2010 to 2038. for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y" for /F "tokens=%Index2% delims= " %%L in ("NNYNNNYNNNYNNNYNNNYNN NYNNNYNN") do set "LeapYear=%%L" ) rem Add the days to month in year. if "%LeapYear%" == "N" ( for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M" ) else ( for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M" ) rem Add the complete days in month of year. set /A "Days+=Day-1" rem Calculate the seconds which is easy now. set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second" rem Exit this subroutine goto :EOF 

रोजोज़ ने जानकारी दी कि तारीख और समय प्रारूप सेटिंग्स, फ़ाइल सिस्टम और विंडोज संस्करण को wmic – विंडोज मैनेजमेंट इंस्ट्रूमेंटेशन कमांड लाइन उपयोगिता का उपयोग करके कैसे अनदेखा किया जा सकता है।

WMIC का उपयोग करने के लिए दिनांक / समय की स्ट्रिंग्स के लिए निश्चित प्रारूप का लाभ होता है और इसलिए बैच कोड सभी विंडोज कंप्यूटर पर स्थानीय दिनांक / समय स्वरूप के अनुकूलन के बिना काम करता है।

GetFileTime फ़ंक्शन (सबसे अधिक संभावना) के आंतरिक उपयोग की वजह से विंडोज का भी संस्करण WMIC का उपयोग करने पर कोई फर्क नहीं पड़ता है।

फ़ाइल सिस्टम केवल स्थानीय समय / फ़ाइल समय की ऑफसेट यूटीसी के मूल्यांकन के लिए महत्वपूर्ण है। कम से कम मिनट के लिए FAT ड्राइव पर कमांड wmic रिटर्न +*** यूटीसी को ऑफसेट मिनट के लिए, जबकि मिनट ऑफसेट सही है एक NTFS ड्राइव पर फ़ाइल की अंतिम संशोधन फ़ाइल समय के लिए।

NTFS और FAT32 ड्राइव पर समान फ़ाइल का उदाहरण:

 NTFS: 20071011192622.000000+120 FAT32: 20071011192622.000000+*** 

+120 सीईटी (मध्य यूरोपीय समय) के लिए +60 मिनट और सक्रिय डेलाइट सेविंग टाइम के लिए 60 मिनट या सीईएसटी (मध्य यूरोपीय ग्रीष्मकालीन समय) के लिए +120 मिनट के दूसरे शब्दों में है।

इसलिए नीचे बैच कोड यूटीसी को ऑफसेट मिनटों का मूल्यांकन नहीं करता है, जो वर्तमान स्थानीय समय के साथ फ़ाइल के अंतिम संशोधन फ़ाइल समय की तुलना करने के लिए आवश्यक नहीं है।

इसके अलावा फ़ाइल नाम हमेशा पूर्ण पथ के साथ wmic कमांड लाइन में निर्दिष्ट होना चाहिए। बस वर्तमान निर्देशिका में फ़ाइल के लिए फाइल नाम या सापेक्ष पथ के साथ फाइल नाम निर्दिष्ट करना काम नहीं करता है। और प्रत्येक बैकस्लैश को पथ के साथ फाइल नाम में एक और बैकस्लैश से बचाना होगा।

Wmic का उपयोग करने पर मुख्य नुकसान गति है उपर्युक्त बैच कोड की प्रक्रिया मॉनिटर लॉग (कई रनों की औसत) के अनुसार अपने कंप्यूटर पर 50 एमएस के बारे में खत्म होने की आवश्यकता है। फोन करने वाले नीचे दिए गए बैच कोड को दो बार के लिए एक ही कार्य के लिए लगभग 1500 एमएस खत्म करने के लिए (एक औसत मूल्य भी) की आवश्यकता होती है। इसलिए बड़ी संख्या में फाइलों पर wmic का उपयोग करना निश्चित रूप से एक अच्छा विचार नहीं है क्योंकि स्थानीय दिनांक / समय प्रारूप ज्ञात होने के कारण इसे बचाया जा सकता है।

 @echo off setlocal EnableExtensions rem Get seconds since 1970-01-01 for current date and time. for /F "tokens=2 delims==." %%T in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do call :GetSeconds %%T rem Subtract seconds for 4 hours (4 * 3600 seconds) from seconds value. set /A "CompareTime=Seconds-4*3600" rem Define batch file itself as the file to compare time by default. set "FileToCompareTime=%~f0" rem If batch file is started with a parameter and the parameter rem specifies an existing file (or directory), compare with last rem modification date of this file. if not "%~1" == "" ( if exist "%~f1" set "FileToCompareTime=%~f1" ) rem Get seconds value for the specified file. set "DataFile=%FileToCompareTime:\=\\%" for /F "usebackq tokens=2 delims==." %%T in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE where "name='%DataFile%'" GET LastModified /VALUE`) do echo call :GetSeconds %%T rem Compare the two seconds values. if %Seconds% LSS %CompareTime% ( echo File %FileToCompareTime% was last modified for more than 4 hours. ) else ( echo File %FileToCompareTime% was last modified within the last 4 hours. ) endlocal goto :EOF rem Date/time format used by the command line utility of Windows rem Management Instrumentation is always YYYYMMDDHHmmss with a rem dot and a 6 digit microsecond value and plus/minus 3 digit rem time offset to UTC in minutes independent on region and rem language settings. Microsecond is always 000000 for a file rem time. The minutes offset including time zone offset and rem current daylight saving time offset is returned for a file rem time only for a file on an NTFS drive. Minutes offset is rem +*** for a file on a FAT drive (at least on Windows XP). :GetSeconds rem Get year, month, day, hour, minute and second from first parameter. set "DateTime=%~1" set "Year=%DateTime:~0,4%" set "Month=%DateTime:~4,2%" set "Day=%DateTime:~6,2%" set "Hour=%DateTime:~8,2%" set "Minute=%DateTime:~10,2%" set "Second=%DateTime:~12,2%" rem echo Date/time is: %Year%-%Month%-%Day% %Hour%:%Minute%:%Second% rem Remove leading zeros from the date/time values or calculation could be wrong. if "%Month:~0,1%" EQU "0" ( if "%Month:~1%" NEQ "" set "Month=%Month:~1%" ) if "%Day:~0,1%" EQU "0" ( if "%Day:~1%" NEQ "" set "Day=%Day:~1%" ) if "%Hour:~0,1%" EQU "0" ( if "%Hour:~1%" NEQ "" set "Hour=%Hour:~1%" ) if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" ) if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" ) rem Must use 2 arrays as more than 31 tokens are not supported rem by command line interpreter cmd.exe respectively command FOR. set /A "Index1=Year-1979" set /A "Index2=Index1-30" if %Index1% LEQ 30 ( rem Get number of days to year for the years 1980 to 2009. for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y" for /F "tokens=%Index1% delims= " %%L in ("YNNNYNNNYNNNYNNNYNNNY NNNYNNNYN") do set "LeapYear=%%L" ) else ( rem Get number of days to year for the years 2010 to 2038. for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y" for /F "tokens=%Index2% delims= " %%L in ("NNYNNNYNNNYNNNYNNNYNN NYNNNYNN") do set "LeapYear=%%L" ) rem Add the days to month in year. if "%LeapYear%" == "N" ( for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M" ) else ( for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M" ) rem Add the complete days in month of year. set /A "Days+=Day-1" rem Calculate the seconds which is easy now. set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second" rem Exit this subroutine goto :EOF 

इसके लिए इसका समाधान अपेक्षित समय-सीमा पर अधिक निर्भर करेगा, क्योंकि AFAIK आपको बाहरी कार्यक्रमों के बिना एक बैच फ़ाइल में एक पूर्णांक के रूप में समय नहीं मिलता है। इसका मतलब है कि आपको अपनी स्क्रिप्ट में टाइम वेल्यू को पार्स करना होगा, और पार्सिंग की संख्या और आवश्यक गणना की संख्या, उस रेंज पर निर्भर करती है, जिसके लिए आपको इसके लिए काम करना चाहिए। यहाँ एक सरल समाधान है ऐसा लगता है कि फ़ाइल 24 घंटे से अधिक पुरानी नहीं हो सकती।

 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=4*60" if %age% geq %max% echo.file is older than 4 hours 

शुद्ध बैच तिथि गणित में भयानक है। यदि आपकी स्क्रिप्ट आधी रात के बाद शीघ्र चलती है तो क्या होगा? क्या होगा यदि समय की जांच एक डेलाइट सेविंग टाइम में परिवर्तन बदलती है?

मैं विंडोज स्क्रिप्ट होस्ट को लागू करने और एक ऐसी भाषा से उधार लेना प्रस्तावित करता हूं जो कि तारीख / समय का बेहतर ढंग से संभालती है यहाँ एक हाइब्रिड बैच / जेस्क्रिप्ट स्क्रिप्ट है जो एक फ़ाइल या डायरेक्टरी की उम्र को बहुत आसानी से गिना जाएगा। इसे .bat एक्सटेंशन से बचाएं और इसे एक शॉट दें

 @if (@CodeSection==@Batch) @then @echo off setlocal set "file=C:\Path\To\File.ext" for /f %%I in ('cscript /nologo /e:JScript "%~f0" "%file%"') do ( rem // value contained in %%I is in minutes. if %%I gtr 240 ( echo %file% is over 4 hours old. rem // do stuff here to take whatever actions you wish rem // if the file is over 4 hours old. ) ) goto :EOF @end // end batch portion / begin JScript hybrid chimera 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)); 

बैच / जेस्क्रिप्ट हाइब्रिड स्क्रिप्ट्स के बारे में अधिक जानकारी के लिए, यह GitHub पृष्ठ देखें । उपरोक्त शैली उस पृष्ठ पर हाइब्रिड.बैट के समान है। यह उत्तर दूसरे पर आधारित है । इसकी योग्यता के लिए, PowerShell तिथि गणित को संभालने में भी अच्छा है; लेकिन डब्लूएसएच बहुत जल्दी चल रहा है

वैकल्पिक रूप से आप उदाहरण के लिए सी # का उपयोग करके एक साधारण प्रोग्राम बना सकते हैं:

 // compile using c:\Windows\Microsoft.NET\Framework\v3.5\csc FileByAge.cs using System; using System.IO; public static class Program { public static void Main(string[] args) { double age = double.Parse(args[0]); string fileName; while ((fileName = Console.ReadLine()) != null) { if(age >= (DateTime.Now - new FileInfo(fileName).CreationTime).TotalHours) { continue; } Console.WriteLine(fileName); } } } 

उस प्रोग्राम को तब उस बैच फ़ाइल में 2 घंटे से अधिक पुराने फ़ाइलों की खोज करने के लिए उपयोग किया जा सकता है:

 for /F "delims=" %f in ('dir /B *.txt^|FileByAge.exe 2') do echo %f 

एक बेहतर और आत्म-संकलन संस्करण

जैसा कि @ पॉल द्वारा उल्लेखित किया गया था वह एक हैकी हाइब्रिड बैच / सी # फ़ाइल भी बना सकता है जो खुद को संकलित और चलाएगा:

 @echo off setlocal set CsFile=%TEMP%\%~n0.cs set ExeFile=%TEMP%\%~n0.exe pushd %SystemRoot%\Microsoft.NET\Framework for /F %%f in ('dir /B /O:-N v*') do cd %%f & goto :BreakLoop; :BreakLoop (echo /* & type "%~f0") > "%CsFile%" csc.exe /nologo /out:"%ExeFile%" "%CsFile%" del "%CsFile%" popd more | "%ExeFile%" %* del "%ExeFile%" endlocal goto:eof */ using System; using System.IO; public static class Program { public static void Main(string[] args) { var olderThen = args[0].Contains("older"); var targetAge = double.Parse(args[1]); string fileName; while ((fileName = Console.ReadLine()) != null) { if (string.Empty == fileName) { continue; } var fileAge = (DateTime.Now - new FileInfo(fileName).CreationTime).TotalHours; if (olderThen ? targetAge > fileAge : targetAge < fileAge) { continue; } Console.WriteLine(fileName); } } } 

और इस तरह से इस्तेमाल किया जा सकता है:

 for /F "delims=" %f in ('dir /B *.txt^|FileByAge.bat older 2') do echo %f