webForumDet fria alternativet

Ändra textsträng i textfiler

.NET

16 svar · 632 visningar · startad av McD

Medlem sedan mars 20002 520 inlägg
Frågan#1

Hej jag har ett litet problem först och främst i och med att jag inte kan koda vbs scirpt samt att jag inte får bort bottar i vår statistik som vi har kopplat till vår condition-zero server.

Vi har ett statscirpt som läser av ett antal loggfiler dessa loggfiler ser ut ungefär så här..

L 07/22/2005 - 08:26:34: "paikebot - Kevin<11><BOT><>" joined team "CT"
L 07/22/2005 - 08:26:34: "paikebot - Kevin<11><BOT><>" entered the game
L 07/22/2005 - 08:26:34: "paikebot - Doug<12><BOT><>" joined team "TERRORIST"
L 07/22/2005 - 08:26:34: "paikebot - Doug<12><BOT><>" entered the game
L 07/22/2005 - 08:26:35: "paikebot - Yahn<13><BOT><>" joined team "CT"
L 07/22/2005 - 08:26:35: "paikebot - Yahn<13><BOT><>" entered the game
L 07/22/2005 - 08:26:35: "paikebot - Tim<14><BOT><>" joined team "TERRORIST"
L 07/22/2005 - 08:26:35: "paikebot - Tim<14><BOT><>" entered the game
L 07/22/2005 - 08:26:37: "paikebot - Doug<12><BOT><TERRORIST>" triggered "Spawned_With_The_Bomb"
L 07/22/2005 - 08:26:51: "paikebot - Tim<14><BOT><TERRORIST>" triggered "Spawned_With_The_Bomb"
L 07/22/2005 - 08:27:33: "paikebot - Yahn<13><BOT><CT>" killed "paikebot - Tim<14><BOT><TERRORIST>" with "usp"
L 07/22/2005 - 08:27:33: "paikebot - Tim<14><BOT><TERRORIST>" triggered "Dropped_The_Bomb"
L 07/22/2005 - 08:27:56: "paikebot - Doug<12><BOT><TERRORIST>" triggered "Got_The_Bomb"
L 07/22/2005 - 08:28:07: "paikebot - Yahn<13><BOT><CT>" killed "[NoTriX]BabeKallio<7><STEAM_X:X:XXXXXX><TERRORIST>" with "usp"
L 07/22/2005 - 08:28:15: "paikebot - Doug<12><BOT><TERRORIST>" killed "paikebot - Yahn<13><BOT><CT>" with "glock18"
L 07/22/2005 - 08:28:58: "paikebot - Kevin<11><BOT><CT>" killed "paikebot - Doug<12><BOT><TERRORIST>" with "usp"
L 07/22/2005 - 08:29:07: "paikebot - Tim<14><BOT><TERRORIST>" killed "paikebot - Kevin<11><BOT><CT>" with "galil"
L 07/22/2005 - 08:29:12: "paikebot - Doug<12><BOT><TERRORIST>" triggered "Spawned_With_The_Bomb"
L 07/22/2005 - 08:29:27: "paikebot - Yahn<13><BOT><CT>" killed "paikebot - Doug<12><BOT><TERRORIST>" with "tmp"
L 07/22/2005 - 08:29:27: "paikebot - Doug<12><BOT><TERRORIST>" triggered "Dropped_The_Bomb"
L 07/22/2005 - 08:29:38: "[NoTriX]BabeKallio<7><STEAM_0:X:XXXX><TERRORIST>" killed "paikebot - Yahn<13><BOT><CT>" with "mp5navy"
L 07/22/2005 - 08:29:47: "[NoTriX]BabeKallio<7><STEAM_X:X:XXXXXX><TERRORIST>" killed "paikebot - Kevin<11><BOT><CT>" with "mp5navy"
L 07/22/2005 - 08:29:52: "paikebot - Tim<14><BOT><TERRORIST>" triggered "Spawned_With_The_Bomb"
L 07/22/2005 - 08:30:23: "paikebot - Kevin<11><BOT><CT>" killed "[NoTriX]BabeKallio<7><STEAM_X:X:XXXXXX><TERRORIST>" with "famas"
L 07/22/2005 - 08:30:33: "paikebot - Kevin<11><BOT><CT>" killed "paikebot - Doug<12><BOT><TERRORIST>" with "famas"

Vårt statskript genererar stats utifrån dessa filer... problemet är att statskriptet genererar individuell statistik utifrån STEAM_ID som spelarna har och en BOT som eventellt finns connectad mot servern får aldrig något korrekt steamid (det går inte att ta bort en spelare utan steamid från statistiken då alla VANLIGA spelare ALLTID får ett steamid).

Det jag skulle vilja få lite hjälp med är ett vbs-script som byter ut alla <BOT> mot ett påhittat men rätt formaterat steamid och på så sätt kan jag skriva in det påhittade steamidet i en denied fil som gör att bottarna (det påhittade steamid:et) INTE kommer med i statsen.

Idag i loggarna:

L 07/22/2005 - 08:30:33: "paikebot - Kevin<11><BOT><CT>" killed "paikebot - Doug<12><BOT><TERRORIST>" with "famas"

Efter körning av scirptet:

L 07/22/2005 - 08:30:33: "paikebot - Kevin<11><STEAM_0:0:123><CT>" killed "paikebot - Doug<12><STEAM_0:0:123><TERRORIST>" with "famas"

Det påhittade steamid:et som ska bytas ut där det står BOT i dom vanliga loggfilerna.

STEAM_0:0:123

Scriptet hade jag tänkt att köra med windows schemaläggaren en gång / dygn.. loggfilerna finns placerade här..

c:/spel/hlserver/czero/logs

*Ca 130mb textfiler från ca 3kb till ca 215 kb

Genom att det är så pass många filer så kanske man skulle kunna göra att den BARA ändrar i "gårdagens filer" om det finns några sådana.. då blir det ju alla filer ändå genom att jag kör det en gång / dygn?! (annars är väll risken ganska stor för en timeout i scirptet när det blir mcyket filer samt att det lär och ta grymt lång tid att köra det)*

Detta scirpt skulle kunna hjälpa alla som kör PsychoStats 1.9.1 connectat mot en condition-zero server och vill ha bort bottar från statistiken någon som inte går idag genom strulet med steamid.

Tack så hjärtligt i förskott...

Medlem sedan juni 200032 967 inlägg
#2

Jag har ingen aning om huruvida det är det bästa sättet, eller hur det beter sig i stora datamängder, men...

set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile("foo.log",1)
sTmp = Replace(oF.ReadAll(), "<BOT>", "<STEAM_0:0:123>")
oF.Close
set oF = Nothing

set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile("foo.log",2)
oF.Write(sTmp)
oF.Close
set oF = Nothing
Medlem sedan mars 20002 520 inlägg
#3

Tack, Ändrade lite i mitt första inlägg @nders..

Genom att det är så pass många filer så kanske man skulle kunna göra att den BARA ändrar i "gårdagens filer" om det finns några sådana.. då blir det ju alla filer ändå genom att jag kör det en gång / dygn?! (annars är väll risken ganska stor för en timeout i scirptet när det blir mcyket filer samt att det lär och ta grymt lång tid att köra det)

En dags loggfiler kanske bara är 3-4 mb om inte mindre...

Medlem sedan juni 200032 967 inlägg
#4

Ok, dåså:

Scriptet går igenom alla filer i loggfilsmappen. Om filen skapades igår (dvs dagen innan scriptfilen körs), byts alla förekomster av <BOT> ut mot lämpligt steam-id.

set oFSO = CreateObject("Scripting.Filesystemobject")
set oFolder = oFSO.GetFolder("c:\spel\hlserver\czero\logs\")

for each oFile in oFolder.Files
	if Datediff("d", oFile.DateLastModified, date()) = 1 then replaceFileStuff oFile.Name
next

set oFolder = Nothing
set oFSO = Nothing

sub replaceFileStuff (sFileName)
	set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile("c:\spel\hlserver\czero\logs\" & sFileName, 1)
	sTmp = Replace(oF.ReadAll(), "<BOT>", "<STEAM_0:0:123>")
	oF.Close
	set oF = Nothing

	set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile("c:\spel\hlserver\czero\logs\" & sFileName, 2)
	oF.Write(sTmp)
	oF.Close
	set oF = Nothing
end sub

mvh

Medlem sedan mars 20002 520 inlägg
#5

Tack Tack...

Dock hade den en inbyggd funktion... den tar bort alla gårdagens filer... hinner inte se om något ändras i dem dom bara försvinner...

Det är lugnt självklart tog jag en backup av loggmappen innan jag började mecka... testade detta script

bot_steamid.vbs

set oFSO = CreateObject("Scripting.Filesystemobject")
set oFolder = oFSO.GetFolder("c:\logs\")

for each oFile in oFolder.Files
	if Datediff("d", oFile.DateLastModified, date()) = 1 then replaceFileStuff oFile.Name
next

set oFolder = Nothing
set oFSO = Nothing

sub replaceFileStuff (sFileName)
	set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile("c:\logs\" & sFileName, 1)
	sTmp = Replace(oF.ReadAll(), "<BOT>", "<STEAM_0:0:123>")
	oF.Close
	set oF = Nothing

	set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile("c:\logs\" & sFileName, 2)
	oF.Write(sTmp)
	oF.Close
	set oF = Nothing
end sub

Jag vet inte om det har någon betydelse men filerna heter typ

L0720261.log
L0720262.log
L0720263.log
L0720264.log
L0720265.log

osv

c:/logs är en testkatalog

Medlem sedan juni 200032 967 inlägg
#6

Hmm...

Koden fungerade ju ypperligt när jag testade den, och jag kan inte förstå vad som skulle resultera i att någon fil tas bort... :o

Kan du ladda upp ett par riktiga loggfiler här, så ska vi se?

Medlem sedan mars 20002 520 inlägg
#7

vad har du för mail... skickar några stycken till dig. hehe kollar din profil... men ingen mailadress.. :(

Medlem sedan juni 200032 967 inlägg
#8

.

Medlem sedan mars 20002 520 inlägg
#9

mailar direkt

Medlem sedan juni 200032 967 inlägg
#10

Okay, here goes...

Se bara till att ändra mappnamnet på översta raden.

sFolder = "d:\logs\"
set oFSO = CreateObject("Scripting.Filesystemobject")
set oFolder = oFSO.GetFolder(sFolder)

for each oFile in oFolder.Files
	if Datediff("d", oFile.DateCreated, date()) = 1 then replaceFileStuff oFile.Name
next

set oFolder = Nothing
set oFSO = Nothing

sub replaceFileStuff (sFileName)
	bRewrite = false
	set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile(sFolder & sFileName, 1)
	sTmp = oF.ReadAll()
	if instr(sTmp, "<BOT>") > 0 then
		sTmp = Replace(sTmp, "<BOT>", "<STEAM_0:0:123>")
		bRewrite = true
	end if
	oF.Close
	set oF = Nothing

	if bRewrite then
		set oF = CreateObject("Scripting.FileSystemObject").OpenTextFile(sFolder & sFileName, 2)
		oF.Write(sTmp)
		oF.Close
		set oF = Nothing
	end if
end sub

Mvh

Medlem sedan mars 20002 520 inlägg
#11

Verkar funka :)

Får dock ett felmeddelande

Script: c:/bot_steamid.vbs
Line 15
Hcar 2
Error Input past end of file
Code 800A003E
Source Microsfot VBScript runtime error

Om jag fattar detta rätt så får jag detta pga att det inte finns något mer att ändra... kan man på något sätt få bort meddelandet, så att jag kan använda scriptet i schemaläggaren.

Jätte tack @nders....

Medlem sedan juni 200032 967 inlägg
#12

Hmm, jag kan faktiskt inte svara på varför det felmeddelandet kommer. Jag lyckas inte få det felmeddelandet när jag kör lokalt hos mig.

Jag ska fundera, och återkomma!

Mvh

Medlem sedan mars 20002 520 inlägg
#13

Tror det har att göra med att det inte finns några filer att ändra...

Det fanns något man kunde skriva så den ska ignorera error mess när man kodade asp? kan man använda det kommandot va de nu va... :) ?

Medlem sedan juni 200032 967 inlägg
#14
on error resume next

Och ja, det borde gå alldeles utmärkt att använda.

Men, det är inte rätt. :)

Finns inga filer att ändra / gå igenom så ska man inte komma in i subrutinen överhuvudtaget, så det är något som är lite "fiskigt".

Medlem sedan mars 20002 520 inlägg
#15

nä ddet förståss... men hur ska jag lägga in on error resume next i din kod (tillfälligt)?

Medlem sedan juni 200032 967 inlägg
#16

McD skrev:

men hur ska jag lägga in on error resume next i din kod (tillfälligt)?

Det är bara att lägga in överst.

Medlem sedan mars 20002 520 inlägg
#17

okie testar med det så länge så att det i alla fall funkar helt ut tillfälligt... tack anders för hjälpen!

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)