PowerShell का उपयोग करके 15 दिनों से अधिक पुरानी फ़ाइलों को हटाएं


186

मैं केवल उन फ़ाइलों को हटाना चाहता हूं जो किसी विशेष फ़ोल्डर में 15 दिन पहले बनाई गई थीं। मैं PowerShell का उपयोग करके यह कैसे कर सकता हूं?


5
अधिकांश उत्तर क्रिएशनटाइम का उपयोग करते हैं लेकिन यह तब रीसेट हो जाता है जब किसी फ़ाइल की प्रतिलिपि बनाई जाती है ताकि आपको आपके इच्छित परिणाम न मिलें। LastWriteTime वह है जो विंडोज एक्सप्लोरर में "तिथि संशोधित" से मेल खाती है।
बजे रोलैंड शेहर

जवाबों:


308

दिए गए उत्तर केवल फाइलों को हटा देंगे (जो कि माना जाता है कि इस पोस्ट के शीर्षक में क्या है), लेकिन यहां कुछ कोड हैं जो पहले 15 दिनों से अधिक पुरानी सभी फ़ाइलों को हटा देंगे, और फिर किसी भी खाली निर्देशिका को पुन: हटा सकते हैं जो शायद छोड़ दिया गया हो पीछे। मेरा कोड -Forceछिपी और पढ़ने वाली फ़ाइलों को भी हटाने के लिए विकल्प का उपयोग करता है । इसके अलावा, मैं उपनाम का उपयोग नहीं करने के लिए के रूप में ओ पी 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-Itemcmdlet कॉल में जोड़ सकते हैं।

यहां दिखाया गया कोड PowerShell v2.0 संगत है, लेकिन मैं अपने ब्लॉग पर इस पुन: प्रयोज्य कार्यों के रूप में इस कोड और तेज़ PowerShell v3.0 कोड को भी दिखाता हूं


22
उपनाम का उपयोग न करने के लिए धन्यवाद। किसी ऐसे व्यक्ति के लिए जो Google खोज के माध्यम से शक्तियां प्राप्त करने के लिए नया है और मैंने इस पोस्ट को सबसे अच्छा माना है।
ज्योफ दाऊद

1
मैंने @ डेडलीडॉग के सुझाव की कोशिश की और कोई फर्क नहीं पड़ता अगर मैं -15 या -35 निर्दिष्ट करता हूं जिसमें अलग-अलग फ़ाइल निर्माण की तारीखें महीनों (या हाल ही में) जा रही हैं, यह निर्देशिका की संपूर्ण सामग्री को हटा रहा है।
मिशेल

6
यदि फ़ाइलें उपयोग में हो सकती हैं, तो इसे हटाने के लिए "-ErrorAction SilentlyContinue" जोड़ने के लायक भी है।
केविन ओवेन

17
धन्यवाद! मैं $ _ के बजाय $ _ का उपयोग करता हूं। अंतिम बार लिखने का समय। क्रिएशनटाइम
लॉरी लुबी

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

51

बस (PowerShell V5)

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एक बहुत अधिक है, नहीं? डीआईआर सूची पुनरावर्ती है, आइटम का विलोपन शामिल चिल्ड के साथ नहीं होना चाहिए, है ना?
जोस्ट

यदि आप जिस निर्देशिका के साथ काम कर रहे हैं, वह दो निर्देशिकाओं में गहरी है तो दूसरी -recurse की आवश्यकता है।
ब्रायन एस।

5

Esperento57 की स्क्रिप्ट पुराने PowerShell संस्करणों में काम नहीं करती है। यह उदाहरण है:

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

यदि आपको विंडोज 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खाली है तो यह फॉर्च्यूमेंट स्टेटमेंट में प्रवेश नहीं करेगा । आप में foreach रखना चाहिए अगर बयान।
डाइटर

@ मति वास्तव में यह दूसरे कथन तक पहुँच सकता है। हमारे पास फ़ाइल सूची के आधार पर लूप के लिए समान है और यह नियमित रूप से $ फ़ाइल चर के साथ लूप के लिए शून्य के रूप में प्रवेश करता है
BeowulfNode42

मैं अनुमान लगा रहा हूँ- बस यहाँ एक ही स्क्रिप्ट में ठोकर खाई; networknet.nl/apps/wp/published/…
शॉनसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.