3 Batchfiles verstehen
Moin,
dritter Anlauf diese Frage zu schreiben (Einmal IE weg, anderes Mal Tab geschlossen -.-)
Ich habe 3 Batchfiles bekommen die bisher auf gewissen PCs im Einsatz sind. Diese wurden mir als Bespiel gegeben, da ich ein Batch schreiben soll das ähnliches können soll. Was diese allgemein Tun weiß ich, was diese im Script Schritt für Schritt machen, versteh ich so gut wie null.
Was tun die 3 Batches?
Eins legt meines Erachtens Time Jobs an (unter XP)
Die 2 anderen unterscheiden sich, tun aber auch irgendwo dasselbe (Fragt mich nicht).
Allgemein wird in einen Ordner gegangen in dem Fortlaufend eine XML Datei von einem Programm mit Werten gefüttert wird. Alle 2 Stunden geht eine Batch hin, nimmt sich die XML und zieht sie sich und verpackt sie.
Fürs Verständnis
Ich soll mit dem Beispiel dieser Batches ein Batch schreiben was (so geplant bisher) in die XML geht und die Werte der letzten Stunde nimmt und in eine neue XML schmeißt und diese sogleich verpackt.
Die Readme zu den Batches
These batches are a demo implementation for automatic file handling on the SCDI Plant-PC.
They should be installed at c:\program files\conergy\SCDIA\scdi batch and will process data in c:\SCDIA_DATA.
You should modify the install_timed_jobs.bat for your own needs and start it once, if you need automatic file handling.
The 'At' command therein will periodically start the zip_and delete.bat.
When adjusting the 'At' times, make sure not to hit the SCDIA file write time (e.g. 10:00, 10:15, 10:30, 10:45...), as then SCDIA will have problems writing the files.
Needs 7-zip to be installed.
For remote transfer of files, you need to install or configure a ftp server.
The batchs are build for english time and date format mm/dd/yyyy
Batch install_timed_jobs (Nennen wir es Batch1)
Batch zip_and_delete (Nennen wir es Batch2)
Batch zip_and_delete_all (Nennen wir es Batch3)
Würde mich freuen wenn die Scripte ein wenig verständlicher Aussehen (Auch einfacher) könnte oder einfach nur mir - nett wäre Zeile für Zeile - erklärt werden könnte.
Danke im Vorraus.
Gruß Zero
dritter Anlauf diese Frage zu schreiben (Einmal IE weg, anderes Mal Tab geschlossen -.-)
Ich habe 3 Batchfiles bekommen die bisher auf gewissen PCs im Einsatz sind. Diese wurden mir als Bespiel gegeben, da ich ein Batch schreiben soll das ähnliches können soll. Was diese allgemein Tun weiß ich, was diese im Script Schritt für Schritt machen, versteh ich so gut wie null.
Was tun die 3 Batches?
Eins legt meines Erachtens Time Jobs an (unter XP)
Die 2 anderen unterscheiden sich, tun aber auch irgendwo dasselbe (Fragt mich nicht).
Allgemein wird in einen Ordner gegangen in dem Fortlaufend eine XML Datei von einem Programm mit Werten gefüttert wird. Alle 2 Stunden geht eine Batch hin, nimmt sich die XML und zieht sie sich und verpackt sie.
Fürs Verständnis
Ich soll mit dem Beispiel dieser Batches ein Batch schreiben was (so geplant bisher) in die XML geht und die Werte der letzten Stunde nimmt und in eine neue XML schmeißt und diese sogleich verpackt.
Die Readme zu den Batches
These batches are a demo implementation for automatic file handling on the SCDI Plant-PC.
They should be installed at c:\program files\conergy\SCDIA\scdi batch and will process data in c:\SCDIA_DATA.
You should modify the install_timed_jobs.bat for your own needs and start it once, if you need automatic file handling.
The 'At' command therein will periodically start the zip_and delete.bat.
When adjusting the 'At' times, make sure not to hit the SCDIA file write time (e.g. 10:00, 10:15, 10:30, 10:45...), as then SCDIA will have problems writing the files.
Needs 7-zip to be installed.
For remote transfer of files, you need to install or configure a ftp server.
The batchs are build for english time and date format mm/dd/yyyy
Batch install_timed_jobs (Nennen wir es Batch1)
@echo off
rem install automatic scdi file handling
rem make sure to not hit a work-time slot of SCDIA (normally full hour, 15, 30, 45 mins past)
rem use this line for once-a-day-transfer
at 00:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete.bat" c:\scdia_data
rem add these lines for multiple transfers per day. Notice the different batch calls
at 06:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
at 08:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
at 10:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
at 12:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
at 14:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
at 16:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
at 18:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
at 20:10 /EVERY:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 cmd /c "%ProgramFiles%\conergy\scdia\scdi batch\zip_and_delete_all.bat" c:\scdia_data
rem to remove jobs, type "at /delete"
@echo off
rem called by "at" jobs
rem zips the past day's xml files in the directory and deletes them on success
rem needs date format mm/dd/yyyy
set scdia_out_directory=%1
if "%scdia_out_directory%" neq "" goto start
set scdia_out_directory=..
:start
if "%scdia_out_directory%" equ "" goto end
setlocal enableextensions
for /f "tokens=2-4 delims=/ " %%i in ('date /t') do set today=%%k_%%i_%%j
for %%T in (%scdia_out_directory%\*.xml) do (
if not %today% equ %%~nT (
rem process only files from past days
echo process %%~nT.xml
( ren "%%T" "%%~nT._xml" )
rem uses zip format
rem ( "%ProgramFiles%\7-zip\7z.exe" a -tzip "%scdia_out_directory%\%%~nT.zip" "%scdia_out_directory%\%%~nT._xml" && del "%scdia_out_directory%\%%~nT._xml" )
rem uses 7-zip format, half file size
( "%ProgramFiles%\7-zip\7z.exe" a "%scdia_out_directory%\%%~nT.7z" "%scdia_out_directory%\%%~nT._xml" && del "%scdia_out_directory%\%%~nT._xml" )
) else (
echo leaving alone %%~nT.xml
)
)
endlocal
:end
@echo off
rem called by "at" jobs
rem zips all xml files in the directory and deletes them on success
set scdia_out_directory=%1
if "%scdia_out_directory%" neq "" goto start
set scdia_out_directory=..
:start
if "%scdia_out_directory%" equ "" goto end
setlocal enableextensions
FOR /f "tokens=1-3 delims=: " %%G IN ('time /t') DO set timestring=%%G_%%H%%I
for %%F IN (%scdia_out_directory%\*.xml) DO ren "%%F" "%%~nF_%timestring%._xml"
rem uses zip format
rem for %%F IN (%scdia_out_directory%\*._xml) DO "%ProgramFiles%\7-zip\7z.exe" a -tzip "%scdia_out_directory%\%%~nF.zip" "%%F" && del "%%F"
rem uses 7-zip format, half the file size
for %%F IN (%scdia_out_directory%\*._xml) DO "%ProgramFiles%\7-zip\7z.exe" a "%scdia_out_directory%\%%~nF.7z" "%%F" && del "%%F"
endlocal
:end
Würde mich freuen wenn die Scripte ein wenig verständlicher Aussehen (Auch einfacher) könnte oder einfach nur mir - nett wäre Zeile für Zeile - erklärt werden könnte.
Danke im Vorraus.
Gruß Zero
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 189932
Url: https://administrator.de/contentid/189932
Ausgedruckt am: 24.11.2024 um 02:11 Uhr
30 Kommentare
Neuester Kommentar
Hallo Zero!
Gruß Dieter
dritter Anlauf diese Frage zu schreiben (Einmal IE weg, anderes Mal Tab geschlossen -.-)
Seit mir das am Anfang auch 2-3 passiert ist, schreibe ich meine Texte zuvor ganz entspannt in einem TexteditorGruß Dieter
Hallo Zero!
Nö, VBS kann ich nicht entdecken, aber das Erklären überlasse ich lieber den Batch-Profis...
Gruß Dieter
Nö, VBS kann ich nicht entdecken, aber das Erklären überlasse ich lieber den Batch-Profis...
Gruß Dieter
Zitat von @ColdZero89:
Moin,
ok danke, wunderte mich nur wegen diesem "setlocal" hab das bisher nur dann gesehen wenn VBS mit im Spiel war.
Moin,
ok danke, wunderte mich nur wegen diesem "setlocal" hab das bisher nur dann gesehen wenn VBS mit im Spiel war.
Setlocal ist schon seit W2K bei Batches möglich. Einfach mal in der Eingabeaufforderung
setlocal /?
Gruss Penny.
Moin,
Mal ganz ehrlich: meinst du wirklich du bekommst jetzt hier ~70 Batchcode Zeile für Zeile vorgekaut? Versuch's doch mal selbst, und wenn du zu einzelnen Befehlen/Zeilen konkrete Fragen hast dann stell sie hier.
lg,
Slainte
Mal ganz ehrlich: meinst du wirklich du bekommst jetzt hier ~70 Batchcode Zeile für Zeile vorgekaut? Versuch's doch mal selbst, und wenn du zu einzelnen Befehlen/Zeilen konkrete Fragen hast dann stell sie hier.
lg,
Slainte
Moin ColdZero89,
du musst es auch nicht Zeile für Zeile lesen oder mit der Uhrmacherlupe draufgucken.
Tritt bitte im der ersten Phase der Reinfummelns in die Thematik zwei Schritte zurück, glaub fest an das Gute im Menschen (der die Bätche zusammengeschrotet hat) und lies nur die Kommentare
Im Batch "Eins", der alles andere direkt oder über Bande startet, steht:
--> dieser Schnipsel richtet ein paar AT-Jobs ein (=AT-Jobs sind per Kommandozeile eingerichtete zeitgesteuerte Aufgaben, siehe AT/? am CMD)
--> und diese Jobs sollen möglichst dann starten, wenn die SCDIA-Applikation nicht beschäftigt ist. Und das ist sie im Viertelstunden-Takt.
Deshalb werden die AT-Jobs z.B. um 10 Minuten nach einer vollen Stunde eingerichtet.
Damit weisst du schonmal, was denn der Plan gewesen ist bzw was eigentlich passieren sollte beim Aufruf des Bätches.
Der Rest ist über die Hilfe am CMD-Prompt rauszubekommen (AT /?, Setlocal /? etc.)
Grüße
Biber
du musst es auch nicht Zeile für Zeile lesen oder mit der Uhrmacherlupe draufgucken.
Tritt bitte im der ersten Phase der Reinfummelns in die Thematik zwei Schritte zurück, glaub fest an das Gute im Menschen (der die Bätche zusammengeschrotet hat) und lies nur die Kommentare
Im Batch "Eins", der alles andere direkt oder über Bande startet, steht:
...
rem install automatic scdi file handling
rem make sure to not hit a work-time slot of SCDIA (normally full hour, 15, 30, 45 mins past
...
--> dieser Schnipsel richtet ein paar AT-Jobs ein (=AT-Jobs sind per Kommandozeile eingerichtete zeitgesteuerte Aufgaben, siehe AT/? am CMD)
--> und diese Jobs sollen möglichst dann starten, wenn die SCDIA-Applikation nicht beschäftigt ist. Und das ist sie im Viertelstunden-Takt.
Deshalb werden die AT-Jobs z.B. um 10 Minuten nach einer vollen Stunde eingerichtet.
Damit weisst du schonmal, was denn der Plan gewesen ist bzw was eigentlich passieren sollte beim Aufruf des Bätches.
Der Rest ist über die Hilfe am CMD-Prompt rauszubekommen (AT /?, Setlocal /? etc.)
Grüße
Biber
Biber hat's mir vorweg genommen:
Und dann gibt es auch Seiten wie diese auf denen man die Funktionsweise und den Syntax der einzelnen Befehle nachlesen kann.
Ansonsten gibts hier im Forum auch das ein oder andere sehr gute Batch-Tutorial.
lg,
Slainte
Der Rest ist über die Hilfe am CMD-Prompt rauszubekommen (AT /?, Setlocal /? etc.)
Und dann gibt es auch Seiten wie diese auf denen man die Funktionsweise und den Syntax der einzelnen Befehle nachlesen kann.
Ansonsten gibts hier im Forum auch das ein oder andere sehr gute Batch-Tutorial.
lg,
Slainte
... und wenn Du beim Nachforschen jeweils mit dem ersten Wort einer Zeile beginnst - etwa mit "
Wenn dieses erste Wort ein "
Grüße
bastla
if /?
" - hast Du auch gar keine so schlechte Chance, zB etwas über "neq
" oder "equ
" zu erfahren ... Wenn dieses erste Wort ein "
for
" sein sollte, kann ich wärmstens (nicht nur bei der aktuellen Wetterlage) friemlers Tutorial zur FOR-Schleife empfehlen ...Grüße
bastla
Hallo ColdZero89!
Zum "%%~nT"-Mysterium: Nicht immer wird %I als Schleifenvariable verwendet - hier ist es eben %T; dann gilt aber das, was Du in der Hilfe zu "
(dass in Batch die Laufvariablen der "
Die Variable %today% wird übrigens in Zeile 18 zusammengebaut - allerdings für ein englisches Datumsformat (und für W2000) - um ein Ergebnis der Form "JJJJ_MM_TT" zu erhalten, wäre
besser (siehe dazu "
Grüße
bastla
Zum "%%~nT"-Mysterium: Nicht immer wird %I als Schleifenvariable verwendet - hier ist es eben %T; dann gilt aber das, was Du in der Hilfe zu "
for
" (ziemlich am Ende) findest:%~nI - Erzeugt nur den Dateinamen von %I.
for
"-Schleife mit "%%
" geschrieben werden müssen, weißt Du ja sicher schon).Die Variable %today% wird übrigens in Zeile 18 zusammengebaut - allerdings für ein englisches Datumsformat (und für W2000) - um ein Ergebnis der Form "JJJJ_MM_TT" zu erhalten, wäre
set "today=%date:~-4%_%date:~-7,2%_%date:~-10,2%"
set /?
") ...Grüße
bastla
Hallo ColdZero89!
einbaust ...
Einfacher (aber nicht übersichtlicher) kommst Du an die Variablenwerte, indem Du im Batch eine Zeile
für alle Variablen oder zB
für alle mit "t" beginnenden Variablennamen einbaust ...
Grüße
bastla
aber allgemein wird ja das Datumsformat wie angegeben in Zeile 5 benötigt "rem needs date format mm/dd/yyyy"
Als Ausgangsformat ja - aber in %today% steht es dann doch als "YYYY_MM_DD"; das kannst Du aber ja ohnehin sehen, wenn Du den Batch mit "echo on
" anstatt "echo off
" ausführst, oder zB eine Zeileecho today=%today%
Einfacher (aber nicht übersichtlicher) kommst Du an die Variablenwerte, indem Du im Batch eine Zeile
set & pause
set t & pause
Grüße
bastla
Hallo ColdZero89!
Grüße
bastla
Die Variable F beinhaltet scheinbar das Datem und der Timestrnig enthält die Zeit
Nein; in %%F stehen der Reihe nach die .xml-Dateien, die dann umbenannt werden, indem (nur) der Timestamp dem Namen hinzugefügt wird (das Datum müsste also zu diesem Zeitpunkt bereits Teil des Dateinamens sein) ...Grüße
bastla
moin Zero,
bei ein klein wenig Aufklärung hilft Dir auch dieses Script (nicht nur beim Finden von Fehlern):
Batchcode erstellen - Fehler im Batch leichter finden
Gruß Phil
bei ein klein wenig Aufklärung hilft Dir auch dieses Script (nicht nur beim Finden von Fehlern):
Batchcode erstellen - Fehler im Batch leichter finden
Gruß Phil
Hallo ColdZero89!
Die zweite Zeile ist nötig, um das Leerzeichen am Anfang bei einstelligen Stunden zu entfernen bzw auf Wunsch auch mit
durch 0 zu ersetzen ...
oder
- damit wird der Typ automatisch übernommen ...
Noch ein Hinweis zum Testen: In vielen Fällen kannst Du eine Zeile auch direkt in CMD eingeben, um Dir den Ablauf anzusehen, wobei ein "
Zu beachten ist dabei, dass die Schleifenvariablen bei Direkteingabe nur mit einem Prozentzeichen zu schreiben sind (deswegen auch zB "
Grüße
bastla
wieso aber brauch man für die erste Schleife mit dem Timestring eine Schleife?
Da "time /t
" nun mal ein Befehl ist, brauchst Du die Schleife zum Abfangen und Zerlegen der Ausgabe - lässt sich allerdings auch über die Variable %time% machen:set "timestring=%time:~,2%_%time:~3,2%%time:~6,2%"
set "timestring=%timestring: ="%
set "timestring=%timestring: =0"%
Wieso nun aber in der Umbenennung der Datei der Hauptname über %%~nF aufgerufen wird, erschließt sich mir nicht.
Es soll ja der neue Name aus dem alten Namen + %timestring% gebildet werden - daher brauchst Du eben auch den alten Namen ohne Typ (.xml; wird ja am Ende noch hinzugefügt) - etwas besser wäre übrigensfor %%F in (%scdia_out_directory%\*.xml) DO ren "%%F" "%%~nF_%timestring%%%~xF"
for %%F in (%scdia_out_directory%\*.xml) DO ren "%%F" "%%~nF_%timestring%.*"
Noch ein Hinweis zum Testen: In vielen Fällen kannst Du eine Zeile auch direkt in CMD eingeben, um Dir den Ablauf anzusehen, wobei ein "
echo
" vor "gefährlichen" Befehlen dafür sorgt, dass diese nur angezeigt werden - hier zBfor %F in (%scdia_out_directory%\*.xml) DO @echo ren "%F" "%~nF_%timestring%%~xF"
%~nF
" und "%~xF
").Grüße
bastla
halli hallo hallöle,
Es ist die Frage wie Du die aktuelle Uhrezeit ermittelst.
Ich kenne einmal folgende Möglichkeit:
und zum anderen die Möglichkeit mittels TIME und danach die die Stunden, Minuten, Sekunden aufzudröseln.
Wobei die zweite Methode das Problem hat, daß bei deutscher Zeit die führende NULL nicht angezeigt wird.
Gruss Penny.
Es ist die Frage wie Du die aktuelle Uhrezeit ermittelst.
Ich kenne einmal folgende Möglichkeit:
FOR /F "tokens=*" %I IN ('TIME /T') DO Echo Es ist jetzt %I Uhr
Set HH=%TIME:~0,2%
Set MM=%TIME:~3,2%
Set SS=%TIME:~6,2%
Wobei die zweite Methode das Problem hat, daß bei deutscher Zeit die führende NULL nicht angezeigt wird.
Gruss Penny.
@Penny.Cilin
Schön langsam wird's hier unübersichtlich (sonst wäre Dir vermutlich mein Kommentar da oben aufgefallen ) ...
Grüße
bastla
Schön langsam wird's hier unübersichtlich (sonst wäre Dir vermutlich mein Kommentar da oben aufgefallen ) ...
Grüße
bastla
Hallo ColdZero89!
Grüße
bastla
Gibt es für %I einen Grund? oder ist das einfach nur so hingeschrieben für eventuelle Sekunden? (Ich weiß es sind 3 Tokens die durchlaufen, aber theoretisch müssten es doch nur 2 sein, oder seh ich das Falsch? Durch time /t wird doch nur 11:19 wiedergegeben und nicht noch Sekunden.
Die 3 Tokens beziehen sich vermutlich auf eine Zeitangabe der Art "11:19 AM" - ansonsten hast Du recht, dass es eigentlich nur Tokens für Stunde und Minute bräuchte (die Variable "%time%" bietet im Gegensatz dazu sogar Hundertstelsekunden) ...Grüße
bastla