मैं नीचे आवश्यकता के लिए एक बैच फ़ाइल बनाने के लिए देख रहा हूँ:

रूट फोल्डर - D:\Olderfiles\SourceDocuments

इस रूट फोल्डर के अंदर हमारे पास कई फोल्डर और सब फोल्डर होते हैं। इनमें से प्रत्येक फोल्डर में आर्काइव नामक फोल्डर हो भी सकता है और नहीं भी। हमें "संग्रह" नाम के इन फ़ोल्डरों से *.xlsx फ़ाइलें जो पिछले 120 दिनों में अपडेट नहीं हुई हैं, उन्हें हटाने की आवश्यकता है।

मैं नीचे स्क्रिप्ट की कोशिश की, लेकिन यह अपेक्षा के अनुरूप काम नहीं कर रहा।

Forfiles /p "D:\Olderfiles\SourceDocuments" /s /m *\Archive\*.xlsx /D -120 /C "cmd /c del @path"

किसी भी प्रकार की सहायता सराहनीय होगी।

0
isarathg 24 जून 2019, 21:41

2 जवाब

सबसे बढ़िया उत्तर

अपनी बैच स्क्रिप्ट में, आप PowerShell स्क्रिप्ट का उपयोग कर सकते हैं। यह वर्तमान पावरशेल 5 की कुछ विशेषताओं का उपयोग करता है। इसे कुछ परिवर्तनों के साथ पुराने संस्करणों के साथ किया जा सकता है। जब आप आश्वस्त हों कि सही फ़ाइलें हटा दी जाएंगी, तो -WhatIf को `निकालें-आइटम cmdlet से हटा दें।

=== deold.ps1

Get-ChildItem -Recurse -Directory -Path 'D:\Olderfiles\SourceDocuments' -Filter 'Archive' |
    ForEach-Object {
        Get-ChildItem -File -Path $_.FullName -Filter '*.xlsx' |
            ForEach-Object {
                if ($_.LastWriteTime -lt (Get-Date).AddDays(-120)) {
                    Remove-Item -Path $_.FullName -WhatIf
                }
            }
    }

=== deold.bat

powershell -NoLogo -NoProfile -File "delold.ps1"
1
lit 27 जून 2019, 16:37

Windows के कुछ संस्करणों में ForFiles Date Checking में ज्ञात बग हैं।

इससे निजात पाने के लिए आप मिलान करने वाली फाइलों की सूची तैयार करने के लिए रोबोकॉपी का उपयोग कर सकते हैं, और फिर फॉर लूप का उपयोग करके उन्हें हटा सकते हैं:

MD "%temp%\Empty"
FOR /F "Tokens=*" %%A IN ('
 ROBOCOPY "D:\Olderfiles\SourceDocuments" "%temp%\Empty" *
   /MinAGE:120
   /L /NP /NC /NS /FP /NDL /NJH /NJS
 ^| FINDStr /I /R /C:"\\Archive\\.*\.xlsx$"
') DO @(
    DEL /F/Q "%%~A"
)

फ़ाइलों और उपनिर्देशिकाओं की संख्या के आधार पर यह या ForFiles अभी भी काफी समय ले सकता है क्योंकि आप केवल "संग्रह" फ़ोल्डरों की परवाह करते हैं।

तो, इसे तेज करने के लिए, केवल उन निर्देशिकाओं से मेल खाने के लिए डीआईआर का उपयोग करके "आर्काइव" नाम की निर्देशिकाओं की जांच करें, और फिर हम रोबोकॉपी चलाने के लिए उस सूची को लूप करते हैं:

यह Forfiles या उपरोक्त लूप की तुलना में बहुत तेज़ होने वाला है:

MD "%temp%\Empty"
FOR /F "Tokens=*" %%a IN ('
    DIR /AD/S/B "D:\Olderfiles\SourceDocuments\*Archive" 
') DO (
    FOR /F "Tokens=*" %%A IN ('
        ROBOCOPY "%%~A" "%temp%\Empty" *
            /MinAGE:120
            /L /NP /NC /NS /FP /NDL /NJH /NJS
        ^| FINDStr /I /R /C:"\\Archive\\.*\.xlsx$"
    ') DO (
        DEL /F/Q "%%~A"
    )
)

यदि आप इसे केवल सीएमडी लाइन में पेस्ट कर रहे हैं तो आपको इसका उपयोग करने की आवश्यकता है जिसने प्रत्येक लूप वेरिएबल से एक% चिह्न हटा दिया है:

MD "%temp%\Empty"
FOR /F "Tokens=*" %a IN ('
    DIR /AD/S/B "D:\Olderfiles\SourceDocuments\*Archive" 
') DO (
    FOR /F "Tokens=*" %A IN ('
        ROBOCOPY "%~A" "%temp%\Empty" *
            /MinAGE:120
            /L /NP /NC /NS /FP /NDL /NJH /NJS
        ^| FINDStr /I /R /C:"\\Archive\\.*\.xlsx$"
    ') DO (
        DEL /F/Q "%~A"
    )
)
1
Ben Personick 24 जून 2019, 23:49