Batch: Bestanden archiveren en in mappen sorteren op bestandsnaam

Status
Niet open voor verdere reacties.

tyrope

Gebruiker
Lid geworden
10 feb 2006
Berichten
58
Hallo,

even een achtergrondverhaaltje, Ik ben admin op een chat netwerk en chat in +- 12 kanalen. Omdat ik gisteren een ruzie niet goed kon oplossen i.v.m. het gebrek aan logs heb ik logs sindsdien aan gezet.
Helaas sorteert KVIrc dit echt totaal niet. hier een print screentje van de folder:
logFolder.png
De bestanden zijn op de volgende manier benoemt:
  • Type (privé (query) of publiek (channel))
  • Afzender
  • netwerk (in dit geval is dit altijd nerdfighteria, aangezien ik vandaag nog niet verbonden ben geweest met andere netwerken)
  • datum
Ik wil gaan sorteren op:
  • netwerk
  • datum (jaar/maand/dag)
  • afzender (type maakt niet uit, dit is te zien aan de #)

Graag zou ik dit willen omzetten op de volgende manier, als voorbeeld nemen we even channel_#yourpants%2dnl.nerdfighteria_2012.03.12.txt
dit word dus: archive/nerdfighteria/2012/03/12/#yourpants-nl.txt (indien dit #yourpants%2dnl.txt moet worden is dat geen probleem.)
Nu weet ik het commando wel om het bestand te hernoemen/verplaatsen, maar hoe ik hier een loop omheen moet schrijven.. geen idee.

ik ben van plan dit bestand via task scheduler op de eerste van de maand, om middernacht te laten lopen.

Alvast bedankt voor iedereen die mij helpt een goed script te schrijven, of dit voor mij wilt doen.

Mvg,
Dimitri "Tyrope" Molenaars
 
Laatst bewerkt:
Volgens mij moet je met onderstaand script al een eind komen. Folder natuurlijk even aanpassen. Dit script veranderd overigens nog niets, het geeft alleen aan op het scherm hoe de componenten uit elkaar vallen. (Dit is overigens VBS, niet powerscript of BAT dus de file moet de extensie .VBS hebben)

Code:
set fso = CreateObject("Scripting.FileSystemObject")
set RE = new regexp
re.Pattern = ".+_([^\.]+).([^_]+)_([0-9]+).([0-9]+).([0-9]+)"
re.IgnoreCase = true
re.Global = true
set folder = fso.GetFolder("h:\temp\temp\test")
set files = folder.Files

for each dirfile in files
	Wscript.echo dirfile.Name
	set MC = RE.Execute(dirfile.name)
	set M = MC(0)
	if M.submatches.count then
		doel = M.submatches(0)
		server = M.submatches(1)
		jaar = M.submatches(2)
		maand = M.submatches(3)
		dag = M.submatches(4)
		doel = replace(doel,"#","")
		Wscript.Echo "  " & server & " " & jaar & " "& maand & " "& dag & " "& doel
	end if
next
 
Bedankt voor de eerste stap, wampier. na een paar strings te veranderen heb ik nu de gewenste commando's, nu is het een kwestie van deze in een batch commando om te zetten.
Aangezien ik nog nooit met Visual Basic Script gewerkt heb, heb ik geen idee hoe dit gedaan kan worden.

Hieronder de veranderde code
HTML:
set fso = CreateObject("Scripting.FileSystemObject")
set RE = new regexp
re.Pattern = ".+_([^\.]+).([^_]+)_([0-9]+).([0-9]+).([0-9]+)"
re.IgnoreCase = true
re.Global = true
set folder = fso.GetFolder("D:\IRC Logs")
set files = folder.Files

for each dirfile in files
	set MC = RE.Execute(dirfile.name)
	set M = MC(0)
	if M.submatches.count then
		doel = M.submatches(0)
		server = M.submatches(1)
		jaar = M.submatches(2)
		maand = M.submatches(3)
		dag = M.submatches(4)
		Wscript.Echo "move " & dirfile.Name & " D:\IRC Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt"
	end if
next

Regel 18 print dus het commando dat uitgevoerd moet worden. ik neem aan dat er een functie moet zijn dat i.p.v. deze in een alert (Echo) zet, dit uitvoert?
 
Laatst bewerkt:
Ik kan het even niet testen nu, maar volgens mij moet het zoiets worden. Het kan dat er een "\" tussen folder.title en dirfile.name moet. maar mogelijk kun je dat even testen met echo

fso.movefile (folder.title & dirfile.name , D:\IRC Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt" )
 
Heb deze code geprobeerd, incl. het omzetten van folder.title naar een string (hij blijft immers maar op 1 plek staan.) helaas werkte dit niet.
error.png
HTML:
set fso = CreateObject("Scripting.FileSystemObject")
set RE = new regexp
re.Pattern = ".+_([^\.]+).([^_]+)_([0-9]+).([0-9]+).([0-9]+)"
re.IgnoreCase = true
re.Global = true
set folder = fso.GetFolder("D:\IRC Logs")
set files = folder.Files

for each dirfile in files
	set MC = RE.Execute(dirfile.name)
	set M = MC(0)
	if M.submatches.count then
		doel = M.submatches(0)
		server = M.submatches(1)
		jaar = M.submatches(2)
		maand = M.submatches(3)
		dag = M.submatches(4)
		fso.movefile ("D:\IRC Logs\" & dirfile.name , "D:\IRC Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt" ) 
	end if
next
 
Eh, blijkbaar moet om MoveFile geen () dus:

fso.movefile "D:\IRC Logs\" & dirfile.name , "D:\IRC Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt"

Ik ben op het moment onderweg, dus probeer ik dit te volgen op mijn ipad. Mocht je er niet uitkomen zal ik vanmiddag eens proberen op de desktop.
 
Lange dag op school vandaag, kan pas vanavond testen. Verspeel dus geen 3G aan een antwoord voor 'n uurtje of 5.

(ik zal dit bericht editten met testresultaten als ik thuis ben)

Eindelijk thuis, script werkt niet i.v.m. een pad wat niet bestond:
archiveError-l18c3-pathnotfound.png
Dus heb de naam veranderd van "IRC Logs" naar "IRC_Logs", hopend dat het de spatie was, dit was niet het geval en kreeg dezelfde foutmelding (behalve dat de script source nu een _ had, uiteraard.)
Zou misschien de nieuwe mappen eerst gemaakt moeten worden?

edit: vergeten de source erbij te hangen:
HTML:
set fso = CreateObject("Scripting.FileSystemObject")
set RE = new regexp
re.Pattern = ".+_([^\.]+).([^_]+)_([0-9]+).([0-9]+).([0-9]+)"
re.IgnoreCase = true
re.Global = true
set folder = fso.GetFolder("D:\IRC_Logs")
set files = folder.Files

for each dirfile in files
	set MC = RE.Execute(dirfile.name)
	set M = MC(0)
	if M.submatches.count then
		doel = M.submatches(0)
		server = M.submatches(1)
		jaar = M.submatches(2)
		maand = M.submatches(3)
		dag = M.submatches(4)
		fso.movefile "D:\IRC_Logs\" & dirfile.name , "D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt"
	end if
next
 
Laatst bewerkt:
Ik heb het even getest en de directory moet inderdaad bestaan. Overigens is er directe support vanuit het file object dus de code kan ook nog wat eleganter.

overigens kun je via:

Cscript /b <VBS-file>

het script laten runnen zonder popups en echos in een dosbox.

Code:
set fso = CreateObject("Scripting.FileSystemObject")
set RE = new regexp
re.Pattern = ".+_([^\.]+).([^_]+)_([0-9]+).([0-9]+).([0-9]+)"
re.IgnoreCase = true
re.Global = true
set folder = fso.GetFolder("D:\IRC_Logs")
set files = folder.Files
 
for each dirfile in files
    set MC = RE.Execute(dirfile.name)
    set M = MC(0)
    if M.submatches.count then
        doel = M.submatches(0)
        server = M.submatches(1)
        jaar = M.submatches(2)
        maand = M.submatches(3)
        dag = M.submatches(4)
        if Not fso.FolderExists("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\") Then
                fso.CreateFolder ("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\")
                dirfile.move ("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt")
        else
                dirfile.move ("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt")
        end if
    end if
next
 
Helaas werkte deze fix ook niet, zouden we ELKE map moeten nakijken?
archiveError-l19c17-pathnotfound.png
HTML:
set fso = CreateObject("Scripting.FileSystemObject")
set RE = new regexp
re.Pattern = ".+_([^\.]+).([^_]+)_([0-9]+).([0-9]+).([0-9]+)"
re.IgnoreCase = true
re.Global = true
set folder = fso.GetFolder("D:\IRC_Logs")
set files = folder.Files
 
for each dirfile in files
    set MC = RE.Execute(dirfile.name)
    set M = MC(0)
    if M.submatches.count then
        doel = M.submatches(0)
        server = M.submatches(1)
        jaar = M.submatches(2)
        maand = M.submatches(3)
        dag = M.submatches(4)
        if Not fso.FolderExists("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\") Then
                fso.CreateFolder ("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\")
                dirfile.move ("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt")
        else
                dirfile.move ("D:\IRC_Logs\Archive\" & server & "\" & jaar & "\" & maand & "\" & dag & "\" & doel & ".txt")
        end if
    end if
next
 
Ik heb het even gestest met een enkele nieuwe directory en dat werkte prima. Mogelijk werkt het script niet met meerdere lagen diep. Misschien heb ik vanavond nog even tijd om te testen
 
Heb m.b.v. een maat een C# programmatje geschreven dat dit uitvoerd.

Code staat op GitHub.com

Alsnog bedankt wampier, aangezien we jouw code als logische denkwijze gebruikt hebben.

Mvg,
Tyrope
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan