63688
Oct 01, 2008, updated at Dec 02, 2011 (UTC)
5095
16
0
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:
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
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!
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
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!
Please also mark the comments that contributed to the solution of the article
Content-Key: 98293
Url: https://administrator.de/contentid/98293
Printed on: April 24, 2024 at 08:04 o'clock
16 Comments
Latest comment
Servus,
ist zwar nicht so elegant, wie der Rest "deines" Scriptes, aber bevor du da noch 2 Stunden wartest...
edit.
"Datum" durch Date ersetzt.
Gruß
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
"Datum" durch Date ersetzt.
Gruß
servus,
vergleiche mein Beispiel
... oder ändere in den Zeilen 20 21 hinter %ziel& den Backslash.
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
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%
gegenif 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
Zitat von @63688:
Das Script ansich geht wohl leider nicht:
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ß
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ß
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ß
Hallo theTomte!
Ergänzt um die Behandlung der einzelnen Server-Ordner könnte das so aussehen:
Die Zeile 27 sollte beim Testen helfen, da damit Datei und Zielverzeichnis ausgegeben werden.
Grüße
bastla
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
Grüße
bastla
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:
Durch die Anführungszeichen hast Du eine genaue Kontrolle darüber, was in die Variable aufnommen wird.
Grüße
bastla
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"
...
Grüße
bastla
Hallo theTomte!
Ü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
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
Hallo theTomte!
Grüße
bastla
... 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
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