विंडोज 10 x64 1709
पावरशेल 5.1

मेरे पास एक पावरशेल स्क्रिप्ट है जो निर्देशिका (और उप-निर्देशिकाओं) में सभी फ़ाइलों को दोबारा सूचीबद्ध करती है और सूची को टेक्स्ट फ़ाइल में आउटपुट करती है। मैं अब एक विशिष्ट तिथि सीमा के भीतर LastWriteTime के साथ फ़ाइलें प्राप्त करना चाहता हूं। मुझे निम्नलिखित अन्य प्रश्नों/साइटों में एक उदाहरण के रूप में मिला, जो काम करना चाहिए:

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName | Where-Object {
    $_.LastWriteTime -ge '01/01/2019 00:00:00' -and
    $_.LastWriteTime -le '22/04/2019 00:00:00'
} > 'C:\path\to\files\filelist.txt'

(तारीख मेरे सिस्टम में dd/MM/YYYY में है, लेकिन मैंने अन्य प्रारूपों की भी कोशिश की, बस मामले में)

पहले तो मुझे लगा कि यह दिनांक/समय प्रारूप से संबंधित एक मुद्दा है, और मैंने कई घंटे अपना सिर पीटने और सभी प्रकार के रूपांतरणों को आजमाने में बिताए। मैंने Where-Object के बजाय, एक ही समस्या का उपयोग करने का भी प्रयास किया।

मैंने अंत में कुछ आसान करने की कोशिश करने के बारे में सोचा: प्रत्येक शर्त को अलग से चलाना। और देखो और देखो, यहाँ सौदा है।

अगर मैं -le चलाता हूं

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName |
    where LastWriteTime -le '22/04/2018 01:00:00'

मुझे फाइलों की एक सूची मिलती है।

अगर मैं -ge चलाता हूं

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName |
    where LastWriteTime -ge '01/01/2019 00:00:00'

सूची खाली है (कोई त्रुटि भी नहीं)।

निम्नलिखित, हालांकि, काम करता है:

(Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse).FullName |
    where LastWriteTime -ge $Today

मैंने -ge पैरामीटर पर दस्तावेज़ीकरण की तलाश की; इसे लोअर/अपरकेस में आजमाया... नहीं जाना।

क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है? क्या -ge टूटा हुआ है?

पुनश्च: मैंने LastWriteTime को CreationTime के साथ बदलने की कोशिश की और समस्या बनी रहती है (ऐसा नहीं है कि यह मायने रखता है, लेकिन सिर्फ इसका उल्लेख कर रहा है)।

0
gonzo 24 अप्रैल 2019, 06:32

1 उत्तर

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

सबसे पहले, आप पाइप के नीचे फ़ाइल ऑब्जेक्ट पास नहीं कर रहे हैं, आप .FullName प्रॉपर्टी का उपयोग करके स्ट्रिंग पास कर रहे हैं। ये फ़ाइल नाम केवल फ़ाइल नाम हैं, उनके पास LastWriteTime गुण नहीं है। फ़ाइल ऑब्जेक्ट को बस पास करने के लिए अपनी स्क्रिप्ट बदलें।

Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse |

दूसरा, तिथियों की तुलना को डेटाटाइम ऑब्जेक्ट्स में परिवर्तित करें। अन्यथा आप डेटटाइम ऑब्जेक्ट्स की तुलना LastWriteTime से System.String से कर रहे हैं। पॉवर्सशेल कन्वर्ट करने का प्रयास करेगा लेकिन लोकेल फॉर्मेटिंग अंतर के कारण कभी-कभी गलत हो जाता है। उदाहरण के लिए: Get-Date '22/04/2019 01:00:00' त्रुटियाँ मेरे लिए। मैं दिनांक स्ट्रिंग को के साथ पार्स कर दूंगा DateTime.ParseExact विधि। आपको अपने स्थान के लिए CultureInfo को बदलना पड़ सकता है।

$upperBound = [datetime]::ParseExact('22/04/2019 01:00:00',
                                     'dd/MM/yyyy hh:mm:ss',
                                     [Cultureinfo]::InvariantCulture)
$lowerBound = [datetime]::ParseExact('01/01/2019 01:00:00',
                                     'dd/MM/yyyy hh:mm:ss',
                                      [Cultureinfo]::InvariantCulture)

Get-ChildItem 'C:\path\to\files\raw\*.xml' -Recurse | Where-Object {
    $_.LastWriteTime -ge $lowerBound -and $_.LastWriteTime -le $upperBound
}  | Select-Object -ExpandProperty FullName
2
StephenP 25 अप्रैल 2019, 08:02