दिलचस्प पोस्ट
एंड्रॉइड वेबदृश्य के साथ फेसबुक लॉगिन काम करना मैं कोड को किस विधानसभा का पथ प्राप्त कर सकता हूं? निर्भरता के साथ एक जार बनाने के लिए Gradle का उपयोग करना जावा में एक कस्टम ईवेंट बनाएं अजगर: कई संदर्भ प्रबंधकों पर "के साथ" ब्लॉक बनाएं बहु-लाइन खोज के लिए रेगेक्स (जीआरपी) की आवश्यकता Python में क्वेरी स्ट्रिंग urlencode कैसे करें? त्रुटि: ग्राहक को भेजे जाने के बाद हेडर सेट नहीं कर सकते एंड्रॉइड: ScrollView स्क्रॉलिंग बंद हो जाता है जब पता लगाएं अगर जावा में बयान की लंबी सूची एंड्रॉइड स्टूडियो त्रुटि: त्रुटि: CreateProcess त्रुटि = 216,% 1 का यह संस्करण आप चला रहे विंडोज के संस्करण के साथ संगत नहीं है जो @NotNull जावा एनोटेशन मैं उपयोग करना चाहिए? jQuery के jquery-1.10.2.min.map एक ट्रिगर है 404 (नहीं मिला) जांचें कि फ़ाइल पहले से ही खुली है जावास्क्रिप्ट के eval को JSON डेटा eval करने के लिए कोष्ठक की आवश्यकता क्यों है?

बैच फाइल एन दिनों से पुराने फ़ाइलों को हटाने के लिए

मैं एक MS-DOS बैच फ़ाइल में 7 दिनों से पुरानी सभी फ़ाइलों को हटाने का एक तरीका ढूंढ रहा हूं। मैंने वेब के चारों ओर खोज की है, और सैकड़ों पंक्तियों के कोड के साथ कुछ उदाहरण मिलते हैं, और दूसरों को कार्य पूरा करने के लिए अतिरिक्त कमांड लाइन उपयोगिताओं को स्थापित करने की आवश्यकता होती है।

इसी प्रकार की चीजों को बस कुछ लिंक्स कोड में बाश में किया जा सकता है । ऐसा लगता है कि Windows में बैच फ़ाइलों के लिए कम से कम दूर से कुछ आसान किया जा सकता है मैं किसी ऐसे समाधान की तलाश कर रहा हूँ जो मानक विंडोज कमांड प्रॉम्प्ट में काम करता है, बिना किसी अतिरिक्त उपयोगिताओं के कृपया कोई भी PowerShell या Cygwin या तो नहीं

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

का आनंद लें:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path" 

अधिक जानकारी के लिए फाईल प्रलेखन देखें।

अधिक उपहार के लिए, Windows XP कमांड लाइन का एक एज़ इंडेक्स देखें।

यदि आपके मशीन पर forfiles स्थापित नहीं हैं, तो उसे किसी भी विंडोज़ सर्वर 2003 से %WinDir%\system32\ पर अपने Windows XP मशीन से कॉपी करें। यह संभव है क्योंकि EXE Windows Server 2003 और Windows XP के बीच पूरी तरह से संगत है।

विंडोज और विंडोज सर्वर के बाद के संस्करणों ने इसे डिफ़ॉल्ट रूप से स्थापित किया है।

विंडोज 7 के लिए:

वाक्यविन्यास थोड़ा बदल गया है इसलिए अद्यतन कमांड है:

 forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path" 

निम्न कमांड चलाएं:

 ROBOCOPY C:\source C:\destination /mov /minage:7 del C:\destination /q 

सभी फाइलों को स्थानांतरित करें (जो कि / एमओवी का उपयोग करता है, जो फाइलों को स्थानांतरित करता है और फिर उन्हें विरोध करता है / जैसा कि पूरे फाइलट्रीज़ को स्थानांतरित करता है, जो तब हटाया जाता है) को दूसरे स्थान पर रोबोकोपी के जरिए हटाया जाता है, और उसके बाद उस पथ पर एक कमांड कमांड निष्पादित करें और आप सभी अच्छा।

इसके अलावा अगर आपके पास इसके बहुत सारे डेटा के साथ एक निर्देशिका है तो आप /mir स्विच का उपयोग कर सकते हैं

ओके को थोड़ी ऊब गया था और इस के साथ आया था, जिसमें एक गरीब आदमी के लिनक्स युग प्रतिस्थापन का मेरा संस्करण दैनिक उपयोग के लिए सीमित है (कोई भी समय धारणा नहीं):

7daysclean.cmd

 @echo off setlocal ENABLEDELAYEDEXPANSION set day=86400 set /a year=day*365 set /a strip=day*7 set dSource=C:\temp call :epoch %date% set /a slice=epoch-strip for /f "delims=" %%f in ('dir /adhs /b /s %dSource%') do ( call :epoch %%~tf if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^) ) exit /b 0 rem Args[1]: Year-Month-Day :epoch setlocal ENABLEDELAYEDEXPANSION for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f if "!Months:~0,1!"=="0" set Months=!Months:~1,1! if "!Days:~0,1!"=="0" set Days=!Days:~1,1! set /a Days=Days*day set /a _months=0 set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1) set /a Months=!_months! set /a Years=(Years-1970)*year set /a Epoch=Years+Months+Days endlocal& set Epoch=%Epoch% exit /b 0 

उपयोग

set /a strip=day*7 : 7 दिनों की संख्या रखने के लिए बदलें।

set dSource=C:\temp : यह फाइलों की जांच करने के लिए प्रारंभिक निर्देशिका है

टिप्पणियाँ

यह गैर-विनाशकारी कोड है, यह प्रदर्शित करेगा कि क्या हुआ होगा।

परिवर्तन :

 if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^) 

जैसे कुछ करने के लिए:

 if !epoch! LEQ %slice% del /f %%f 

इसलिए फ़ाइलों को वास्तव में हटा दिया जाता है

फरवरी : 28 दिनों तक कठिन कोड होता है। बिसेस्सेटाइल साल एक नरक है, वास्तव में जोड़ें अगर किसी के पास कोई विचार है जो 10 लाइनों कोड को नहीं जोड़ता, तो आगे बढ़ो और पोस्ट करें ताकि मैं इसे अपने कोड में जोड़ूँ।

युग : मैंने समय को ध्यान में नहीं लिया, क्योंकि ज़रूरत एक निश्चित तारीख से पुरानी फाइलें हटाना है, घंटे / मिनट लेने के दौरान एक दिन से फाइलें नष्ट हो जाती थी, जो कि रखने के लिए होती थी

परिसीमन

युको के लिए आपकी संक्षिप्त तिथि प्रारूप YYYY-MM-DD दी गई है इसे अन्य सेटिंग्स या रन-टाइम मूल्यांकन के लिए अनुकूलित करने की आवश्यकता होगी (एसशॉर्टटाइम, उपयोगकर्ता-बाध्य कॉन्फ़िगरेशन पढ़ें, फ़िल्टर में उचित फ़ील्ड ऑर्डर कॉन्फ़िगर करें और तर्क से सही डेटा निकालने के लिए फ़िल्टर का उपयोग करें)।

क्या मैंने उल्लेख किया कि मैं इस संपादक के ऑटो-फार्मेट से नफरत करता हूं? यह रिक्त लाइनों को हटा देता है और कॉपी-पेस्ट एक नरक है

आशा है कि ये आपकी मदद करेगा।

एक समान प्रश्न के उत्तर पर मेरी एक नज़र डालें:

 REM del_old.bat REM usage: del_old MM-DD-YYY for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa" 

यह किसी दी गई तारीख से पुरानी फ़ाइलें हटाता है। मुझे यकीन है कि वर्तमान तिथि से सात दिन वापस जाने के लिए इसे संशोधित किया जा सकता है।

अद्यतन: मैंने देखा है कि हर्ब सीएसओ ने ऊपर लिपि में सुधार किया है। मैं इसके बजाय उसके संस्करण का उपयोग करने की सलाह देता हूं

 forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path" 

आपको करना चाहिए /d -3 (3 दिन पहले) यह मेरे लिए ठीक काम करता है तो सभी जटिल बैचों कचरा बिन में हो सकते हैं इसके अलावा forfiles यूएनसी पथ का समर्थन नहीं करते हैं, तो एक विशिष्ट ड्राइव के लिए एक नेटवर्क कनेक्शन बनाते हैं।

मेरा आदेश है

 forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH – मेरे मामले में सिर्फ पथ है, इसलिए मुझे @PATH\@FILE

भी forfiles /? मेरे लिए भी काम नहीं कर रहा है, लेकिन forfiles ("?" के बिना) ठीक काम किया।

और मेरे पास एकमात्र प्रश्न है: एकाधिक मुखौटा कैसे जोड़ें (उदाहरण के लिए " .log। .bak")?

यह सभी forfiles.exe के बारे में जो मैंने यहां डाउनलोड किया है (जीत XP पर)

लेकिन अगर आप विंडोज सर्वर का उपयोग कर रहे हैं forfiles.exe पहले से ही वहाँ होना चाहिए और यह FTP संस्करण से अलग है यही कारण है कि मुझे कमांड को संशोधित करना चाहिए

Windows Server 2003 के लिए मैं इस कमांड का उपयोग कर रहा हूं:

 forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH" 

Windows सर्वर 2008 R2 के लिए:

 forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH" 

यह सभी .sql फ़ाइलों को 90 दिनों से पुरानी हटा देगा।

इस कोड को कॉपी करें और इसे DelOldFiles.vbs के रूप में सहेजें।

केवल कॉमांड प्रॉम्प्ट में उपयोग: cscript DelOldFiles.vbs 15

15 का अर्थ पूर्व में 15 दिनों से पुरानी फाइलें हटाना है।

  'copy from here Function DeleteOlderFiles(whichfolder) Dim fso, f, f1, fc, n, ThresholdDate Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(whichfolder) Set fc = f.Files Set objArgs = WScript.Arguments n = 0 If objArgs.Count=0 Then howmuchdaysinpast = 0 Else howmuchdaysinpast = -objArgs(0) End If ThresholdDate = DateAdd("d", howmuchdaysinpast, Date) For Each f1 in fc If f1.DateLastModified<ThresholdDate Then Wscript.StdOut.WriteLine f1 f1.Delete n = n + 1 End If Next Wscript.StdOut.WriteLine "Deleted " & n & " file(s)." End Function If Not WScript.FullName = WScript.Path & "\cscript.exe" Then WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past." WScript.Quit 0 End If DeleteOlderFiles(".") 'to here 

फ़ॉर्फ़ाइल उपयोग करें

अलग-अलग संस्करण हैं प्रारंभिक लोग यूनिक्स शैली पैरामीटर का उपयोग करते हैं

मेरा संस्करण (सर्वर 2000 के लिए – स्विचेस के बाद स्थान पर ध्यान दें) –

 forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path" 

XP में forfiles जोड़ने के लिए, ftp://ftp.microsoft.com/ResKit/y2kfix/x86/ से exe प्राप्त करें

और इसे C: \ WINDOWS \ system32 में जोड़ें

आईएमओ, जावास्क्रिप्ट धीरे-धीरे एक सार्वभौमिक स्क्रिप्टिंग मानक बनता जा रहा है: यह शायद किसी भी अन्य स्क्रिप्टिंग भाषा की तुलना में अधिक उत्पादों में उपलब्ध है (विंडोज में, यह विंडोज स्क्रिप्टिंग होस्ट का उपयोग कर उपलब्ध है)। मुझे बहुत सारी फ़ोल्डरों में पुरानी फाइलों को साफ़ करना होगा, इसलिए यहां ऐसा करने के लिए जावास्क्रिप्ट फ़ंक्शन है:

 // run from an administrator command prompt (or from task scheduler with full rights): wscript jscript.js // debug with: wscript /d /x jscript.js var fs = WScript.CreateObject("Scripting.FileSystemObject"); clearFolder('C:\\temp\\cleanup'); function clearFolder(folderPath) { // calculate date 3 days ago var dateNow = new Date(); var dateTest = new Date(); dateTest.setDate(dateNow.getDate() - 3); var folder = fs.GetFolder(folderPath); var files = folder.Files; for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() ) { var file = it.item(); if( file.DateLastModified < dateTest) { var filename = file.name; var ext = filename.split('.').pop().toLowerCase(); if (ext != 'exe' && ext != 'dll') { file.Delete(true); } } } var subfolders = new Enumerator(folder.SubFolders); for (; !subfolders.atEnd(); subfolders.moveNext()) { clearFolder(subfolders.item().Path); } } 

प्रत्येक फ़ोल्डर को साफ़ करने के लिए, बस एक स्पष्ट कॉल फ़ॉल्स्टर () फ़ंक्शन में जोड़ें। यह विशेष कोड भी exe और dll फ़ाइलों को सुरक्षित रखता है, और सबफ़ोल्डर को भी साफ करता है

कैसे इस संशोधन के बारे में 7daysclean.cmd खाते में एक लीप वर्ष लेने के लिए?

यह कोडिंग के 10 से कम लाइनों में किया जा सकता है!

 set /a Leap=0 if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day set /a Months=!_months!+Leap 

मोफी द्वारा संपादित करें:

जेआर द्वारा योगदान की गई उपरोक्त स्थिति अमान्य सिंटैक्स के कारण हमेशा गलत मानती है।

और Month GEQ 2 भी गलत है क्योंकि एक और दिन के लिए 86400 सेकंड जोड़ना एक लीप वर्ष में केवल मार्च से दिसम्बर महीने तक ही होना चाहिए, लेकिन फरवरी के लिए नहीं।

एक कामकाजी कोड को लीप दिन खाते में लेने के लिए – चालू वर्ष में केवल – बैच फ़ाइल में 7daysclean.cmd जैन द्वारा पोस्ट किया जाएगा:

 set "LeapDaySecs=0" if %Month% LEQ 2 goto CalcMonths set /a "LeapRule=Years%%4" if %LeapRule% NEQ 0 goto CalcMonths rem The other 2 rules can be ignored up to year 2100. set /A "LeapDaySecs=day" :CalcMonths set /a Months=!_months!+LeapDaySecs 

बैच फ़ाइल के साथ हल करने के लिए अक्सर सापेक्ष तिथि / समय संबंधी प्रश्न होते हैं। लेकिन कमांड लाइन इंटरप्रेटर सीएमडी.एक्सए की तारीख / समय गणना के लिए कोई फ़ंक्शन नहीं है। अतिरिक्त कंसोल अनुप्रयोगों या स्क्रिप्ट का उपयोग करते हुए बहुत अच्छे काम करने वाले समाधान पहले से ही यहां, स्टैक ओवरफ्लो के अन्य पृष्ठों पर और अन्य वेबसाइट्स पर पोस्ट किए गए हैं।

एक निर्धारित दिन के बाद से दिनांक / समय स्ट्रिंग को सेकंड में बदलने के लिए दिनांक / समय के आधार पर संचालन के लिए सामान्य है। बहुत सामान्य है 1970-01-01 00:00:00 यूटीसी। लेकिन किसी भी बाद के दिन भी एक विशेष कार्य के लिए समर्थन करने के लिए आवश्यक तिथि सीमा के आधार पर इस्तेमाल किया जा सकता है।

जे ने 7daysclean.cmd को कमांड लाइन इंटरप्रेटर cmd.exe के लिए एक तेज़ "डेट टू सेकंड" समाधान युक्त किया। लेकिन यह लीप वर्ष सही नहीं लेता है। जेआर ने चालू वर्ष में लीप दिवस को ध्यान में रखते हुए एक ऐड-ऑन पोस्ट किया है, लेकिन आधार वर्ष के बाद से अन्य लीप वर्ष की अनदेखी, अर्थात् 1 9 70 के बाद से।

मैं सी / सी ++ में लिखे गए अपने अनुप्रयोगों में तारीख / समय रूपांतरण कार्यों में 1 901-01-01 से लीप वाले दिनों सहित जल्दी से दिनों की संख्या प्राप्त करने के लिए एक बार छोटे सी फ़ंक्शन के साथ 20 साल की स्थिर सारणी (एरेज़) का उपयोग किया था।

यह बहुत तेज़ टेबल विधि का इस्तेमाल बैक कोड में FOR कमांड के द्वारा भी किया जा सकता है। इसलिए मैंने बैच GetSeconds कोड का फैसला किया है जो 1 GetSeconds 00:00:00 यूटीसी से GetSeconds की संख्या की गणना करता है जो तारीख / समय स्ट्रिंग के लिए इस दिनचर्या को पारित हो जाता है।

नोट: लिप सेकंड्स को ध्यान में नहीं रखा जाता क्योंकि विंडोज़ फ़ाइल सिस्टम लिप सेकंड्स का समर्थन भी नहीं करता है।

सबसे पहले, तालिकाओं:

  1. 1 9 71-01-01 00:00:00 दिन से प्रत्येक वर्ष लीप दिनों सहित यूटीसी

     1970 - 1979: 0 365 730 1096 1461 1826 2191 2557 2922 3287 1980 - 1989: 3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 1990 - 1999: 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 2000 - 2009: 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245 2010 - 2019: 14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 2020 - 2029: 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 2030 - 2039: 21915 22280 22645 23011 23376 23741 24106 24472 24837 25202 2040 - 2049: 25567 25933 26298 26663 27028 27394 27759 28124 28489 28855 2050 - 2059: 29220 29585 29950 30316 30681 31046 31411 31777 32142 32507 2060 - 2069: 32872 33238 33603 33968 34333 34699 35064 35429 35794 36160 2070 - 2079: 36525 36890 37255 37621 37986 38351 38716 39082 39447 39812 2080 - 2089: 40177 40543 40908 41273 41638 42004 42369 42734 43099 43465 2090 - 2099: 43830 44195 44560 44926 45291 45656 46021 46387 46752 47117 2100 - 2106: 47482 47847 48212 48577 48942 49308 49673 

    वर्ष 2039 से 2106 के युग के लिए युग की शुरुआत 1 9 71-01-01 के साथ गणना केवल एक अहस्ताक्षरित 32-बिट चर का उपयोग करने के साथ ही संभव है, अर्थात सी / सी ++ में अहस्ताक्षरित लंबे (या अहस्ताक्षरित)

    लेकिन सीएमडी.एक्सई ने हस्ताक्षर किए 32-बिट चर के गणितीय अभिव्यक्ति के लिए उपयोग किया है। इसलिए अधिकतम मान 2147483647 (0x7FFFFFFF) है जो 2038-01-19 03:14:07 है।

  2. वर्ष 1 9 70 से 2106 के लिए लीप वर्ष की जानकारी (नहीं / हां)

     1970 - 1989: NNYNNNYNNNYNNNYNNNYN 1990 - 2009: NNYNNNYNNNYNNNYNNNYN 2010 - 2029: NNYNNNYNNNYNNNYNNNYN 2030 - 2049: NNYNNNYNNNYNNNYNNNYN 2050 - 2069: NNYNNNYNNNYNNNYNNNYN 2070 - 2089: NNYNNNYNNNYNNNYNNNYN 2090 - 2106: NNYNNNYNNNNNNNYNN ^ year 2100 
  3. चालू वर्ष में प्रत्येक माह के पहले दिन के लिए दिन की संख्या।

      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Year with 365 days: 0 31 59 90 120 151 181 212 243 273 304 334 Year with 366 days: 0 31 60 91 121 152 182 213 244 274 305 335 

1 9 -0-01-01 के बाद से एक तारीख को सेकंड की संख्या में परिवर्तित करना उन तालिकाओं का उपयोग करना काफी आसान है।

कृपया ध्यान दें!

दिनांक और समय स्ट्रिंग का प्रारूप विंडोज क्षेत्र और भाषा सेटिंग्स पर निर्भर करता है। सीमांकक और पर्यावरण के चर को सौंपा टोकन का क्रम, यदि आवश्यक हो तो GetSeconds लूप के लिए पहले Day , Month और Year को स्थानीय दिनांक / समय प्रारूप में अनुकूलित किया जाना चाहिए।

पर्यावरण चर की तारीख स्ट्रिंग अनुकूलन करने के लिए आवश्यक है यदि माहौल चर में दिनांक स्वरूप DATE से %%~tF लिए उपयोग किए गए प्रारूप से अलग है

उदाहरण के लिए जब %DATE% विस्तार Sun 02/08/2015 जबकि %%~tF विस्तार 02/08/2015 07:38 PM नीचे दिए गए कोड को लाइन 4 को संशोधित करने के साथ किया जा सकता है:

 call :GetSeconds "%DATE:~4% %TIME%" 

यह परिणाम सिर्फ 02/08/2015 को उप-रूट से गुजर रहा है – तारीख स्ट्रिंग के बिना 3 दिन के सप्ताह के संक्षिप्त नाम और अलग स्पेस वर्ण के बिना।

वैकल्पिक रूप से निम्नलिखित प्रारूप को सही प्रारूप में पास करने के लिए इस्तेमाल किया जा सकता है:

 call :GetSeconds "%DATE:~-10% %TIME%" 

अब दिनांक स्ट्रिंग से अंतिम 10 अक्षर GetSeconds फ़ंक्शन को पारित किए जाते हैं और इसलिए इससे कोई फर्क नहीं पड़ता कि पर्यावरण चर की तिथि स्ट्रिंग के साथ दिन या दिन के बिना दिन और महीने हमेशा अपेक्षित क्रम में 2 अंकों के साथ होते हैं, अर्थात प्रारूप dd/mm/yyyy dd.mm.yyyy या dd.mm.yyyy

ये बैच कोड है जिसमें समझाया गया है, जो कि सिर्फ आउटपुट करता है, जो कि फ़ाइल को हटाता है और जो C:\Temp फ़ोल्डर ट्री में रखता है, पहले लूप का कोड देखें।

 @echo off setlocal EnableExtensions EnableDelayedExpansion rem Get seconds since 1970-01-01 for current date and time. call :GetSeconds "%DATE% %TIME%" rem Subtract seconds for 7 days from seconds value. set /A "LastWeek=Seconds-7*86400" rem For each file in each subdirectory of C:\Temp get last modification date rem (without seconds -> append second 0) and determine the number of seconds rem since 1970-01-01 for this date/time. The file can be deleted if seconds rem value is lower than the value calculated above. for /F "delims=" %%F in ('dir /ADHS /B /S "C:\Temp"') do ( call :GetSeconds "%%~tF:0" rem if !Seconds! LSS %LastWeek% del /F "%%~fF" if !Seconds! LEQ %LastWeek% ( echo Delete "%%~fF" ) else ( echo Keep "%%~fF" ) ) 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 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 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 

इष्टतम प्रदर्शन के लिए यह सभी टिप्पणियों को हटाने के लिए सबसे अच्छा होगा, अर्थात 0-4 के प्रमुख स्थान के बाद सभी लाइनों को रिम के साथ शुरू होता है।

और arrays को भी छोटा किया जा सकता है, यानी 1 9 00-01 से 00:00:00 से 2038-01-19 03:14:07 तक की अवधि को कम कर दिया गया है, जैसा कि वर्तमान में बैच कोड द्वारा 2015-01 के लिए ऊपर दिया गया है -01 से 201 9-12-31 के रूप में नीचे दिए गए कोड का उपयोग करता है जो वास्तव में 7 दिनों से पुरानी फ़ाइलें C:\Temp फ़ोल्डर ट्री में हटाता है।

इसके अलावा नीचे बैच कोड 24 घंटे के समय प्रारूप के लिए अनुकूलित किया गया है।

 @echo off setlocal EnableDelayedExpansion call :GetSeconds "%DATE:~-10% %TIME%" set /A "LastWeek=Seconds-7*86400" for /F "delims=" %%F in ('dir /ADHS /B /S "C:\Temp"') do ( call :GetSeconds "%%~tF:0" if !Seconds! LSS %LastWeek% del /F "%%~fF" ) endlocal goto :EOF :GetSeconds for /F "tokens=1-6 delims=,-./: " %%A in ("%~1") do ( set "Day=%%B" & set "Month=%%A" & set "Year=%%C" set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F" ) 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%" ) set /A "Index=Year-2014" for /F "tokens=%Index% delims= " %%Y in ("16436 16801 17167 17532 17897") do set "Days=%%Y" for /F "tokens=%Index% delims= " %%L in ("NYNNN") do set "LeapYear=%%L" 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" ) set /A "Days+=Day-1" set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second" goto :EOF 

विंडोज़ की तारीख और समय प्रारूपों और फाइल टाइम तुल्यकालों के बारे में और अधिक जानकारी के लिए, मुझे पता लगाना है कि क्या फ़ाइल फ़ाइल समय के बारे में अतिरिक्त जानकारी के साथ बैच फ़ाइल में 4 घंटे से अधिक पुरानी है, पर मेरा जवाब देखें।

क्या मैं पहले से ही मूल्यवान धागा में एक विनम्र योगदान जोड़ सकता हूं मुझे लगता है कि अन्य समाधान वास्तविक त्रुटि पाठ से छुटकारा पा सकते हैं परन्तु% ERRORLEVEL% की उपेक्षा कर रहे हैं जो कि मेरे आवेदन में असफलता का संकेत देता है और मैं वैध रूप से% ErRORLEVEL% चाहता हूँ, जब तक कि यह "नहीं मिला है" त्रुटि नहीं है

कुछ उदाहरण:

डिबगिंग और विशेष रूप से त्रुटि को समाप्त करने:

 forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success 

ERRORLEVEL सफलता या विफलता को वापस करने के लिए एक यात्री का उपयोग करना:

 forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0 

अन्य कोड के बीच में एक बैचफ़ाइल के संदर्भ में सफलता के लिए शून्य पर ERRORLEVEL को रखने के लिए एक टूललाइन का उपयोग करना (वर्> नल ERRORLEVEL रीसेट करता है):

 forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul 

एक SQL सर्वर एजेंट CmdExec नौकरी चरण के लिए मैं निम्नलिखित पर उतरा मुझे नहीं पता कि यह एक बग है, लेकिन चरण के भीतर सीएमडीएक्सएक केवल कोड की पहली पंक्ति को पहचानता है:

 cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 | findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel% 

विंडोज़ 2012 आर 2 के लिए निम्न काम करेगा:

  forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c del @path" 

फ़ाइलों को देखने के लिए जो हटाए जाएंगे, इसका उपयोग करें

  forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate" 

मुझे लगता है कि ई। जेम्स का जवाब अच्छा है क्योंकि यह विंडोज़ के असम्बद्ध संस्करणों के साथ विंडोज़ 2000 एसपी 4 (और संभवतः पहले) के साथ काम करता है, लेकिन यह एक बाहरी फाइल को लिखना आवश्यक है यहां एक संशोधित संस्करण है जो संगतता बनाए रखने के दौरान बाहरी पाठ फ़ाइल नहीं बनाता है:

 REM del_old.cmd REM usage: del_old MM-DD-YYYY setlocal enabledelayedexpansion for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;" for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1) 

मूल प्रश्न पर सच होने के लिए, यहां यह एक स्क्रिप्ट है जो आपके लिए सभी गणित करता है यदि आप इसे पैरामीटर के रूप में दिनों की संख्या के साथ कहते हैं:

 REM del_old_compute.cmd REM usage: del_old_compute N setlocal enabledelayedexpansion set /a days=%1&set cur_y=%DATE:~10,4%&set cur_m=%DATE:~4,2%&set cur_d=%DATE:~7,2% for /f "tokens=1 delims==" %%a in ('set cur_') do if "!%%a:~0,1!"=="0" set /a %%a=!%%a:~1,1!+0 set mo_2=28&set /a leapyear=cur_y*10/4 if %leapyear:~-1% equ 0 set mo_2=29 set mo_1=31&set mo_3=31&set mo_4=30&set mo_5=31 set mo_6=30&set mo_7=31&set mo_8=31&set mo_9=30 set mo_10=31&set mo_11=30&set mo_12=31 set /a past_y=(days/365) set /a monthdays=days-((past_y*365)+((past_y/4)*1))&&set /a past_y=cur_y-past_y&set months=0 :setmonth set /a minusmonth=(cur_m-1)-months if %minusmonth% leq 0 set /a minusmonth+=12 set /a checkdays=(mo_%minusmonth%) if %monthdays% geq %checkdays% set /a months+=1&set /a monthdays-=checkdays&goto :setmonth set /a past_m=cur_m-months set /a lastmonth=cur_m-1 if %lastmonth% leq 0 set /a lastmonth+=12 set /a lastmonth=mo_%lastmonth% set /a past_d=cur_d-monthdays&set adddays=:: if %past_d% leq 0 (set /a past_m-=1&set adddays=) if %past_m% leq 0 (set /a past_m+=12&set /a past_y-=1) set mo_2=28&set /a leapyear=past_y*10/4 if %leapyear:~-1% equ 0 set mo_2=29 %adddays%set /a past_d+=mo_%past_m% set d=%past_m%-%past_d%-%past_y% for /f "tokens=*" %%a IN ('xcopy *.* /d:%d% /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;" for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1) 

नोट: उपर्युक्त कोड को लीप वर्ष के साथ-साथ प्रत्येक माह के दिनों की सटीक संख्या भी लेते हैं। केवल अधिकतम 0 0/0/0 के बाद से दिनों की कुल संख्या है (उसके बाद ऋणात्मक वर्ष लौटते हैं)।

नोट: गणित केवल एक ही रास्ता जाता है; यह नकारात्मक इनपुट से भविष्य की तारीखों को सही तरीके से नहीं प्राप्त कर सकता है (यह कोशिश करेगा, लेकिन संभवतया महीने के आखिरी दिन में जाने की संभावना है)।

आप इसे बंद करने में सक्षम हो सकते हैं आप इस प्रश्न को एक सरल उदाहरण के लिए देख सकते हैं। जटिलता आता है, जब आप तिथियों की तुलना शुरू करते हैं। यह बताने में आसान हो सकता है कि तारीख अधिक है या नहीं, लेकिन कई स्थितियों पर विचार करने के लिए यदि आपको वास्तव में दो तिथियों में अंतर होना चाहिए

दूसरे शब्दों में – इस का आविष्कार करने की कोशिश मत करो, जब तक आप वास्तव में तीसरे पक्ष के उपकरण का उपयोग नहीं कर सकते।

यदि आपके पास एक्सपी संसाधन किट है, तो आप एक ही निर्देशिका में सभी पुरानी निर्देशिकाओं को स्थानांतरित करने के लिए रोबोकॉपी का उपयोग कर सकते हैं, फिर उस एक को हटाने के लिए rmdir का उपयोग करें:

 mkdir c:\temp\OldDirectoriesGoHere robocopy c:\logs\SoManyDirectoriesToDelete\ c:\temp\OldDirectoriesGoHere\ /move /minage:7 rmdir /s /qc:\temp\OldDirectoriesGoHere 

यह कुछ भी आश्चर्यजनक नहीं है, लेकिन मुझे आज ऐसा कुछ करने की जरूरत है और इसे शेड्यूल किए गए कार्य आदि के रूप में चलाने की ज़रूरत है।

बैच फ़ाइल, DelFilesOlderThanNDays.bat नीचे नमूना exec w / पैरामीटर के साथ:

DelFilesOlderThanNDays.bat 7 C: \ dir1 \ dir2 \ dir3 \ logs * .log

 echo off cls Echo( SET keepDD=%1 SET logPath=%2 :: example C:\dir1\dir2\dir3\logs SET logFileExt=%3 SET check=0 IF [%3] EQU [] SET logFileExt=*.log & echo: file extention not specified (default set to "*.log") IF [%2] EQU [] echo: file directory no specified (a required parameter), exiting! & EXIT /B IF [%1] EQU [] echo: number of days not specified? :) echo( echo: in path [ %logPath% ] echo: finding all files like [ %logFileExt% ] echo: older than [ %keepDD% ] days echo( :: :: :: LOG echo: >> c:\trimLogFiles\logBat\log.txt echo: executed on %DATE% %TIME% >> c:\trimLogFiles\logBat\log.txt echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt echo: in path [ %logPath% ] >> c:\trimLogFiles\logBat\log.txt echo: finding all files like [ %logFileExt% ] >> c:\trimLogFiles\logBat\log.txt echo: older than [ %keepDD% ] days >> c:\trimLogFiles\logBat\log.txt echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt :: FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" >> c:\trimLogFiles\logBat\log.txt 2<&1 IF %ERRORLEVEL% EQU 0 ( FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" ) :: :: :: LOG IF %ERRORLEVEL% EQU 0 ( echo: >> c:\trimLogFiles\logBat\log.txt echo: deleting files ... >> c:\trimLogFiles\logBat\log.txt echo: >> c:\trimLogFiles\logBat\log.txt SET check=1 ) :: :: IF %check% EQU 1 ( FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c del @path" ) :: :: RETURN & LOG :: IF %ERRORLEVEL% EQU 0 echo: deletion successfull! & echo: deletion successfull! >> c:\trimLogFiles\logBat\log.txt echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt 

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

 net use Z: /delete net use Z: \\unc\path\to\my\folder forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path" 

यह सभी .gz एक्सटेंशन वाले सभी फ़ाइलों को हटा देगा जो 7 दिन से पुराने हैं। यदि आप यह सुनिश्चित करना चाहते हैं कि Z: इसे उपयोग करने से पहले किसी और चीज के साथ मैप नहीं किया गया है, तो आप कुछ आसान कर सकते हैं

 net use Z: \\unc\path\to\my\folder if %errorlevel% equ 0 ( forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path" ) else ( echo "Z: is already in use, please use another drive letter!" ) 

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

ROBOCOPY मेरे लिए महान काम करता है मूल रूप से मेरा इमान सुझाव दिया लेकिन फ़ाइलों / फ़ोल्डर्स को एक अस्थायी निर्देशिका में स्थानांतरित करने के बजाय अस्थायी फ़ोल्डर की सामग्री को हटाने के लिए, फ़ाइलों को ट्रैश में ले जाएं !!!

यह उदाहरण के लिए मेरी बैकअप बैच फ़ाइल की कुछ पंक्तियां है:

 SET FilesToClean1=C:\Users\pauls12\Temp SET FilesToClean2=C:\Users\pauls12\Desktop\1616 - Champlain\Engineering\CAD\Backups SET RecycleBin=C:\$Recycle.Bin\S-1-5-21-1480896384-1411656790-2242726676-748474 robocopy "%FilesToClean1%" "%RecycleBin%" /mov /MINLAD:15 /XA:SH /NC /NDL /NJH /NS /NP /NJS robocopy "%FilesToClean2%" "%RecycleBin%" /mov /MINLAD:30 /XA:SH /NC /NDL /NJH /NS /NP /NJS 

यह मेरे 'अस्थायी' फ़ोल्डर से 15 दिनों से अधिक पुरानी और मेरे ऑटोकैड बैकअप फ़ोल्डर में 30 दिनों के लिए कुछ भी साफ करता है। मैं चर का उपयोग करता हूं क्योंकि लाइन काफी लंबी हो सकती है और मैं उन्हें अन्य स्थानों के लिए पुन: उपयोग कर सकता हूं। आपको अपने लॉगिन से जुड़े अपने रीसायकल बिन के लिए डॉस पथ खोजने की आवश्यकता है।

This is on a work computer for me and it works. I understand that some of you may have more restrictive rights but give it a try anyway;) Search Google for explanations on the ROBOCOPY parameters.

चीयर्स!

This one did it for me. It works with a date and you can substract the wanted amount in years to go back in time:

 @echo off set m=%date:~-7,2% set /A m set dateYear=%date:~-4,4% set /A dateYear -= 2 set DATE_DIR=%date:~-10,2%.%m%.%dateYear% forfiles /p "C:\your\path\here\" /s /m *.* /d -%DATE_DIR% /c "cmd /c del @path /F" pause 

the /F in the cmd /c del @path /F forces the specific file to be deleted in some the cases the file can be read-only.

the dateYear is the year Variable and there you can change the substract to your own needs

My script to delete files older than a specific year :

 @REM _______ GENERATE A CMD TO DELETE FILES OLDER THAN A GIVEN YEAR @REM _______ (given in _olderthanyear variable) @REM _______ (you must LOCALIZE the script depending on the dir cmd console output) @REM _______ (we assume here the following line's format "11/06/2017 15:04 58 389 SpeechToText.zip") @set _targetdir=c:\temp @set _olderthanyear=2017 @set _outfile1="%temp%\deleteoldfiles.1.tmp.txt" @set _outfile2="%temp%\deleteoldfiles.2.tmp.txt" @if not exist "%_targetdir%" (call :process_error 1 DIR_NOT_FOUND "%_targetdir%") & (goto :end) :main @dir /adhs /s /b %_targetdir%\*>%_outfile1% @for /F "tokens=*" %%F in ('type %_outfile1%') do @call :process_file_path "%%F" %_outfile2% @goto :end :end @rem ___ cleanup and exit @if exist %_outfile1% del %_outfile1% @if exist %_outfile2% del %_outfile2% @goto :eof :process_file_path %1 %2 @rem ___ get date info of the %1 file path @dir %1 | find "/" | find ":" > %2 @for /F "tokens=*" %%L in ('type %2') do @call :process_line "%%L" %1 @goto :eof :process_line %1 %2 @rem ___ generate a del command for each file older than %_olderthanyear% @set _var=%1 @rem LOCALIZE HERE (char-offset,string-length) @set _fileyear=%_var:~0,4% @set _fileyear=%_var:~7,4% @set _filepath=%2 @if %_fileyear% LSS %_olderthanyear% echo @REM %_fileyear% @if %_fileyear% LSS %_olderthanyear% echo @del %_filepath% @goto :eof :process_error %1 %2 @echo RC=%1 MSG=%2 %3 @goto :eof