coldzero89
Goto Top

For-Schleife dreht eine runde zuviel

Moin,

ich habe eine Script in dem auf einem IN Ordner die vorhandene XML in den OUT Ordner geschoben wird. Diese wird dann mit einer Schleife mit einem Timestring im Namen versehen und danach in den Backup Ordner kopiert.

Es liegt immer nur eine Datei im IN Ordner und eine Datei im OUT Ordner

Name im IN Ordner: 2012_09_04.xml
Name im OUT Ordner mit Timestring: 2012_09_04_11_40.xml

Die Schleife die den Timestring anhängt dreht manchmal 2 Runden, anstatt nur einer und ließt die schon umbenannte Datei erneut ein und versieht sie mit dem selben Timestring

Name im OUT Ordner mit Timestring und erneutem lauf der Schleife: 2012_09_04_11_40_11_40.xml

Das Script:
@echo off

rem called by "at" jobs  
rem Verschiebt XMLs von scdia_dada-Ordner nach Out-Ordner, kopie in Backup-Ordner und versieht den Namen mit einem Timestamp

rem deklarierung
rem Ordner wird vom Timejob übergeben und mit %1 abgefangen
set scdia_in_directory=%1
set scdia_backup_directory=c:\scdia_backup
set scdia_out_directory=c:\scdia_out

del /Q %scdia_out_directory%\*.7z

rem Wenn scdia_in_directory nicht leer ist, geh zum Programmpunkt Start
if "%scdia_in_directory%" neq "" goto start  

:start

rem Wenn scdia_in_directory leer ist, geh zum Programmpunkt Ende
if "%scdia_in_directory%" equ "" goto end  

rem Verschiebt alle XML-Dateien im IN-Directory ins OUT-Directory
move %scdia_in_directory%\*.xml %scdia_out_directory%\

setlocal enableextensions

rem Lässt sich die Zeit anzeigen und verpackt diese in Variable
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"  

copy %scdia_out_directory%\*.xml %scdia_backup_directory%

rem Zippen der XML Datei mit anschließendem löschen
for %%F IN (%scdia_out_directory%\*.xml) DO "%ProgramFiles%\7-zip\7z.exe" a "%scdia_out_directory%\%%~nF.7z" "%%F" && del "%%F"  

endlocal

:end

Meine Frage ist nun: Wieso dreht die Schleife aus Zeile 30 manchmal 2 Runden und benennt die eben umbenannte Datei gleich erneut um?
Das Phänomen trifft mal auf und mal nicht, also nach keinem Muster.

Danke im Voraus.

Gruß Zero

Content-ID: 190674

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

Ausgedruckt am: 24.11.2024 um 02:11 Uhr

facebraker
facebraker 04.09.2012 um 11:58:12 Uhr
Goto Top
WOW sehr schön dokumentierter Code!

Warum machst du das nicht in einer Schleife

Semicode:
For Dateien in Folder

Umbennenen
Umkopieren
Löschen

next Dateien

Das würde ich erst einmal als Fehlerquelle ausschliessen, weil einen anderen Fehler kann ich nicht finden.

Gruß Alex
60730
60730 04.09.2012 aktualisiert um 12:05:37 Uhr
Goto Top
Moin,

Schau dir mal ein howto an, das sowas wie echo off als titel hat und befolge die tipps.

Und dann, was macht denn zeile 14ff?
Oder was denkst du, soll das machen?

In if not exist quelle\.xml ist wohl das was du willst und dachtest, dein if variable not leer waere das gleiche.
Isses aber garnicht.

Genauso zeile 20.

Und zeile 30, warum ist das kein for /r oder ein /f mit nem dir ????_??_??.xml ?

Denn damit wuerdest du nur die finden, die dem gewuenschten. Muster entsprechen.


Gruss

Edit @alex,
Doch doch das sind ein paar versteckte ganz offensichtlich drin, die erkennt mein interpreterr sogar bei 39grad fieber.
ColdZero89
ColdZero89 04.09.2012 um 12:05:02 Uhr
Goto Top
Moin,

danke für die Blumen, das hab ich tatsächlich noch in der Schule gelernt das sowas Sinnvoll ist.


Wäre ne möglichkeit, dies alles in EINE Schleife zu packen, ich wollte es aber aufgespaltet Zeile für Zeile haben - sorgt in meinen Augen für bessere übersicht. Code wird dadurch zwar ein wenig länger, aber ist übersichtlicher. Da man so aber sichergehen kann, das die umbenannte Datei auch wirklich weg ist, wäre das natürlich Sinvoll. An sich aber keine schlechte Idee. Wede mal eine Kopie des Codes basteln mit deiner Idee und diese einem Testlauf unterziehen.

Gruß
ColdZero89
ColdZero89 04.09.2012 um 12:07:44 Uhr
Goto Top
Moin Timo,

gut ich hab deine Fragen nun NULL verstanden, auch nicht was du mit mitteilen willst.

Als info: Es gibt IMMER nur XML Datein die folgendermaßen aussehen JAHR_MONAT_TAG und nach Umbenennung JAHR_MONAT_TAG_STUNDE_MINUTE kein anderes Format.

Gruß Zero
facebraker
facebraker 04.09.2012 aktualisiert um 12:11:39 Uhr
Goto Top
Bedenke den Kommentar von TimoBeil, Zeile 15 & 20 sind wirklich unsinnig.

@timobeil, Asche auf mein Haupt, ich habe mir nur die Schleife angesehen, bin ich nicht so fit in Windows - Shell. Wenn dann BASH oder ich nehme gleich VB.NET face-confused
Aber du hast recht 15 & 20 ist mind. 1 Zeile überflüssig.

Deine XML frage habe ich auch nicht verstanden.


Gruß Alex
60730
60730 04.09.2012 aktualisiert um 12:13:05 Uhr
Goto Top
Zitat von @ColdZero89:
Moin Timo,

gut ich hab deine Fragen nun NULL verstanden, auch nicht was du mit mitteilen willst.

Als info: Es gibt IMMER nur XML Datein die folgendermaßen aussehen JAHR_MONAT_TAG und nach Umbenennung


Gib doch mal dieses dir mit den fragezeichen so ein, woe es da oben steht, am besten im ordner womsowohl als auch xml dateien sind.
Wobei das allerletzte ? Tatsaexhlich ein satzzeichen ist und nix mit dem platzhalter fuer den dir befehl zu tun hat.....

Welche findet der und welche findet der nicht?

JAHR_MONAT_TAG_STUNDE_MINUTE kein anderes Format.
Und genau diese werden da oben garnixht gefunden, ergo auch nicht durch die whleife genudelt.

Mea culpa, aber ipad, fieber ist alles etwas schwerer, denk mal nach, was ich dir durch die blume an tipps gebe, du sollstnja auch was davon haben.


Gruß Zero
ColdZero89
ColdZero89 04.09.2012 aktualisiert um 12:22:47 Uhr
Goto Top
Moin,

das mit Zeile 15 und 20 - ja eine sicherlich, aber ka wieso ich das gemacht hab, fragt mich net bissl her.

@timobeil: Wieso sollte er die nicht finden?! *.xml schließt alle xml datein ein die im Ordner vorhanden sind. Oder versteh ich dich wieder nur halb bis gar nicht?

Ich meine der Verlauf der Schleife sieht doch wie folgt aus:
Lese *.xml ein (Eine Datei vorhanden 2012_09_04.xml) bennene 2012_09_04.xml um in 2012_09_04_12_10 SCHLEIFE ZU ENDE

Die Schleife KANN die Datei mit ZEIT noch gar nicht eingelesen umbenannt oder sonstwas getan haben da sie beim EINLESEN gar nicht EXISTIERT.

Mir geht es ja weniger darum das script nun auf mängel oder verbesserungen hin zu verpacken (auch wenn ich diese gerne aufnehme und bei gegebener Zeit umsetze) mir geht es um den verlauf diese EINEN schleife wieso diese eine Datei einließt, die zum einlesezeitpunkt noch gar nicht vorhanden sein kann.... vorallem da er sie nicht kopiert o.ä. sondern umbenennt.
Den verlauf dieser schleife wieso sie das tut - den würd ich gern kapieren


Denke aber das durch den Tipp von Face das Problem schon behaben sein könnte, da die Datei nicht mehr existiert, bevor er zum anfang der schleife springen könnte.

Umbennenen -> Kopieren -> Verpacken -> XML löschen -> Schleife schaut ins leere und findet keine XML mehr.

Gruß zero
60730
60730 04.09.2012 um 12:26:24 Uhr
Goto Top
der alte mann und seine Demo

E:\demo>echo xyz>2012_09_04.xml

E:\demo>echo xyz>2012_09_04_11_40.xml

E:\demo>dir
 Datenträger in Laufwerk E: ist Volume

 Verzeichnis von E:\demo

04.09.2012  12:22    <DIR>          .
04.09.2012  12:22    <DIR>          ..
04.09.2012  12:22                 5 2012_09_04.xml
04.09.2012  12:22                 5 2012_09_04_11_40.xml
               2 Datei(en)             10 Bytes
               2 Verzeichnis(se),  5.203.779.584 Bytes frei

E:\demo>dir
 Datenträger in Laufwerk E: ist Volume

 Verzeichnis von E:\demo

04.09.2012  12:22    <DIR>          .
04.09.2012  12:22    <DIR>          ..
04.09.2012  12:22                 5 2012_09_04.xml
04.09.2012  12:22                 5 2012_09_04_11_40.xml
               2 Datei(en)             10 Bytes
               2 Verzeichnis(se),  5.203.779.584 Bytes frei

E:\demo>dir ????_??_??.xml
 Datenträger in Laufwerk E: ist Volume

 Verzeichnis von E:\demo

04.09.2012  12:22                 5 2012_09_04.xml
               1 Datei(en)              5 Bytes
               0 Verzeichnis(se),  5.203.779.584 Bytes frei

E:\demo>

ergo?

E:\demo>for /f %a in ('dir /b ????_??_??.xml') do echo %a

E:\demo>echo 2012_09_04.xml
2012_09_04.xml

Wo taucht da die bereits unbemannte Datei auf?

Gruss
ColdZero89
ColdZero89 04.09.2012 aktualisiert um 12:33:23 Uhr
Goto Top
Moin,


AH nun is mir meine lampe aufgeganngen. Herrjeh, klar. Die Datein haben immer ein festes Muster und können somit fest nach dem muster abgefragt werden. Da hät ich auch drauf kommen können, ich hab nur irgendwie zu Kompliziert gedacht... Ich wollte halt verstehen wieso sie das tut, anstatt das Problem einfach zu beseitigen.

Danke. Ich hab nur net ganz verstanden was du mit den ? von mir willst face-smile nun hab ich aber verstanden was du von mir wolltest und versteh auch deinen ersten Post.

Gruß Zero
facebraker
facebraker 04.09.2012 um 12:36:43 Uhr
Goto Top
Abschliessende Fragen: funktioniert es? Arbeitest du mit 1 oder 2 Schleifen!

Gruß Alex

@timobeil ... cool alles mit dem iPad ... face-wink Gute Besserung!
ColdZero89
ColdZero89 04.09.2012 um 12:40:57 Uhr
Goto Top
Moin Face,

ich änder nun erstmal das konstrukt nach Timo um damit das Problem WEG ist. Werde aber auf meinem PC (Das batch läuft far far Away) das Batch so umbasteln das es mit einer schleife laufen kann.

Ob ich das dann in Far Far Away einsetze oder nicht weiß ich nicht, werde es aber auf jedenfall basteln.

Gruß Zero
60730
60730 04.09.2012 um 12:45:21 Uhr
Goto Top
salve,

a) nein der alte mann hat sein schlepperltopf ausgepackt
b) auch nein - selbst wenn es einen Interpreter treffen wurde, der ein setlocal enableextensions brauchen würde...

  • Wie oft würde der dann in der Schleife Time /t auswerten?

Und dann - ohne ein If exist programpfad 7zip würde ich den rest auch nicht per && lösen wollen...
(warum - da kommt ihr selber drauf)

Gruß
ColdZero89
ColdZero89 04.09.2012 aktualisiert um 12:48:32 Uhr
Goto Top
Moin Timo,

auf den Geräten auf denen das Zukünftig überall laufen soll ist 7zip standardmäßig installiert und vorhanden. Somit habe ich die Prüfung ob das Programm oder der pfad überhaupt existiert weggelassen.
Ich WEIß es ist da und das zu 100%, es gehört zur Standardsoftware dieses Gerätes mit dem es an uns ausgeliefert wird.

Grüßle Zero
ColdZero89
ColdZero89 04.09.2012 aktualisiert um 15:34:38 Uhr
Goto Top
Moin,

@facebraker siehe
@echo off

rem called by "at" jobs  
rem Verschiebt XMLs von scdia_dada-Ordner nach Out-Ordner, kopie in Backup-Ordner und versieht den Namen mit einem Timestamp

rem deklarierung
rem Ordner wird vom Timejob übergeben und mit %1 abgefangen
set scdia_in_directory=%1
set scdia_backup_directory=c:\scdia_backup
set scdia_out_directory=c:\scdia_out

del /Q %scdia_out_directory%\*.7z

rem Wenn scdia_in_directory nicht leer ist, geh zum Programmpunkt Start
if "%scdia_in_directory%" neq "" goto start  

:start

rem Verschiebt alle XML-Dateien im IN-Directory ins OUT-Directory
move %scdia_in_directory%\*.xml %scdia_out_directory%\

setlocal enableextensions

rem Lässt sich die Zeit anzeigen und verpackt diese in Variable
FOR /f "tokens=1-3 delims=: " %%G IN ('time /t') DO set timestring=%%G_%%H%%I  

rem Verarbeitet mehrere befehle in einer Schleife. 
rem Umbenennen der Date mit Timestring, kopieren der XML ins Backup, zippen der XML und löschen der XML
for %%F IN (%scdia_out_directory%\????_??_??.xml)  DO (
	ren "%%F" "%%~nF_%timestring%%%~xF"   
	copy "%scdia_out_directory%\????_??_??_??_??.xml" "%scdia_backup_directory%"  
	for %%G IN (%scdia_out_directory%\????_??_??_??_??.xml) DO ("%ProgramFiles%\7-zip\7z.exe" a "%scdia_out_directory%\%%~nG.7z" "%%G")  
	del /Q %scdia_out_directory%\????_??_??_??_??.xml
	)

endlocal

:end

Ich musste eine Schleife in der Schleife machen, da ja nun die umbenannte XML gezippt werden sollte.

Funktioniert einwandfrei und nun auch eindeutig Fehlerfrei.

Gruß Zero
facebraker
facebraker 04.09.2012 um 15:43:58 Uhr
Goto Top
Schaue ich mir heut Abend an!

Gruß Alex
Lochkartenstanzer
Lochkartenstanzer 04.09.2012 aktualisiert um 18:36:19 Uhr
Goto Top
Zitat von @ColdZero89:
Ich WEIß es ist da und das zu 100%, es gehört zur Standardsoftware dieses Gerätes mit dem es an uns ausgeliefert
wird.


... sagte der Kraftwerksingenieur, als im der Kessel um die Ohren flog. face-smile


Auch wenn DU das weißt, heißt das noch lange nicht, daß in gefühlt hundert Jahren, wenn keiner mehr weiß, was die Voraussetzungen für Dein skript waren, es noch dein Nachfolger weiß. Solche Skripte leben länger als man glaubt.

Ich bin letztens wieder üebr ein Skript gestolpert, daß ganz banale Sachen macht und schon seit NT3.51 auf diversen Servern sei Dasein fristet und inzwischen sogar unter W2K8 läuft, bis auf Pfadanpassungen unverändert. Ich hatte aber schon Schwierigkeiten, mich da wieder reinzudenken.

Also, programmier ordentlich und sieh das Unvorhersehbare vor! Dann hast Du auch in hundert Jahren noch deine Freude dran. face-smile

lks
60730
60730 04.09.2012 aktualisiert um 18:38:56 Uhr
Goto Top
Schnuckis.....

15. if "%scdia_in_directory%" neq "" goto start
16.
17. :start

Wenn %1 "leer" ist - warum dann nicht gleich %1 abfragen?
Und wenn Zeile 15 in die Grütze greift, welche Ziffer ist höher und wie läuft eine Batch üblicherweise ab?

Oder kürzer?

1 if egal was hier steht = waswasichdenn goto start
2 :start


Und was macht mir ein
setlocal enableextensions
Wenn ich danach überhaupt keinen Errorlevel abfrage, ob der Befehl überhaupt akzeptiert wird?

Da kann ich auch ein
@echo off>null 2>nul
malen - bringt genausoviel.
ColdZero89
ColdZero89 07.09.2012 um 11:20:33 Uhr
Goto Top
Moin,

ich weiß was du meinst Limbo, ich hab das batch aber in einer kleineren Form bekommen und sollte es erweitern. Da es vorher funktioniert hat, habe ich an dem Gerüst nichts verändert nur hinzugefügt.

An sich hast aber recht face-smile
Sofern die Zeit da ist, sollte ich mich damit nochmal beschäftigen und dies ein wenig aufbröseln und verbessern.

Eventuell fällt mir nicht alles ein:

Was für Verbesserungen würdet ihr noch vornehmen.
(Mir gehts nun net um Quelltext sondern nur stupser in Richtung A und Richtung B nach denen ich, sollte ich es nicht kennen oder noch nie mit gearbeitet haben suchen kann und mein wissen aufbauen kann)

Gruß Zero