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

मान लें कि लॉग फ़ाइल इस प्रकार है:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : Tue Dec 01 06:55:11 2015

   Source : C:\Source Path
     Dest : E:\Destination Path

    Files : *.*

  Options : *.* /TEE /S /E /COPY:DAT /PURGE /MIR /NP /R:2 /W:2 

------------------------------------------------------------------------------
List of files here
List of files here
List of files here
------------------------------------------------------------------------------
                Total    Copied   Skipped  Mismatch    FAILED    Extras
     Dirs :       945         0       945         0         0         0
    Files :     10118         4     10114         0         0         3
    Bytes :   1.245 g   323.9 k   1.244 g         0         0         0
    Times :   0:00:17   0:00:00                       0:00:00   0:00:17

    Speed :             5264920 Bytes/sec.
    Speed :             301.261 MegaBytes/min.

    Ended : Tue Dec 01 06:55:28 2015

मैं फ़ाइल के अंतिम 11 पंक्तियों को कमांड $summary = Get-Content $log | Select-Object -last 11 | Out-String के साथ प्राप्त कर सकता हूं, लेकिन दो गति लाइनें केवल सूचीबद्ध हैं यदि डेटा वास्तव में स्थानांतरित हो गया है, जिसके परिणामस्वरूप फ़ाइल सूची के अंतिम लाइनों का परिणाम है। अंततः एक बहुत बड़ी समस्या नहीं है, लेकिन यह बहुत सुंदर नहीं लगती है।

लाइनों की एक निर्धारित संख्या के बजाय, मैं फ़ाइल से अंतिम पंक्तियों को कैसे प्राप्त कर सकता हूं, अंतिम (या 4 वें के बाद, वहाँ हमेशा 4 हैं) सीमांकक --------------- की घटना?

0
Butters 1 पद 2015, 19:30

3 जवाब

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

मैंने एक समाधान निकाला, लेकिन मुझे लगता है कि एक बेहतर तरीका होना चाहिए। पहला कमांड सभी सीमांकक पाता है, और सारांश को निकालने के लिए शुरुआती बिंदु के रूप में {{X 1}} सरणी में अंतिम तत्व का उपयोग करते हुए लाइन संख्या $finds सरणी के लिए फिर दूसरी पंक्ति को आउटपुट करता है।

मनाइए कि यह किसी और के लिए सहायक हो!

$finds = Get-Content $log | Select-string "--------------" | Select-Object LineNumber

$summary = Get-Content $log | Select-Object -skip $finds[-1]."LineNumber" | Out-String
0
Butters 1 पद 2015, 18:54
Get-Content $log | Select-String 'Total' -Context 0,20

स्पष्टीकरण: Select-STring किसी भी लाइन के लिए लग रहा है जिसमें 'कुल' है। पैरामीटर -Context 0,20 इसे मिलान रेखा (और पहले शून्य रेखाएं) के बाद 20 लाइनों तक प्रदर्शित करने के लिए कहता है।

यदि आप 'sales_total.txt' जैसी फाइल कॉपी करते हैं, तो यह लाइन भी मेल खा जाएगी। इसे रोकने के लिए, आप मिलान स्ट्रिंग को अधिक स्पष्ट बना सकते हैं। उदाहरण के लिए पूरी लाइन का उपयोग करें।

0
Swonkie 1 पद 2015, 19:06

इसे इस्तेमाल करे:

Get-Content $log -Delimiter ('-'*78) |
Select -last 1
0
mjolinor 1 पद 2015, 22:40