63688
Goto Top

Problem bei Datum auslesen und Ordner erstellen per batch

Ich finde irgendwie keinen passenden Titel...

Folgendes Problem:

ich lade per Batch von einem FTP mehrere Logdateien von verschiedenen Servern, entpacke diese in bestimmte Ordner.
Anschließend werden alle Dateien kleiner als 5 kb gelöscht.
Nun werden die Dateien nach Monat sortiert mit folgendem Code:

@echo off
for %%a in (*.log) do for /f %%d in ('echo %%~ta') do call :ProcessFile "%%a" %%d  
goto :eof
:ProcessFile
set Datum=%2
set Verz=%Datum:~-7,2%
if not exist %Verz% md %Verz%
copy %1 %Verz%>nul

Dann erstellt er mir Ordnernamen mit 01, 02 etc...

Nun möchte ich aber anstatt 01 den Namen, also Januar, als Ordnernamen etc...

Ich kenne mich zu wenig aus und such schon seit 2 Stunden, finde aber nix face-sad

Wäre super wenn einer helfen kann!

Weiterhin würde ich gerne die Batch Datei zum sortieren in einen "neutralen" Ordner legen und nicht in die Ordner mit den Log Dateien. Dazu müssten aber in dem obigen Skript die Pfade hinein. Da bräuchte ich auch Hilfe *g*

Vielen Dank schonmal!

Content-Key: 98293

Url: https://administrator.de/contentid/98293

Printed on: April 24, 2024 at 08:04 o'clock

Mitglied: 60730
60730 Oct 02, 2008 at 00:30:34 (UTC)
Goto Top
Servus,

ist zwar nicht so elegant, wie der Rest "deines" Scriptes, aber bevor du da noch 2 Stunden wartest...

@echo off
Set "Ziel=c:\test"  
for %%a in (*.log) do for /f %%d in ('echo %%~ta') do call :ProcessFile "%%a" %%d  
goto :eof
:ProcessFile
set Datum=%2
set V1=%Date:~-7,2%
if %V1%==01 set Monat=Januar
if %V1%==02 set Monat=Februar
if %V1%==03 set Monat=Maerz
if %V1%==04 set Monat=April
Rem usw - obwohl dann Alphabetisch der April der "1.ste" Unterordner wäre....   
if not exist %ziel&\%Monat% md %ziel&\%Monat%
copy %1 %ziel&\%Monat%>nul
edit.
"Datum" durch Date ersetzt.
Gruß
Mitglied: 63688
63688 Oct 02, 2008 at 00:55:03 (UTC)
Goto Top
Funktioniert leider nicht:

@echo off
Set "ziel=D:\counterstrike\Serverlogs\download\1\"  
for %%a in (*.log) do for /f %%d in ('echo %%~ta') do call :ProcessFile "%%a" %%d  
goto :eof
:ProcessFile
set Datum=%2
set V1=%Datum:~-7,2%
if %V1%==01 set Monat=Januar
if %V1%==02 set Monat=Februar
if %V1%==03 set Monat=Maerz
if %V1%==04 set Monat=April
if %V1%==05 set Monat=Mai
if %V1%==06 set Monat=Juni
if %V1%==07 set Monat=Juli
if %V1%==08 set Monat=August
if %V1%==09 set Monat=September
if %V1%==10 set Monat=Oktober
if %V1%==11 set Monat=November
if %V1%==12 set Monat=Dezember
if not exist %ziel&\%Monat% md %ziel&\%Monat%
copy %1 %ziel&\%Monat%>nul

Das April der erste Ordner wäre ist egal. Will bloß Namen anstatt Zahlen haben.

Naja das mit dem Script und Ordner habe ich wohl nicht richtig rübergebracht:
Ich hab den Ordner:

D:\counterstrike\Serverlogs\download\

Dort sind nochmal 17 Ordner drin, für 17 Server. Jetzt müsste ich ja in alle 17 Ordner dieses Script legen. Ich würds aber gerne in D:\counterstrike\Serverlogs\ legen und von dort starten.
Mitglied: 60730
60730 Oct 02, 2008 at 02:48:47 (UTC)
Goto Top
servus,

vergleiche mein Beispiel
Set "Ziel=c:\test"
mit deiner Zeile:
Set "ziel=D:\counterstrike\Serverlogs\download\1\"
Nimm den \ am ende raus und mache ein: (zum Testen) vor das @echo off.
... oder ändere in den Zeilen 20 21 hinter %ziel& den Backslash.

if not exist %ziel&\%Monat% md %ziel&\%Monat%
gegen
if not exist %ziel&%Monat% md %ziel&%Monat%

Ich würds aber gerne in D:\counterstrike\Serverlogs\ ....
naja ist dann auch nicht wirklich ein Problem, außer das ich vor einem Rechner sitze, auf dem das Script das ich dir "gezimmert" habe - gar nicht laufen kann.
Mehr oder weniger mußt du nur die Zeile mit dem Ziel mit einer weiteren Variablen füllen, die die Werte von 1 bis 17 hat.
..Oder das ganze gleich mit in die For Schleife, was dann doch um einiges eleganter ist.
Aber dafür ists dann doch zu spät.

Gruß & Gute Nacht
Mitglied: 63688
63688 Oct 02, 2008 at 11:44:18 (UTC)
Goto Top
Das Script ansich geht wohl leider nicht:

@echo off
Set "ziel=D:\counterstrike\Serverlogs\download\1"  
for %%a in (*.log) do for /f %%d in ('echo %%~ta') do call :ProcessFile "%%a" %%d  
goto :eof
:ProcessFile
set Datum=%2
set V1=%Datum:~-7,2%
if %V1%==01 set Monat=Januar
if %V1%==02 set Monat=Februar
if %V1%==03 set Monat=Maerz
if %V1%==04 set Monat=April
if %V1%==05 set Monat=Mai
if %V1%==06 set Monat=Juni
if %V1%==07 set Monat=Juli
if %V1%==08 set Monat=August
if %V1%==09 set Monat=September
if %V1%==10 set Monat=Oktober
if %V1%==11 set Monat=November
if %V1%==12 set Monat=Dezember
if not exist %ziel&\%Monat% md %ziel&\%Monat%
copy %1 %ziel&\%Monat%>nul
Mitglied: 60730
60730 Oct 02, 2008 at 12:07:03 (UTC)
Goto Top
Zitat von @63688:
Das Script ansich geht wohl leider nicht:

 @echo off
 Set "ziel=D:\counterstrike\Serverlogs\download\1"  
 for %%a in (*.log) do for /f %%d in ('echo %%~ta') do call :ProcessFile "%%a" %%d  
 goto :eof
 :ProcessFile
 rem set Datum=%2
 set V1=%Date:~-7,2%
 if %V1%==01 set Monat=Januar
 if %V1%==02 set Monat=Februar
 if %V1%==03 set Monat=Maerz
 if %V1%==04 set Monat=April
 if %V1%==05 set Monat=Mai
 if %V1%==06 set Monat=Juni
 if %V1%==07 set Monat=Juli
 if %V1%==08 set Monat=August
 if %V1%==09 set Monat=September
 if %V1%==10 set Monat=Oktober
 if %V1%==11 set Monat=November
 if %V1%==12 set Monat=Dezember
 if not exist %ziel&\%Monat% md %ziel&\%Monat%
 copy %1 %ziel&\%Monat%>nul
 

Servus,

ich hab "dein" Script mal um einen Fehler bereinigt.
Das kommt davon, wenn man nachts ungetestet an ehemaligen bastla scripten *gg* sitzt.
Gruß
Mitglied: 63688
63688 Oct 02, 2008 at 12:25:32 (UTC)
Goto Top
geht leider auch ned face-sad
Fenster schließt direkt wieder
Mitglied: 60730
60730 Oct 02, 2008 at 13:40:13 (UTC)
Goto Top
Servus,

ein ganz kleiner Tipp von mir:

@echo off ist hübsch und verhindert unötige Infos in der Dosbox.
Aber genau diese Infos sind zum debacken (debuggen ist ja zu hoch gegriffen) sehr hilfreich.
Wie gesagt, ab Zeile 7 sollte das Script funktionieren.
Mach halt mal eine Pause in jede Zeile und dann siehst du genauer, wo er zuletzt war.
ich hab grad wirklich weder Zeit noch Lust mir einen fake Counterstrikeordner mit logs anzulegen, um dir genau sagen zu können, wo der Bock liegt

Gruß
Mitglied: 63688
63688 Oct 04, 2008 at 00:06:07 (UTC)
Goto Top
Sorry, aber egal was ich mache, es geht einfach nicht. Kann mir vlt noch jemand helfen, bin echt am verzweifeln und leider der totale Anfänger beim scripten, also wäre echt nett wenn einer weiter weiss
Member: bastla
bastla Oct 04, 2008 at 16:27:41 (UTC)
Goto Top
Hallo theTomte!

Ergänzt um die Behandlung der einzelnen Server-Ordner könnte das so aussehen:
@echo off & setlocal
set "Basis=D:\counterstrike\Serverlogs\download"  

for /d %%i in ("%Basis%\*.*") do (  
    for %%a in ("%%i\*.log") do for /f %%d in ("%%~ta") do call :ProcessFile "%%a" %%d "%%i"  
)
goto :eof

:ProcessFile
set Datum=%2
set V1=%Datum:~-7,2%
if %V1%==01 set Monat=Januar
if %V1%==02 set Monat=Februar
if %V1%==03 set Monat=Maerz
if %V1%==04 set Monat=April
if %V1%==05 set Monat=Mai
if %V1%==06 set Monat=Juni
if %V1%==07 set Monat=Juli
if %V1%==08 set Monat=August
if %V1%==09 set Monat=September
if %V1%==10 set Monat=Oktober
if %V1%==11 set Monat=November
if %V1%==12 set Monat=Dezember

set "Verz=%~3\%Monat%"  
if not exist "%Verz%" md "%Verz%"  
echo %1 --^> %Verz%
copy %1 "%Verz%">nul  
goto :eof
Die Zeile 27 sollte beim Testen helfen, da damit Datei und Zielverzeichnis ausgegeben werden.

Grüße
bastla
Mitglied: 63688
63688 Oct 06, 2008 at 01:10:42 (UTC)
Goto Top
Super, riesen Dank an dich, klappt super!

edit: ich verstehs ned, hab die Datei nochmal neu angelegt und den exakten Code wie vorher kopiert und jetzt gehts wieder nicht...das Fenster schließt direkt wieder. Woran kann es liegen?
Ich führ vorher bereits andere Batch Dateien aus um die Logs vom FTP zu ziehen, zu entpacken und alle Logs unter 5 KB zu löschen.
Sollte aber egal sein, wenn ich den Code oben alleine ausführ, dann gehts auch ned. bzw nicht mehr
Member: bastla
bastla Oct 12, 2008 at 13:13:23 (UTC)
Goto Top
Hallo theTomte!

Wenn's nicht klappt, zunächst einmal aus dem "echo off" ein "echo on" machen und aus der Kommandozeile starten - so erhältst Du jeden Befehl zunächst einmal angezeigt (und zwar mit "aufgelösten" = durch den Inhalt ersetzten Variablen), was Dir ein Nachvollziehen des Ablaufes ermöglicht.

Eine mögliche Fehlerquelle wäre vielleicht, dass von der Forumssoftware am Ende der Zeile ein Leerzeichen angefügt wird, was zB in den "set"-Zeilen zu unerwünschten Ergebnissen führen kann, daher besser:
set "Datum=%2"  
set "V1=%Datum:~-7,2%"  
if "%V1%"=="01" set "Monat=Januar"  
...
Durch die Anführungszeichen hast Du eine genaue Kontrolle darüber, was in die Variable aufnommen wird.

Grüße
bastla
Mitglied: 63688
63688 Oct 12, 2008 at 13:31:20 (UTC)
Goto Top
Ich geh per cmd in den Ordner und tippe:

call test.bat

Vorher habe ich echo off in echo on geändert. Dann sagt mir die Kommandozeile:
Der Befehl "setlocalset" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Member: bastla
bastla Oct 12, 2008 at 15:42:26 (UTC)
Goto Top
Hallo theTomte!

Der Befehl "setlocalset" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Das würde bedeuten, dass die Zeilenschaltung nach dem "setlocal" fehlt - der folgende "set"-Befehl muss in die zweite Zeile.

Übrigens: Das "call" schadet zwar nicht, ist aber beim unmittelbaren Start von der Kommandozeile unnötig (und - soferne es nicht eine "test.com" oder "test.exe" im selben Ordner gibt - auch auf ".bat" kannst Du verzichten).

Grüße
bastla
Mitglied: 63688
63688 Oct 12, 2008 at 16:52:08 (UTC)
Goto Top
ich habe jetzt folgenden Code:

@Echo off & setlocal
set "Basis=D:\counterstrike\Serverlogs\download"  
for /d %%i in ("%Basis%\*.*") do (  
    for %%a in ("%%i\*.log") do for /f %%d in ("%%~ta") do call :ProcessFile "%%a" %%d "%%i"  
)
goto :eof
:ProcessFile
set "Datum=%2"  
set "V1=%Datum:~-7,2%"  
if "%V1%"=="01" set "Monat=Januar"  
if "%V1%"=="02" set "Monat=Februar"  
if "%V1%"=="03" set "Monat=Maerz"  
if "%V1%"=="04" set "Monat=April"  
if "%V1%"=="05" set "Monat=Mai"  
if "%V1%"=="06" set "Monat=Juni"  
if "%V1%"=="07" set "Monat=Juli"  
if "%V1%"=="08" set "Monat=August"  
if "%V1%"=="09" set "Monat=September"  
if "%V1%"=="10" set "Monat=Oktober"  
if "%V1%"=="11" set "Monat=November"  
if "%V1%"=="12" set "Monat=Dezember"  
set "Verz=%~3\%Monat%"  
if not exist "%Verz%" md "%Verz%"  
echo %1 --^> %Verz%
copy %1 "%Verz%">nul  
goto :eof

Leider geht das Script noch nicht. Sofern ich aufrufe, wird eine Datei erstellt, die 0 KB hat und nichts drin steht, Name ist: nulgoto

Aber das setlocalset kommt immernoch, obwohl der set befehl nun in der zweiten Zeile steht face-sad
Member: bastla
bastla Oct 12, 2008 at 17:34:12 (UTC)
Goto Top
Hallo theTomte!

... wird eine Datei erstellt, die 0 KB hat und nichts drin steht, Name ist: nulgoto
... was auf eine weitere fehlende Zeilenschaltung, diesmal nach Zeile 25, hinweist.

Aber das setlocalset kommt immernoch, obwohl der set befehl nun in der zweiten Zeile steht face-sad
Das kann ich nicht nachvollziehen - sowohl bei Verwendung von "in den Speicher kopieren" als auch über "Quelltext" und aus diesem Fenster heraus kopiert kommt Dein oben geposteter Batch bei mir mit der richtigen Zeilenaufteilung an. Welchen Editor verwendest Du denn?

Grüße
bastla
Mitglied: 63688
63688 Oct 12, 2008 at 17:54:09 (UTC)
Goto Top
Ich benutze Proton. Daran lags auch, habe gerade die Datei mit dem Windows Editor geöffnet und dort war der komplette Code in einer Zeile.

Habs jetzt geändert und jetzt geht alles. Riesen Dank an dich, hätt ich nie im Leben allein hinbekommen. THX