2012-01-10 5 views
16

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

एक और पोस्ट का उपयोग करके मैंने नीचे दी गई स्क्रिप्ट बनाई है, लेकिन यह 10 प्रतियां नहीं रखती है, यह 10 दिनों से पुरानी नहीं है।

$ftppath = "C:\Reports" 
Get-ChildItem $ftppath -recurse *_Report_*.zip -force|where {$_.lastwritetime -lt (get-date).adddays(-10)} |Remove-Item -force 

कोई विचार यह है कि मैं इसे काम करने के लिए कैसे ट्विक कर सकता हूं? यदि मैं नीचे लिपि का उपयोग करता हूं तो यह काम करता है, लेकिन केवल तभी जब मैं सेट नहीं करता हूं। यदि आप -रर्स स्विच का उपयोग करते हैं तो आपको एक त्रुटि मिलती है जिसे मैंने स्क्रिप्ट के नीचे सूचीबद्ध किया है।

# Keeps latest 10 files from a directory based on Creation Time 

#Declaration variables 
$path = "C:\Reports"        # For example $path= C:\log\*.tmp 
$total= (ls $path).count - 10 # Change number 5 to whatever number of objects you want to keep 
# Script 
ls $path |sort-object -Property {$_.CreationTime} | Select-Object -first $total | Remove-Item -force 

Error: Select-Object : Cannot validate argument on parameter 'First'. The -7 argument is less than the minimum allowed range of 0. Supply an argument that is greater than 0 and then try the command again.

उत्तर

32

आप CreationTime से उतरकर क्रमबद्ध कर सकते हैं और पहले 10 को छोड़ सकते हैं। यदि 10 से कम फाइलें हैं तो यह किसी को भी नहीं हटाएगी।

gci C:\temp\ -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| 
    select -Skip 10| Remove-Item -Force 
+1

आह '-स्किप'। अच्छा और संक्षिप्त :-) +1 –

+0

इसका परीक्षण कर रहा था और कुछ अजीब परिणाम प्राप्त हुए, यह सुनिश्चित नहीं था कि वहां क्या हो रहा था ... पुन: परीक्षण किया गया और यह काम कर रहा है जैसा कि मैं उम्मीद करता हूं। अच्छा 1 लाइनर। –

+0

@ एंडी - हाँ, मैंने फ़ाइलों को बनाने के लिए आपके कोड की कोशिश की, और दूसरी बार मैंने इसे चलाया, सृजनटाइम सभी फ़ाइलों के लिए अपडेट नहीं हुआ। मुझे बिल्कुल नहीं पता कि क्यों: -/ – Rynant

8

अपडेट किया गया

$path = "C:\TestDir" 

# Create 12 test files, 1 second after each other 
1..12 | % { 
    Remove-Item -Path "$path\$_.txt" -ea SilentlyContinue 
    $_ | Out-File "$path\$_.txt" 
    Start-Sleep -Seconds 1 
} 

$files = Get-ChildItem -Path $path -Recurse | Where-Object {-not $_.PsIsContainer} 
$keep = 10 
if ($files.Count -gt $keep) { 
    $files | Sort-Object CreationTime | Select-Object -First ($files.Count - $keep) | Remove-Item -Force -WhatIf 
} 

Remove-Item को -WhatIf पैरामीटर निकालें असली के लिए हटाने के लिए अपने तैयार है।

+0

क्या यह सभी फ़ाइलों को हटा नहीं देता है? – Rynant

+0

आह धन्यवाद हाँ पुराने संस्करण का होगा। अधिक परीक्षण करने में मदद करता है ;-) मैंने परीक्षण किए गए वर्किंग वर्जन के साथ अपडेट किया है। –

+0

सहायता के लिए धन्यवाद। यह अब उम्मीद के रूप में चल रहा है। एक बार फिर धन्यवाद। – mpowmap

1

@ एंडी: मेरा प्रतिनिधि उत्तर देने के लिए बहुत कम है इसलिए उत्तर पोस्ट करना। यदि आपको अजीब परिणाम मिल रहे हैं, तो ऐसा इसलिए हो सकता है क्योंकि आप Windows Explorer में देख रहे हैं जो डिफ़ॉल्ट रूप से निर्माण तिथि के बजाय अंतिम संशोधित दिनांक दिखाता है। Windows Explorer में दिखाए गए परिणामों के अनुरूप परिणाम प्राप्त करने के लिए, CreationTime के लिए LastWriteTime को स्वैप करें: जीसीआई सी: \ temp \ -Recurse | जहां {-नॉट $ _। PsIsContainer} | सॉर्ट LastWriteTime -desc | चयन करें- स्कीप 10 | निकालें-आइटम -फोर्स

संबंधित मुद्दे