পাওয়ারশেল ব্যবহার করে 15 দিনেরও বেশি পুরানো ফাইলগুলি মুছুন


186

আমি 15 দিনেরও বেশি আগে নির্দিষ্ট ফোল্ডারে তৈরি করা ফাইলগুলি মুছতে চাই। আমি কীভাবে পাওয়ারশেল ব্যবহার করে এটি করতে পারি?


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

উত্তর:


308

প্রদত্ত উত্তরগুলি কেবল ফাইলগুলি মুছে ফেলবে (যা স্বীকার করতে হবে যে এটি এই পোস্টের শিরোনামে রয়েছে) তবে এখানে এমন কিছু কোড রয়েছে যা প্রথমে 15 দিনের চেয়ে পুরানো সমস্ত ফাইল মুছে ফেলবে এবং তারপরে রেকর্ডস করে যে কোনও খালি ডিরেক্টরি মুছে ফেলা হবে তা মুছে ফেলবে পিছনে। আমার কোড এছাড়াও -Forceলুকানো এবং কেবল পঠনযোগ্য ফাইলগুলি মুছতে অপশনটিও ব্যবহার করে । এছাড়াও, আমি alias লেখা ব্যবহার করবেন হিসেবে ওপি PowerShell কাছে নতুন মনোনীত করেছিলেন এবং বুঝতে পারে না পারে কি gci, ?, %, ইত্যাদি আছে।

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

এবং অবশ্যই যদি আপনি দেখতে চান যে ফাইল / ফোল্ডারগুলি মুছে ফেলার আগে মুছে ফেলা হবে তবে আপনি কেবল এতে -WhatIfস্যুইচটি যুক্ত করতে পারেনRemove-Item মুছার উভয় লাইনের শেষে সিমিডিলেট কলটিতে ।

এখানে প্রদর্শিত কোডটি পাওয়ারশেল v2.0 সামঞ্জস্যপূর্ণ তবে আমি এই কোডটি এবং আমার ব্লগে আরও সহজে ব্যবহারযোগ্য ফাংশন হিসাবে দ্রুত পাওয়ারশেল v3.0 কোডটি দেখাই


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

1
আমি @ মারাত্মক ডগের পরামর্শটি চেষ্টা করেছিলাম এবং যদি -15 বা -35 নির্দিষ্ট করে ফাইলে তৈরির তারিখগুলি মাসের আগে (বা সাম্প্রতিক) ফিরে যায় তবে এটি ডিরেক্টরিটির সম্পূর্ণ সামগ্রী মুছে ফেলছে।
মিশেল

6
যদি ফাইলগুলি ব্যবহার করতে পারে তবে এটি সরান আইটেম কমান্ডে "-ErrorAction SilentlyContinue" যুক্ত করাও উপযুক্ত।
কেভিন

17
ধন্যবাদ! আমি use _ পরিবর্তে Last _ লাস্ট রাইটটাইম ব্যবহার করি Cre _ ক্রিয়েশনটাইম
লরি লুবি

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

51

কেবল সহজভাবে (পাওয়ারশেল ভি 5)

Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt  (Get-Date).AddDays(-15)  | Remove-Item -Force

16

আর একটি উপায় হ'ল বর্তমান তারিখ থেকে 15 দিন বিয়োগ করা এবং CreationTimeসেই মানটির সাথে তুলনা করা :

$root  = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)

Get-ChildItem $root -Recurse | ? {
  -not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item

13

মূলত, আপনি প্রদত্ত পাথের নীচে ফাইলগুলি পুনরাবৃত্তি করে, CreationTimeবর্তমান সময় থেকে পাওয়া প্রতিটি ফাইলের বিয়োগফল এবং Daysফলাফলের সম্পত্তির সাথে তুলনা করে । -WhatIfসুইচ আসলে ফাইল মুছে ফেলার (যা ফাইল মুছে দেওয়া হবে) ছাড়া ঘটবে আপনাকে বলতে হবে, সুইচ অপসারণ আসলে ফাইল মুছে ফেলতে:

$old = 15
$now = Get-Date

Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf

8

এটা চেষ্টা কর:

dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force

আমি বিশ্বাস করি শেষটি -recurseখুব বেশি, না? দির তালিকাটি পুনরাবৃত্তভাবে হয়, আইটেমটি মুছে ফেলা বাচ্চাদের অন্তর্ভুক্ত করা উচিত নয়, তাই না?
জুস্ট

আপনি যে ডিরেক্টরিটির সাথে কাজ করছেন সেটি যদি দুটি ডিরেক্টরি গভীর হয় তবে দ্বিতীয় সেকেন্ডের দরকার হয়।
ব্রায়ান এস

5

এস্পেরেন্টো 57 এর স্ক্রিপ্ট পুরানো পাওয়ার শেলের সংস্করণগুলিতে কাজ করে না। এই উদাহরণটি করে:

Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt  (Get-Date).AddDays(-15) ) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue

1
আমি এখন ডিরেক্টরি বাদ দিতে আমার উত্তর আপডেট করেছি, ধন্যবাদ।
কেইআরআর

3

অন্য একটি বিকল্প (15. [টাইমস্প্যান] স্বয়ংক্রিয়ভাবে টাইপ হয়ে যায়):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose

1
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -Recurse

এটি পুরানো ফোল্ডারগুলি এবং এটির সামগ্রী মুছে ফেলবে।


0

যদি আপনি Windows 10 বাক্সে উপরের উদাহরণগুলোতে সঙ্গে সমস্যা হয়ে থাকে, তাহলে প্রতিস্থাপন চেষ্টা .CreationTimeসঙ্গে .LastwriteTime। এটি আমার পক্ষে কাজ করেছে।

dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force

LastwriteTimeযেমনটি হয় না CreationTime, LastwriteTimeপ্রতিবার ফাইলটি সংশোধন করা হয়।
মিস্টারস্মিথ

-1
#----- Define parameters -----#
#----- Get current date ----#
$Now = Get-Date
$Days = "15" #----- define amount of days ----#
$Targetfolder = "C:\Logs" #----- define folder where files are located ----#
$Extension = "*.log" #----- define extension ----#
$Lastwrite = $Now.AddDays(-$Days)

#----- Get files based on lastwrite filter and specified folder ---#
$Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"}

foreach ($File in $Files)
{
    if ($File -ne $Null)
    {
        write-host "Deleting File $File" backgroundcolor "DarkRed"
        Remove-item $File.Fullname | out-null
    }
    else
        write-host "No more files to delete" -forgroundcolor "Green"
    }
}

এছাড়াও, এটি অন্য বিবৃতিতে কখনই পৌঁছাতে পারে না , কারণ $Filesখালি থাকলে এটি ভবিষ্যত বিবৃতিতে প্রবেশ করবে না । আপনার যদি বিবৃতিতে ভবিষ্যদ্বাণী করা উচিত ।
ডায়েটার

@ মতি আসলে এটি অন্য বিবৃতিতে পৌঁছতে পারে। একটি ফাইল তালিকার উপর ভিত্তি করে লুপের জন্য আমাদের অনুরূপ রয়েছে এবং এটি নিয়মিতভাবে
ull

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