30. august 2003 - 13:25Der er
17 kommentarer og 1 løsning
Batch el. script til udtræk af strenge
I forbindelse med batch-defrag og -chdsk opretter jeg ialt 10 logfiler, dem vil jeg gerne have samlet i en. Jeg vil gerne have at filnavnet for de enkelte filer kommer med i den samlede log-fil. Defrag-log'ene, som hedder DefragLog(C-G).txt skal kopieres ind med navn og hele indholdet. chdsk-log'ene, som hedder DiskLog(C-G).txt skal kopieres ind med navn og kun de sidste 11 linier. Resultatet skulle gerne blive noget i denne retning:
SamletLog.txt
DefragLogC.txt Windows Disk Defragmenter Copyright (c) 2001 Microsoft Corp. and Executive Software International, Inc.
DiskLogC.txt 17406427 KB total disk space. 1196732 KB in 8919 files. 2652 KB in 684 indexes. 0 KB in bad sectors. 77083 KB in use by the system. 65536 KB occupied by the log file. 16129960 KB available on disk.
4096 bytes in each allocation unit. 4351606 total allocation units on disk. 4032490 allocation units available on disk.
Det er ikke så lidt du beder om *s* Den eneste måde jeg kan forestille mig at det kan laves på er med hjælp fra f.eks awk fra unix. Jeg lavede selv noget hvor en hel masse filer med intetsigende navne skulle omdøbes, og det nye navn stod på først linie i hver fil. Download awk for windows her: http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe
17406427 KB total disk space. 1196732 KB in 8919 files. 2652 KB in 684 indexes. 0 KB in bad sectors. 77083 KB in use by the system. 65536 KB occupied by the log file. 16129960 KB available on disk.
4096 bytes in each allocation unit. 4351606 total allocation units on disk. 4032490 allocation units available on disk.
Men hvis det er meget besværligt kun at tage de 11 linier med kan jeg nok leve med at det hele kommer med, og så er din løsning jo faktisk køreklar :-) Lige et tillægsspgs. hvordan laver et ekstra linieskift mellem de forskellige Log'ge?
Hmm.. så besværligt er det nu heller ikke at lave med AWK og samtidig får du jo kendskab til et program, hvor du næsten kan gøre hvad du vil med tekstfiler. Men det bestemmer du selvfølgelig.
Ok, det jeg lavede og som forholdsvist nemt burde kunne tilrettes til dit projekt ligger på min pc på arbejdet og er ikke lige sådan at få fat på før på mandag. Men sig til hvis du vil gøre forsøget med awk, så skal jeg gerne prøve at lede dig i den rigtige retning. Det der gør det forholdvist nemt er at AWK deler hver linie op i felter og man kan direkte teste om f.eks 4 felt er "disk", om 3 felt er "in" osv. Samtidig er der variabler indbygget så den ved hvilken fil den er ved at behandle, hvad linienr den er kommet til osv osv. Man kan næsten alt med det program.
hej igen Stry: Det lyder igen som en ting et VBscript let skulle kunne klare. Der er jo blot tale om tekstfiler. Har jeg forstået dig ret, så skal defrag-filerne blot samles i en fil, med en overskrift før hver fil. chkdsk-filen: Kun de sidste 11 linier skal med. Kan du ikke komme ud for, at chkdsk skriver mere en 11 interessante linier ud til sidst (specielt hvis der er fundet problemer)? Så det lyder som et script, der danner en tekstfil med et indhold, som er: Lav en overskrift for fil 1. Læs alle linier i fil 1 og gem dem (der er lige noget med at bevare rækkefølgen af linierne)
Gentag dette for en række andre filer. For chkdsk-filen: Læs 11 linier. Blive ved at læse nye linier, men husk kun de 11 nyeste. Når hele filen er læst gem de 11 linier sammen med en overskrift.
Det er en lille øvelse i tekstfilhåndtering i VBscript.
Vi skal nok vænne os til mere og mere at erstatte batchfil-programmering med brug af scripts.
Her er et VBscript, der laver en tekst-fil udfra 2 filer. Scriptet skal blot ligge i samme katalog som filerne (men det kan selvfølgelig ændres). Der er ikke lavet nogen form for fejl-håndtering. Der laves først en linie med navnet på første fil, og derefter kommer så indholdet af første fil, og tilsvarende med den næste fil. Så kan du selv tilføje resten. Det kan selvfølgelig laves smart, så filnavnene hentes fra en tekstfil, men jeg skal jo ikke lave det hele ;o).
Option Explicit dim filsystem, streamInd,streamUd,txt Set FilSystem=CreateObject("Scripting.FileSystemObject") Set streamInd=filsystem.openTextFile("fil-1.log") set streamUd=FilSystem.OpenTextFile("NyFil.txt",8,true)
streamUd.writeline("Fil-1.log starter her:" & VBCrLf) while not streamInd.AtEndOfStream txt=streamInd.readline() streamUd.writeline(txt) wend streamUd.writeline(VBCrLf) streamInd.close
Set streamInd=filsystem.openTextFile("fil-2.log") streamUd.writeline("Fil-2.log starter her:" & VBCrLf) while not streamInd.AtEndOfStream txt=streamInd.readline() streamUd.writeline(txt) wend streamUd.writeline(VBCrLf) StreamInd.close
Her er så et VBscript, som tilføjer de 11 sidste linier i tekst-filen ChkDsk.log til filen NyFil.txt. Der vil først komme en linie der fortæller, at nu kommer de sidste 11 linier i ChkDsk.log.
Option Explicit dim filsystem, streamInd,streamUd,txt,i, A(11),pp Set FilSystem=CreateObject("Scripting.FileSystemObject") Set streamInd=filsystem.openTextFile("ChkFil.log") set streamUd=FilSystem.OpenTextFile("NyFil.txt",8,true)
'Det forventes at ChkFil.log har mindst 11 linier for i=1 to 11 A(i)=streamInd.readline() next
pp=1 while not streamInd.AtEndOfStream txt=streamInd.readline() A(pp)=txt pp=pp+1 if pp=12 then pp=1 wend streamInd.close
streamUd.writeline("De sidste 11 linier i ChkFil.log starter her:" & VBCrLf) for i=pp to 11 streamUd.writeline(A(i)) next
for i=1 to pp-1 streamUd.writeline(A(i)) next streamUd.close
Når man åbner en fil for skrivning således FilSystem.OpenTextFile("NyFil.txt",8,true) vil den åbnes, så det, der tilføjes, sættes efter det, der er i forvejen. Hvis man åbner for skrivning på denne måde: FilSystem.OpenTextFile("NyFil.txt",2,true) vil det, der er i filen i forvejen, blive slettet.
Nå, jeg lavede lige et script, som henter filnavnene fra en tekstfil og derefter smler alt i en stor fil, hvor de enkelte filnavne er skrevet ind, så man kan se, hvor tingene stammer fra. Der udskrives en meddelelse, hver gang en fil bliver behandlet. Man skal så trykke OK. Filnavnene skal være anbragt i en tekstfil med et filnavn pr. linie.
Det vil være let at rette til, så alle ChkDsk-filerne håndteres på samme måde.
Option Explicit dim filsystem, Filnavne, streamUd,txt Set FilSystem=CreateObject("Scripting.FileSystemObject")
set streamUd=FilSystem.OpenTextFile("NyFil.txt",8,true)
sub HentFilnavne dim FN, tmp Set FN=filsystem.openTextFile("filnavne.txt") tmp=FN.readall FN.close tmp=replace(tmp,VBCrLf,";") Filnavne=split(tmp,";") end sub
sub SamlFiler dim i, navn, streamInd, txt for i=0 to Ubound(Filnavne) navn =Filnavne(i) if navn<>"" then MsgBox "Nu behandles " & navn set streamInd=Filsystem.OpenTextFile(Filnavne(i)) streamUd.writeline(navn & " starter her:" & VBCrLf) while not streamInd.AtEndOfStream txt=streamInd.readline streamUd.writeline(txt) wend streamUd.writeline(VBCrLf) streamInd.close end if next end sub
HentFilnavne SamlFiler streamUd.close MsgBox "Slut. Det gik godt."
tonnybrandt>> AWK og felter. Hvis man bruger split-ordren, kan man i VBscript straks få en linie delt op i de forskellige ord, der måtte stå i linien. A=split(txt," ") Nu er A et array, der indeholder ordene i tekststrengen txt.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.