2012-11-13 22 views
15

क्या कोई मुझे बैच फ़ाइल बनाने में मदद कर सकता है? असल में, मेरा लक्ष्य बैच फ़ाइल बनाना है जो फ़ोल्डर में नवीनतम 7 .txt फ़ाइलों (दूसरे शब्दों में, नवीनतम) रखेगा और बाद में बाकी को हटा देगा। अगर फ़ोल्डर में 7 से अधिक फाइलें हैं।बैच फ़ाइल जो 7 नवीनतम फ़ाइलों को फ़ोल्डर में रखती है

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

@echo off 

setlocal enableextensions 

rem ******************************************************************************** 
rem ******************************* LOCAL VARIABLES ****************************** 
rem ******************************************************************************** 

SET TargetDirectory="C:\TEMP\test" 

SET No_of_fles_to_keep=7 

SET count=0 

set cnt=0 

rem ******************************************************************************** 

cd /d %TargetDirectory% 

REM timeout /T 500 

for %%x in (*) do set /a count+=1 

for %%A in (*.bat) do set /a cnt+=1 

cd /d %TargetDirectory% 

REM timeout /T 500 

IF %count% gtr %No_of_fles_to_keep% forfiles -p %TargetDirectory% -s -m "*.txt" -d -%No_of_fles_to_keep% -c "cmd /c del @path" 

echo %count% 

echo File count = %cnt% 

किसी भी मदद की सराहना की है -

तो यह है कि मैं क्या है।

उत्तर

29

आप उतरने वाले टाइमस्टैम्प ऑर्डर में टेक्स्ट फ़ाइलों को सूचीबद्ध करने के लिए /O-D के साथ डीआईआर का उपयोग कर सकते हैं। फॉर/एफ आपको प्रत्येक फाइल पर फिर से चलाने की अनुमति देता है। एसईटी/ए का उपयोग इस ट्रैक को रखने के लिए किया जाता है कि अब तक कितनी फाइलें सूचीबद्ध हैं। मुश्किल हिस्सा यहां से शुरू होता है।

कोड ब्लॉक के भीतर आपको सामान्य रूप से एक ही चर में सेट किए गए चर के मान के साथ काम करने के लिए देरी विस्तार का उपयोग करने की आवश्यकता होती है। लेकिन विस्तारित विस्तार से फोर लूप में समस्याएं पैदा हो सकती हैं यदि फॉर वेरिएबल वैल्यू में ! है, और ! फ़ाइल नामों में मान्य है। जब मैं 7 वां फ़ाइल नाम पढ़ा गया हूं तो मुझे जानबूझकर 0 से विभाजित करने के लिए एसईटी/ए का उपयोग करके समस्या का सामना करना पड़ता है। यह एक त्रुटि उत्पन्न करता है जो सशर्त कोड निष्पादित करता है जो KEEP चर को परिभाषित करता है। उस बिंदु से, सभी शेष फाइलें हटा दी गई हैं।

@echo off 
setlocal 
set /a cnt=0 
set "keep=7" 
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do (
    if defined keep (
    2>nul set /a "cnt+=1, 1/(keep-cnt)" || set "keep=" 
) else del "%%F" 
) 

अद्यतन

हे भगवान, मैं सिर्फ एहसास हुआ कि वहाँ एक तुच्छ समाधान है। पिछली संशोधित तिथि, अवरोही द्वारा क्रमबद्ध करने के बाद पहली 7 प्रविष्टियों को अनदेखा करने के लिए बस FOR/F SKIP विकल्प का उपयोग करें।

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F" 

आपको बैच फ़ाइल की भी आवश्यकता नहीं है। कमांड प्रॉम्प्ट से चलाए जाने पर बस %% से % बदलें।

+0

आप यदि आदेश की "और" भाग याद किया: ') और (डेल "%% एफ')' ... – Aacini

+0

@Aacini - तो मैंने किया था , धन्यवाद। सभी तय – dbenham

+0

आपको बहुत बहुत धन्यवाद !!मैंने अभी इसका परीक्षण किया और यह मैजिक की तरह काम किया। – Knowledge42

2

नीचे बैच फ़ाइल एक सरल दृष्टिकोण का उपयोग करती है। यह प्रत्येक फ़ाइल नंबर findstr /N "^" आदेश का उपयोग करें, तो यह सिर्फ प्रत्येक संख्या की तुलना पहले रखने के लिए सात फ़ाइलों शेष को हटाते ...

@echo off 
for /f "tokens=1* delims=:" %%a in ('dir /b /o-d *.txt ^| findstr /N "^"') do (
    if %%a gtr 7 del "%%b" 
) 

एंटोनियो

+0

+1, आपके उत्तर ने मुझे फिर से मूल्यांकन करने और महसूस करने के लिए मजबूर किया कि एक आसान समाधान भी है। फॉर/एफ स्किप विकल्प का उपयोग करें - मेरा संशोधित उत्तर देखें :-) – dbenham

0

यह 7 नवीनतम .txt फ़ाइलें रखने के लिए और सभी निकाल देंगे अन्य .txt फ़ाइलें

समान निर्देशिका जिसमें से आप फ़ाइलों

कमांड प्रॉम्प्ट पर नष्ट करना चाहते में आदेश नीचे निष्पादित

+०१२३५१६४१०६१
for /f "skip=7 eol=: delims=" %F in ('dir /b /o-d /a-d *.txt') do @del "%F" 

बैच स्क्रिप्ट के अंदर

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F" 
+0

यहां तक ​​कि [सर्वश्रेष्ठ से कॉपी करना] (https://stackoverflow.com/a/13368077/2152082) प्लेगियाटिज्म है। – Stephan