N দিনের চেয়ে পুরানো ফাইলগুলি মুছতে ব্যাচ ফাইল


677

আমি একটি ব্যাচের ফাইলে days দিনের চেয়ে পুরানো সমস্ত ফাইল মুছার উপায় খুঁজছি। আমি ওয়েবের চারপাশে অনুসন্ধান করেছি এবং কয়েকশ লাইন কোডের কোড সহ কয়েকটি উদাহরণ পেয়েছি এবং অন্যগুলি যাতে কাজটি সম্পাদনের জন্য অতিরিক্ত কমান্ড লাইন ইউটিলিটিগুলি ইনস্টল করা প্রয়োজন।

কোডের কয়েকটি দফায় একই জাতীয় কাজগুলি বাসে করা যেতে পারে । দেখে মনে হচ্ছে উইন্ডোজের ব্যাচ ফাইলগুলির জন্য কমপক্ষে দূরবর্তী অবস্থান থেকে সহজ কিছু করা যেতে পারে। আমি এমন কোনও সমাধান খুঁজছি যা কোনও অতিরিক্ত ইউটিলিটি ছাড়াই একটি স্ট্যান্ডার্ড উইন্ডোজ কমান্ড প্রম্পটে কাজ করে। দয়া করে কোনও পাওয়ারশেল বা সাইগউইন নেই।


8
জেফ অ্যাটউড এটি সার্ভারফল্টে উত্তর দিয়েছিল যা আমি মনে করি এখানে নথিভুক্ত করা উচিত। serverfault.com/questions/49614/delete-files-older-than-x-days
ডাস্টি

: একটি .bat ফাইল যে অভ্যন্তরীণ cmd.exe কমান্ডগুলি ব্যবহার ভিত্তিক একটি নতুন পদ্ধতি শুধু এখানেই পোস্ট করা হয়েছে stackoverflow.com/questions/9746778/...
Aacini

1
gehrcke.de/Timegaps এই উদ্দেশ্যে ডিজাইন করা হয়েছে। এমনকি এটি আরও পরিশীলিত মুছে ফেলার স্কিমের অনুমতি দেয়: সর্বশেষ 7 দিনের ফাইল রাখার পাশাপাশি এটি উদাহরণস্বরূপ সর্বশেষ 8 সপ্তাহ, 12, মাস, 2 বছরের প্রতিটি জন্য একটি ফাইল রাখার অনুমতি দেয়।
ডাঃ জানু-ফিলিপ গেহর্ক্ক

উত্তর:


1071

উপভোগ করুন:

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

আরও বিশদ জন্য forfilesডকুমেন্টেশন দেখুন ।

আরও গুডির জন্য, উইন্ডোজ এক্সপি কমান্ড লাইনের একটি এজেড সূচক দেখুন

আপনি যদি forfilesনিজের মেশিনে ইনস্টল না করে থাকেন তবে এটি কোনও উইন্ডোজ সার্ভার 2003 থেকে আপনার উইন্ডোজ এক্সপি মেশিনে অনুলিপি করুন %WinDir%\system32\। এটি এক্সসিটি উইন্ডোজ সার্ভার 2003 এবং উইন্ডোজ এক্সপির মধ্যে পুরোপুরি সামঞ্জস্যপূর্ণ হওয়ার কারণে এটি সম্ভব।

উইন্ডোজ এবং উইন্ডোজ সার্ভারের পরবর্তী সংস্করণগুলিতে এটি ডিফল্টরূপে ইনস্টল করা আছে।

উইন্ডোজ 7 এবং আরও নতুন (উইন্ডোজ 10 সহ) এর জন্য:

সিনট্যাক্সটি কিছুটা বদলে গেছে। অতএব আপডেট করা কমান্ডটি হ'ল:

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

12
ডেল @ ফাইলে হওয়া উচিত, মামলার বিষয়গুলি এছাড়াও আমি পরীক্ষার জন্য / সি ইকো @ ফাইলে ব্যবহার করার পরামর্শ দিই
রাসেল স্টেইন

40
@ রাসেল: @ প্যাট হ'ল নাম সহ পুরো পথ। @ ফাইল কেবল নাম, তাই আপনি যদি সাবফোল্ডারগুলি নিয়ে কাজ করছেন তবে এটি কার্যকর হবে না।
গ্রেগম্যাক

86
মনে রাখবেন যে আপনি যদি 10 দিনেরও বেশি বয়সী ফাইলগুলি চান তবে আপনাকে -d "-10" নির্দিষ্ট করতে হবে। -আর অর্থ "এর চেয়ে বড়", + Ve এর অর্থ "এর চেয়ে বড়"। আপনি DDMMYY বা -DDMMYY ফর্ম্যাটটি -d তে প্যারামিটার হিসাবে নির্দিষ্ট করতে পারেন।
গ্রেগম্যাক

42
আমি উইন সার্ভার ২০০৮ এ এই বাক্য গঠনটি ব্যবহার করেছি: ফরফিলস / পি "সি: ys মাইএসকিএল_ব্যাকআপ" / এস / এম * .এসকিএল / ডি -30 / সি "সেমিডি / সি ডেল @PATH"
জ্যামন

9
এই উত্তরটি যখন "older দিনের বেশি বয়সী" হিসাবে সংজ্ঞায়িত করা হয় "7 দিনের বেশি আগে" পরিবর্তিত হয়েছে "পরিবর্তে" 7 দিনেরও বেশি সময় আগে তৈরি করা হয়েছে "হিসাবে সংজ্ঞায়িত হয়। পরেরটি কীভাবে অর্জন করা যায়?
টিমস

76

নিম্নলিখিত আদেশগুলি চালান :

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

সমস্ত ফাইল (/ মুভ ব্যবহার করে, যা ফাইলগুলিকে সরিয়ে দেয় এবং তারপরে সেগুলি মুছে ফেলার বিপরীতে মুছে ফেলা হয় - যা পুরো ফাইলটিগুলি মুছে ফেলা হয় তারপরে মুছে ফেলা হয়) রোবকপির মাধ্যমে অন্য কোনও স্থানে নিয়ে যান এবং তারপরে সেই পথে একটি মুছুন আদেশটি কার্যকর করুন এবং আপনি সবাই ভাল.

এছাড়াও এতে যদি প্রচুর ডেটা সহ আপনার কোনও ডিরেক্টরি থাকে তবে আপনি /mirস্যুইচ ব্যবহার করতে পারেন


5
বেশিরভাগ অংশের জন্য, এটি মোটামুটি অবৈধ উত্তর। আমার যদি এটিতে প্রচুর ডেটা সহ একটি ডিরেক্টরি থাকে তবে সেখানে ভাল কাজ হবে না। আমি একটি উত্তর দিয়ে যাব যা এটি "স্থানে"
adamb0mb

5
@ অ্যাডামব এমএমবি এটি কোনওভাবেই অযৌক্তিক নয় - যদি "গন্তব্য" "উত্স" এর মতো একই ফাইল সিস্টেমে থাকে তবে সরানো অপারেশনটি বেশ হালকা ওজনের। যেহেতু রোবোকপিটি সত্যই মজবুত, এটি প্রকৃতপক্ষে কোনও ডিরেক্টরি আকার, অস্পষ্ট ফাইলের নাম, মূলত স্বেচ্ছাচারী পাথ দৈর্ঘ্যের জন্য কাজ করে এবং আপনার যদি এটির প্রয়োজন হয় তবে ডিরেক্টরিগুলি অন্তর্ভুক্ত করে - এমন কিছু যা অবশ্যই অন্যান্য অনেক উইন্ডোজ ইউটিলিটি সম্পর্কে বলা যায় না। কমান্ডের rd /s /q c:\destinationপরিবর্তে আমি ব্যবহার করব delযদিও robocopy /mir c:\emptydir c:\destinationআপনি ফাইলের নাম নিয়ে সমস্যা আশা করেন তবে ডিরেক্টরিটি খালি করতে অন্য রান ব্যবহার করুন।
syneticon-dj

12
এছাড়াও, রোবোকপি ইউএনসি পাথগুলিকে সমর্থন করে - যা forfilesগৃহীত উত্তর থেকে করা যাবে না।
syneticon-dj

3
আমার চিন্তাভাবনাগুলি এই লাইনের সাথে আরও ছিল: "আমার ফাইলগুলি যেখানেই আমি চাই সেখানে ইতিমধ্যে রয়েছে I আমি সেগুলি সরাতে চাই না।" "ফাইলগুলি মুছে ফেলা যৌক্তিকভাবে আপনি যা করছেন তা তাই করুন। এটি করার জন্য
রোবকপি

3
C:\test7 দিনেরও বেশি পুরানো সমস্ত ফাইল দেখার জন্য আমি এই ওয়ান-লাইনারের পরামর্শ দিচ্ছি । ফাইল মুছে ফেলার জন্য, পরিবর্তন echoকরার জন্য del:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
PowerUser

25

ঠিক আছে কিছুটা বিরক্ত হয়ে এবং এটি নিয়ে এসেছিল, এতে আমার দরিদ্র লোকের লিনাক্স যুগের প্রতিস্থাপনের প্রতিদিনের ব্যবহারের জন্য সীমিত প্রতিস্থাপনের সংস্করণ রয়েছে (কোনও সময় ধরে রাখার দরকার নেই):

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 /a-d-h-s /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

, USAGE

set /a strip=day*7: দিন রাখার জন্য 7 পরিবর্তন করুন ।

set dSource=C:\temp : এটি ফাইলগুলির জন্য পরীক্ষা করার জন্য সূচনা ডিরেক্টরি directory

মন্তব্য

এটি অ-ধ্বংসাত্মক কোড, এটি কী ঘটবে তা প্রদর্শন করবে।

পরিবর্তন :

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 মঞ্জুর করে। এটি অন্যান্য সেটিংসে বা রান-টাইম মূল্যায়নের জন্য অভিযোজিত হওয়া দরকার (sShortTime, ব্যবহারকারী-ভিত্তিক কনফিগারেশন পড়ুন, একটি ফিল্টারে যথাযথ ফিল্ড অর্ডার কনফিগার করুন এবং যুক্তি থেকে সঠিক ডেটা বের করতে ফিল্টারটি ব্যবহার করুন)।

আমি কি উল্লেখ করেছি যে আমি এই সম্পাদকটির স্বতঃ-গঠনকে ঘৃণা করি? এটি ফাঁকা রেখাগুলি সরিয়ে দেয় এবং অনুলিপিটি অনুলিপি করে।

আশা করি এটা কাজে লাগবে.


4
অ-ধ্বংসাত্মক কোডের জন্য +1, আমি চেষ্টা করব এবং কোড কোডের উদাহরণ নিজে দিলে তা মনে রাখব।
হিওল্ট

5
দেরিতে এবং পুরোপুরি সম্পর্কিত নয়, তবে 7daysclean.cmdসিন্থ-পাঙ্ক ব্যান্ডের দুর্দান্ত নাম মনে হচ্ছে।
ফ্লোনক

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

আপনার করা উচিত /d -3(3 দিন আগে) এটি আমার পক্ষে ভাল কাজ করে। সুতরাং সমস্ত জটিল ব্যাচগুলি ট্র্যাশ বিনে থাকতে পারে। এছাড়াও forfilesইউএনসি পাথ সমর্থন করি না, তাই একটি নির্দিষ্ট ড্রাইভে একটি নেটওয়ার্ক সংযোগ আছে।


3
অন্যান্য উত্তরের মতো একই ত্রুটি (স্বীকৃত উত্তর সহ)। নির্দিষ্ট করার এই আজব অভ্যাসটি *.*কোথা থেকে এল ? ওয়াইল্ডকার্ড *.*উইন্ডোজের সমস্ত ফাইলের সাথে মেলে না। এটি কেবল .তাদের নামের সাথে ফাইলগুলির সাথে মেলে । ওপি .ফাইলের নামের প্রয়োজনের বিষয়ে কখনও কিছু বলেনি । সঠিক প্যারামিটারটি /M *তবে এটি যাইহোক ডিফল্ট। একেবারেই দরকার নেই /M
এএনটি

@ অ্যান্ট: আপনি কি নিশ্চিত? আমি মনে করি উইন্ডোজে *.*ঠিক তেমন আচরণ করে *। আসলে, আমি এটি কেবলমাত্র আমার কম্পিউটারে চেষ্টা করেছি এবং dir *.*প্রকৃতপক্ষে তালিকাভুক্ত করেছি test file, কোনও ফাইল ছাড়াই।
আন্দ্রেয়াস রেজব্র্যান্ড

1
@ আন্ড্রেয়াস রেজব্র্যান্ড: আমি এটি আশ্চর্যরকমও বোধ করি তবে এর চিকিত্সা *.*, বলার dirএবং -mবিকল্পের মধ্যে অসামঞ্জস্যপূর্ণ forfiles-m *.*মাস্ক প্রকৃতপক্ষে, extensionless ফাইলের নাম লাফালাফি হিসাবে আমি উপরে আমার মন্তব্য (এটি নিজে চেষ্টা) বিবৃত হবে। মজার অংশটি হ'ল এমএস ডকুমেন্টেশনগুলি স্পষ্টভাবে বলে দেয় যে -m *.*এটি ডিফল্ট। তবে, আপনি যদি বাস্তবে এটি চেষ্টা করেন, আপনি দেখতে পাবেন যে ডিফল্টটি আসলে -m *- সমস্ত ফাইল পুনরাবৃত্তি হয়।
এএনটি

1
এই এমএস ডকুমেন্টেশন পৃষ্ঠা - টেকনিকট.মাইক্রোসফট. /en-us/library/cc753551(v=ws.11).aspx - এ বিপুল সংখ্যক ত্রুটি রয়েছে (উদাহরণস্বরূপ) কারণ ডকটির লেখক ভুলভাবে বিশ্বাস করেছেন যে *.*মাস্ক প্রয়োগ হয়েছে সমস্ত ফাইল। "এই অদ্ভুত অভ্যাস" সম্পর্কে আমার পুনর্গঠিত প্রশ্নটি প্রকৃতপক্ষে বাতিল করা হয়েছিল, কারণ চিকিত্সা করা *.*এবং *সমতুল্য হিসাবে এটি দীর্ঘস্থায়ী উইন্ডোজ কনভেনশন। যাইহোক, /mবিকল্প forfilesকোনও কারণে সেই কনভেনশন লঙ্ঘন করে।
এএনটি

1
উইন্ডোজের 5 টি ওয়াইল্ডকার্ডের পটভূমি : ব্লগস.এমএসএন.এম.সাইক্রোসফটস
জেরেমাইকোহনে

18

আমার কটাক্ষপাত আছে উত্তর একটি থেকে অনুরূপ প্রশ্ন :

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"

এটি একটি নির্দিষ্ট তারিখের চেয়ে পুরানো ফাইলগুলি মুছবে। আমি নিশ্চিত যে বর্তমান তারিখ থেকে সাত দিন পিছনে ফিরে এটি পরিবর্তন করা যেতে পারে।

আপডেট: আমি লক্ষ্য করেছি যে উপরের স্ক্রিপ্টে হার্বসিএসওর উন্নতি হয়েছে। আমি পরিবর্তে তার সংস্করণ ব্যবহার করার পরামর্শ দিচ্ছি ।


12

আমার আদেশ

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

@PATH - এটি আমার ক্ষেত্রে কেবল পথ, তাই আমাকে ব্যবহার করতে হয়েছিল @PATH\@FILE

এছাড়াও forfiles /?আমার পক্ষেও কাজ করছে না, তবে forfiles("?" ছাড়াই) ভাল কাজ করেছে।

এবং আমার একমাত্র প্রশ্ন: কীভাবে একাধিক মাস্ক যুক্ত করবেন (উদাহরণস্বরূপ " .log | .বাক ")?

Forfiles.exe সম্পর্কিত এই সমস্ত যা আমি এখানে ডাউনলোড করেছি (জিতে এক্সপি তে)

তবে আপনি যদি উইন্ডোজ সার্ভারটি forfiles.exe ব্যবহার করছেন তবে ইতিমধ্যে এটি থাকা উচিত এবং এটি এফটিপি সংস্করণ থেকে পৃথক। এজন্য আমার কমান্ডটি পরিবর্তন করা উচিত।

উইন্ডোজ সার্ভার 2003-এর জন্য আমি এই কমান্ডটি ব্যবহার করছি:

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

9

ব্যাচ ফাইলের সাথে সমাধান করার জন্য প্রায়শই আপেক্ষিক তারিখ / সময় সম্পর্কিত প্রশ্ন থাকে। কিন্তু কমান্ড লাইন ইন্টারপ্রেটার cmd.exe তারিখ / সময় গণনার জন্য কোনও কার্যকারিতা নেই। স্ট্যাক ওভারফ্লো এর অন্যান্য পৃষ্ঠাগুলিতে এবং অন্যান্য ওয়েবসাইটগুলিতে অতিরিক্ত কনসোল অ্যাপ্লিকেশন বা স্ক্রিপ্টগুলি ব্যবহার করে প্রচুর ভাল কাজের সমাধান ইতিমধ্যে এখানে পোস্ট করা হয়েছে।

তারিখ / সময় ভিত্তিক ক্রিয়াকলাপগুলির জন্য সাধারণ একটি নির্ধারিত দিন থেকে তারিখ / সময় স্ট্রিংটিকে সেকেন্ডে রূপান্তর করা প্রয়োজন। খুব সাধারণ 1970-01-01 00:00:00 ইউটিসি। তবে পরবর্তী কোনও দিন কোনও নির্দিষ্ট কাজের জন্য সমর্থন করার জন্য প্রয়োজনীয় তারিখের সীমার উপর নির্ভর করেও ব্যবহৃত হতে পারে।

জে কমান্ড লাইন ইন্টারপ্রেটার cmd.exe এর জন্য একটি দ্রুত "ডেট টু সেকেন্ড" সমাধানযুক্ত 7daysclean.cmd পোস্ট করেছেন । তবে এটি লিপ বছর সঠিকভাবে বিবেচনা করে না। জেআর চলতি বছরে লিপ দিবসকে বিবেচনায় নেওয়ার জন্য একটি অ্যাড-অন পোস্ট করেছে , তবে বেস বছর থেকে অর্থাত্ ১৯ 1970০ সাল থেকে অন্যান্য লিপ বছরকে উপেক্ষা করে।

আমি সি / সি ++ তে লিখিত আমার অ্যাপ্লিকেশনগুলিতে তারিখ / সময় রূপান্তর ফাংশনগুলিতে 1970-01-01 থেকে লিপ দিবস সহ দিনগুলির সংখ্যা দ্রুত পেতে একটি ছোট সি ফাংশন দিয়ে একবার তৈরি 20 বছরের স্ট্যাটিক টেবিলগুলি (অ্যারেগুলি) ব্যবহার করি।

এই খুব দ্রুত টেবিল পদ্ধতিটি ফর কমান্ড ব্যবহার করে ব্যাচ কোডেও ব্যবহার করা যেতে পারে । সুতরাং আমি ব্যাচ সাবরুটিন কোড করার সিদ্ধান্ত নিয়েছি GetSecondsযা 1970-01-01 00:00:00 ইউটিসি থেকে এই তারিখের / সময় স্ট্রিংয়ের জন্য এই রুটিনে পাসের জন্য সেকেন্ডের সংখ্যা গণনা করে।

দ্রষ্টব্য: উইন্ডোজ ফাইল সিস্টেমগুলিও লিপ সেকেন্ডকে সমর্থন করে না বলে লিপ সেকেন্ডগুলিকে বিবেচনায় নেওয়া হয় না।

প্রথমত, টেবিলগুলি:

  1. 1970-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
    

    ১৯৯০-০১-০১-এর শুরুতে ২০৩৯ থেকে ২১০6 সাল পর্যন্ত সেকেন্ড গণনা করা কেবল সি / সি ++ এ স্বাক্ষরবিহীন ৩২-বিট ভেরিয়েবল, অর্থাৎ স্বাক্ষরযুক্ত দীর্ঘ (বা স্বাক্ষরবিহীন কোনও) ব্যবহার করেই সম্ভব।

    তবে গাণিতিক প্রকাশের জন্য cmd.exe ব্যবহার একটি স্বাক্ষরিত 32-বিট ভেরিয়েবল। সুতরাং সর্বাধিক মান 2147483647 (0x7FFFFFFF) যা 2038-01-19 03:14:07।

  2. ১৯ 1970০ থেকে 2106 বছরের জন্য লিপ ইয়ারের তথ্য (না / হ্যাঁ)।

    1970 - 1989: N N Y N N N Y N N N Y N N N Y N N N Y N
    1990 - 2009: N N Y N N N Y N N N Y N N N Y N N N Y N
    2010 - 2029: N N Y N N N Y N N N Y N N N Y N N N Y N
    2030 - 2049: N N Y N N N Y N N N Y N N N Y N N N Y N
    2050 - 2069: N N Y N N N Y N N N Y N N N Y N N N Y N
    2070 - 2089: N N Y N N N Y N N N Y N N N Y N N N Y N
    2090 - 2106: N N Y N N N Y N N N N N N N Y N N
                                     ^ 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
    

1970-01-01 সাল থেকে একটি তারিখকে সেকেন্ডের সংখ্যায় রূপান্তর করা সেই টেবিলগুলি ব্যবহার করা বেশ সহজ।

দৃষ্টি আকর্ষন করা!

তারিখ এবং সময়ের স্ট্রিংগুলির ফর্ম্যাটটি উইন্ডোজ অঞ্চল এবং ভাষা সেটিংসের উপর নির্ভর করে। বিভেদক ও বিভিন্ন পরিবেশের নির্ধারিত টোকেন ক্রম Day, Monthএবং Yearপ্রথম জন্য লুপ GetSecondsপ্রয়োজনে স্থানীয় তারিখ / সময় ফর্ম্যাট অভিযোজিত করা আবশ্যক।

এটা তোলে পরিবেশ ভেরিয়েবলের তারিখের স্ট্রিংকে মানিয়ে যদি এনভায়রনমেন্ট ভেরিয়েবল মধ্যে তারিখ বিন্যাস প্রয়োজনীয় 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এবং সেইজন্য এটা না ব্যাপার পরিবেশ ভেরিয়েবলের তারিখের স্ট্রিংকে করলে DATE তারিখে সহ বা কাজের দিন ছাড়া হয় দীর্ঘ দিন এবং মাস হিসেবে প্রত্যাশিত অনুক্রমে 2 সংখ্যা, অর্থাত বিন্যাসে সাথে সবসময় হিসাবে 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 /A-D-H-S /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 ("Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N") 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 ("N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N") 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

অনুকূল পারফরম্যান্সের জন্য সমস্ত মন্তব্য মুছে ফেলা ভাল, অর্থাত্ ০-৪ নেতৃস্থানীয় স্পেসের পরে রিম দিয়ে শুরু হওয়া সমস্ত লাইন ।

এবং অ্যারেগুলি আরও ছোট করা যেতে পারে, যেমন 1980-01-01 00:00:00 থেকে 2038-01-19 03:14:07 হিসাবে বর্তমানে ব্যাচ কোড দ্বারা সমর্থিত উদাহরণস্বরূপ 2015-01 নীচের কোড হিসাবে -01 থেকে 2019-12-31 ব্যবহার করে যা C:\Tempফোল্ডার ট্রিতে 7 দিনের বেশি পুরানো ফাইলগুলি মুছে দেয় ।

আরও নীচে ব্যাচ কোড 24 ঘন্টা সময় বিন্যাস জন্য অনুকূলিত করা হয়।

@echo off
setlocal EnableDelayedExpansion
call :GetSeconds "%DATE:~-10% %TIME%"
set /A "LastWeek=Seconds-7*86400"

for /F "delims=" %%F in ('dir /A-D-H-S /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 ("N Y N N N") 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 ঘন্টা এর চেয়ে বেশি বয়সী কিনা তা সন্ধান করুন আমার উত্তরটি দেখুন ।


9

এই কোড কপি করুন এবং হিসাবে এটি সংরক্ষণ DelOldFiles.vbs

সিএমডিতে ব্যবহার: cscript //nologo 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

8

উইন্ডোজ সার্ভার 2008 আর 2 এর জন্য:

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

এটি 90 দিনের চেয়ে পুরানো সমস্ত .sql ফাইল মুছে ফেলবে ।


7

ফোরফাইল ব্যবহার করুন।

বিভিন্ন সংস্করণ আছে। প্রারম্ভিকগুলি ইউনিক্স শৈলীর পরামিতি ব্যবহার করে।

আমার সংস্করণ (2000 সার্ভারের জন্য - স্যুইচগুলির পরে কোনও স্থান নোট করুন) -

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

এক্সপিতে ফোরফাইলগুলি যুক্ত করতে, ftp://ftp.microsoft.com/ResKit/y2kfix/x86/ থেকে এক্সেস পান

এবং এটি সি: I উইন্ডোজ \ system32 এ যুক্ত করুন


11
@ কিব্বি এটির একই উত্তর নয় সিনট্যাক্সটি আলাদা। এটি সাহায্যের প্রতিভা ছিল attempt উইন্ডোজ কমান্ড লাইনটির খুব অল্প পরিচিত, আমি এটি কাজ করতে গিয়ে হতাশার কয়েক ঘন্টা ব্যয় করেছি। আমার জন্য তথ্যের মূল বিটগুলি হ'ল এই ছিল যে বিভিন্ন সংস্করণ রয়েছে (বিভিন্ন বাক্য গঠন সহ), এবং আমার স্পেসগুলি সরিয়ে ফেলতে হবে। এগুলির কোনও কিছুইই মূল উত্তরের অন্তর্ভুক্ত ছিল না। (আমি উত্তরটি সম্পর্কে মন্তব্য করব তবে আমার কোনও বিশেষাধিকার নেই
আইডন ইওয়েন

অন্যান্য উত্তরের মতো একই ত্রুটি (স্বীকৃত উত্তর সহ)। ওয়াইল্ডকার্ড *.*মধ্যে forfilesমিলছে না সব ফাইল। এটি কেবলমাত্র .তাদের নামের সাথে ফাইলগুলি (যেমন এক্সটেনশন সহ ফাইলগুলি) সাথে মেলে । ওপি .ফাইলের নামের প্রয়োজনের বিষয়ে কখনও কিছু বলেনি । সঠিক প্যারামিটারটি /M *তবে এটি যাইহোক ডিফল্ট। একেবারেই দরকার নেই /M
এএনটি

7

উইন্ডোজ 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"

উইন্ডোজ সার্ভার 2008 সালে এবং উপরোক্ত এবং Windows 7. এমনকি কাজ
kwrl

6

আইএমও, জাভাস্ক্রিপ্ট ধীরে ধীরে সর্বজনীন স্ক্রিপ্টিং স্ট্যান্ডার্ডে পরিণত হচ্ছে: এটি সম্ভবত অন্য কোনও স্ক্রিপ্টিং ভাষার চেয়ে বেশি পণ্যগুলিতে উপলব্ধ (উইন্ডোজে এটি উইন্ডোজ স্ক্রিপ্টিং হোস্ট ব্যবহার করে উপলব্ধ)। আমাকে প্রচুর ফোল্ডারে পুরানো ফাইলগুলি পরিষ্কার করতে হবে, তাই এটি করার জন্য এখানে একটি জাভাস্ক্রিপ্ট ফাংশন রয়েছে:

// 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);
    }
}

প্রতিটি ফোল্ডার সাফ করার জন্য ক্লিয়ারফোল্ডার () ফাংশনে অন্য কল যুক্ত করুন। এই নির্দিষ্ট কোডটি উদাহরণ এবং dll ফাইলগুলি সংরক্ষণ করে এবং সাবফোল্ডারগুলিও পরিষ্কার করে।


6

অ্যাকাউন্টে এক লিপ বছর নিতে 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

5

ইতিমধ্যে এই মূল্যবান থ্রেডটিতে আমি একটি নম্র অবদান যুক্ত করতে পারি। আমি খুঁজে পেয়েছি যে অন্যান্য সমাধানগুলি প্রকৃত ত্রুটির পাঠ্য থেকে মুক্তি পেতে পারে তবে% 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 শূন্যের দিকে রাখতে একটি অনেলাইনার ব্যবহার করে (ভার্চুয়াল> নুল এআরআরএলভিএলটিকে পুনরায় সেট করে):

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

একটি এসকিউএল সার্ভার এজেন্ট সিএমডিএক্সেক কাজের পদক্ষেপের জন্য আমি নীচে নেমেছি। এটি কোনও ত্রুটিযুক্ত কিনা তা আমি জানি না, তবে পদক্ষেপের মধ্যে থাকা সিএমডিএক্সেক কোডের প্রথম লাইনটিকেই স্বীকৃতি দেয়:

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%

5

গোশ, ইতিমধ্যে প্রচুর উত্তর। একটি সহজ এবং সুবিধাজনক রুট আমি খুঁজে পেয়েছি হ'ল & প্যারামিটার ব্যবহার করে একক উইন্ডোজ কমান্ড লাইন নির্দেশ থেকে ক্রম ক্রমে দুটি বার ROBOCOPY.EXE চালানো ।

ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 & ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 /PURGE

এই উদাহরণে এটি 30 দিনের পুরানো সমস্ত ফাইল ( ) বাছাই করে এবং লক্ষ্য ফোল্ডারে নিয়ে যাওয়ার মাধ্যমে কাজ করে। দ্বিতীয় কমান্ডটি পূর্জি কমান্ডটি যুক্ত করে আবার একই কাজ করে যার অর্থ উত্স ফোল্ডারে উপস্থিত নেই এমন টার্গেট ফোল্ডারে থাকা ফাইলগুলি সরান। সুতরাং অপরিহার্যভাবে, প্রথম কমান্ড ফাইলগুলি সরায় এবং দ্বিতীয়টি মুছে ফেলে কারণ দ্বিতীয় কমান্ডটি আহ্বান করার পরে সেগুলি আর সোর্স ফোল্ডারে উপস্থিত থাকে না।

ROBOCOPY এর ডকুমেন্টেশনগুলির সাথে পরামর্শ করুন এবং পরীক্ষার সময় / L সুইচ ব্যবহার করুন।


4

আপনার কাছে যদি এক্সপি রিসোর্স কিট থাকে তবে আপনি পুরানো ডিরেক্টরিগুলি একক ডিরেক্টরিতে স্থানান্তর করতে রোবোকপি ব্যবহার করতে পারেন, তবে কেবল এটি মুছতে rmdir ব্যবহার করুন:

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

4

আমি মনে করি ই- জেমসের উত্তরটি ভাল কারণ এটি উইন্ডোজ 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)

দ্রষ্টব্য: উপরের কোডটি লিপ বছরগুলি পাশাপাশি অ্যাকাউন্টে প্রতিটি মাসে গ্রহণ করে in একমাত্র সর্বাধিক হ'ল 0/0/0 সাল থেকে মোট দিনগুলি হয়েছে (তার পরে এটি নেতিবাচক বছরগুলি ফিরে আসে)।

দ্রষ্টব্য: গণিতটি কেবল এক পথে যায়; এটি সঠিকভাবে নেতিবাচক ইনপুট থেকে ভবিষ্যতের তারিখগুলি পেতে পারে না (এটি চেষ্টা করবে, তবে সম্ভবত মাসের শেষ দিনটি পেরিয়ে যাবে)।


3

আপনি এটিকে টানতে সক্ষম হতে পারেন। একটি সহজ উদাহরণের জন্য আপনি এই প্রশ্নটি একবার দেখে নিতে পারেন । জটিলতাগুলি আসে, যখন আপনি তারিখগুলি তুলনা শুরু করেন। তারিখটি বেশি কিনা তা বলা সহজ হতে পারে তবে আপনাকে দুটি তারিখের মধ্যে পার্থক্যটি পাওয়া দরকার কিনা তা বিবেচনা করার জন্য অনেকগুলি পরিস্থিতি বিবেচনা করা উচিত।

অন্য কথায় - আপনি সত্যই তৃতীয় পক্ষের সরঞ্জামগুলি ব্যবহার করতে না পারলে এটি আবিষ্কার করার চেষ্টা করবেন না।


3

এটি আশ্চর্যজনক কিছু নয় তবে আমার আজকের মতো কিছু করা এবং এটি নির্ধারিত টাস্ক হিসাবে চালানো দরকার needed

নমুনা এক্সিকিউটিভ ডাব্লু / প্যারাম সহ নীচে ডেলিফিলস ওল্ডার থ্যান্সডে.বাট ব্যাচ ফাইল:

DelFilesOlderThanNDays.bat 7 C: \ dir1 \ dir2 ir dir3 \ লগগুলি * .লগ

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

3

আকুর উত্তরটি প্রসারিত করতে দেখলাম অনেক লোক ইউএনসি পথ সম্পর্কে জিজ্ঞাসা করছে। কেবল ড্রাইভ লেটারে আনথ পাথ ম্যাপিং করা ফোরফাইলদের খুশি করবে। ড্রাইভের ম্যাপিং এবং আনম্যাপিং কোনও ব্যাচ ফাইলে প্রোগ্রামগতভাবে করা যায়।

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"

এটি g দিনের চেয়ে পুরানো একটি .gz এক্সটেনশানযুক্ত সমস্ত ফাইল মুছবে। আপনি যদি নিশ্চিত করতে চান যে জেড: এটি ব্যবহার করার আগে অন্য কোনও কিছুতে ম্যাপ করা হয়নি তবে আপনি সাধারণ কিছু করতে পারেন

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!"
)

3

রোবকপি আমার জন্য দুর্দান্ত কাজ করে। মূলত আমার ইমানকে পরামর্শ দিয়েছে। তবে ফাইলগুলি / ফোল্ডারগুলিকে অস্থায়ী ডিরেক্টরিতে সরানোর পরিবর্তে অস্থায়ী ফোল্ডারের সামগ্রীগুলি মুছে ফেলার পরিবর্তে ফাইলগুলি ট্র্যাশে স্থানান্তরিত করুন !!!

এটি আমার ব্যাকআপ ব্যাচের ফাইলের কয়েকটি লাইন উদাহরণস্বরূপ:

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 দিনের বেশি পুরানো জিনিস পরিষ্কার করে। আমি ভেরিয়েবলগুলি ব্যবহার করি কারণ লাইনটি বেশ দীর্ঘ পেতে পারে এবং আমি তাদের অন্যান্য অবস্থানের জন্য পুনরায় ব্যবহার করতে পারি। আপনার লগইনের সাথে যুক্ত আপনার পুনর্ব্যবহারযোগ্য বিনের জন্য আপনাকে কেবল ডসের পথটি খুঁজে পেতে হবে।

এটি আমার জন্য একটি ওয়ার্ক কম্পিউটারে এবং এটি কাজ করে। আমি বুঝতে পারি যে আপনার কারও কারও কাছে আরও নিয়ন্ত্রিত অধিকার থাকতে পারে তবে যাইহোক এটি ব্যবহার করে দেখুন;) রোবকোপি প্যারামিটারে ব্যাখ্যার জন্য গুগল অনুসন্ধান করুন।

চিয়ার্স!


1
বিদ্যমান দ্বিতীয় সর্বাধিক উত্সাহিত উত্তরটি রোবকপিটিকে সমর্থন করে। মঞ্জুর, আপনি কিছু আলাদা বিকল্প ব্যবহার করেন তবে এটি বিদ্যমান উত্তরের নিকটে।
জোনাথন লেফলার

2
এটিতে পোস্টটিতে একটি নতুন সামগ্রী রয়েছে - ফাইলগুলি রিসাইকেল বিনটিতে সরানো। এটি রবোকপির সাথে এখনও প্রস্তাব করা হয়নি এবং এটি বিল্ট-ইন সিঙ্গল-লাইন কমান্ড ব্যবহার করে মূল পোস্টটির পুরো উত্তর দেয়। 'ডেল' এবং 'আরএমডিআইআর' কমান্ডগুলির সংমিশ্রণের চেয়ে আরও ভাল কাজ করে কারণ ফাইলগুলি পুনর্ব্যবহারযোগ্য বিন থেকে পুনরুদ্ধার করা যায়। আরে আমি এখানে এখনও নতুন - আমাকে একটি বিরতি দিন;)
শন পলিসিন ২

2

একটি নির্দিষ্ট বছরের চেয়ে পুরানো ফাইলগুলি মুছতে আমার স্ক্রিপ্ট:

@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 /a-d-h-s /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

1

এই এক এটা আমার জন্য। এটি একটি তারিখ নিয়ে কাজ করে এবং আপনি সময় মতো ফিরে যেতে বছরের পর বছরগুলিতে প্রয়োজনীয় পরিমাণটি বিয়োগ করতে পারেন:

@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

/Fমধ্যে cmd /c del @path /Fবাহিনীর নির্দিষ্ট ফাইল কিছু কিছু ক্ষেত্রে ফাইল কেবল-পড়া যায় মধ্যে মুছে ফেলা হবে।

dateYearবছর পরিবর্তনশীল এবং সেখানে আপনি আপনার নিজের চাহিদা substract পরিবর্তন করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.