Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

For-Schleife dreht eine runde zuviel

Frage Entwicklung Batch & Shell

Mitglied: ColdZero89

ColdZero89 (Level 1) - Jetzt verbinden

04.09.2012, aktualisiert 11:51 Uhr, 2954 Aufrufe, 18 Kommentare

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:
01.
@echo off 
02.
 
03.
rem called by "at" jobs 
04.
rem Verschiebt XMLs von scdia_dada-Ordner nach Out-Ordner, kopie in Backup-Ordner und versieht den Namen mit einem Timestamp 
05.
 
06.
rem deklarierung 
07.
rem Ordner wird vom Timejob übergeben und mit %1 abgefangen 
08.
set scdia_in_directory=%1 
09.
set scdia_backup_directory=c:\scdia_backup 
10.
set scdia_out_directory=c:\scdia_out 
11.
 
12.
del /Q %scdia_out_directory%\*.7z 
13.
 
14.
rem Wenn scdia_in_directory nicht leer ist, geh zum Programmpunkt Start 
15.
if "%scdia_in_directory%" neq "" goto start 
16.
 
17.
:start 
18.
 
19.
rem Wenn scdia_in_directory leer ist, geh zum Programmpunkt Ende 
20.
if "%scdia_in_directory%" equ "" goto end 
21.
 
22.
rem Verschiebt alle XML-Dateien im IN-Directory ins OUT-Directory 
23.
move %scdia_in_directory%\*.xml %scdia_out_directory%\ 
24.
 
25.
setlocal enableextensions 
26.
 
27.
rem Lässt sich die Zeit anzeigen und verpackt diese in Variable 
28.
FOR /f "tokens=1-3 delims=: " %%G IN ('time /t') DO set timestring=%%G_%%H%%I 
29.
 
30.
for %%F IN (%scdia_out_directory%\*.xml)  DO ren "%%F" "%%~nF_%timestring%.xml" 
31.
 
32.
copy %scdia_out_directory%\*.xml %scdia_backup_directory% 
33.
 
34.
rem Zippen der XML Datei mit anschließendem löschen 
35.
for %%F IN (%scdia_out_directory%\*.xml) DO "%ProgramFiles%\7-zip\7z.exe" a "%scdia_out_directory%\%%~nF.7z" "%%F" && del "%%F" 
36.
 
37.
endlocal 
38.
 
39.
: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
Mitglied: facebraker
04.09.2012 um 11:58 Uhr
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
Bitte warten ..
Mitglied: 60730
04.09.2012, aktualisiert um 12:05 Uhr
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.
Bitte warten ..
Mitglied: ColdZero89
04.09.2012 um 12:05 Uhr
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ß
Bitte warten ..
Mitglied: ColdZero89
04.09.2012 um 12:07 Uhr
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
Bitte warten ..
Mitglied: facebraker
04.09.2012, aktualisiert um 12:11 Uhr
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
Aber du hast recht 15 & 20 ist mind. 1 Zeile überflüssig.

Deine XML frage habe ich auch nicht verstanden.


Gruß Alex
Bitte warten ..
Mitglied: 60730
04.09.2012, aktualisiert um 12:13 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
04.09.2012, aktualisiert um 12:22 Uhr
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
Bitte warten ..
Mitglied: 60730
04.09.2012 um 12:26 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
04.09.2012, aktualisiert um 12:33 Uhr
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 nun hab ich aber verstanden was du von mir wolltest und versteh auch deinen ersten Post.

Gruß Zero
Bitte warten ..
Mitglied: facebraker
04.09.2012 um 12:36 Uhr
Abschliessende Fragen: funktioniert es? Arbeitest du mit 1 oder 2 Schleifen!

Gruß Alex

@TimoBeil ... cool alles mit dem iPad ... Gute Besserung!
Bitte warten ..
Mitglied: ColdZero89
04.09.2012 um 12:40 Uhr
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
Bitte warten ..
Mitglied: 60730
04.09.2012 um 12:45 Uhr
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ß
Bitte warten ..
Mitglied: ColdZero89
04.09.2012, aktualisiert um 12:48 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
04.09.2012, aktualisiert um 15:34 Uhr
Moin,

@facebraker siehe
01.
@echo off 
02.
 
03.
rem called by "at" jobs 
04.
rem Verschiebt XMLs von scdia_dada-Ordner nach Out-Ordner, kopie in Backup-Ordner und versieht den Namen mit einem Timestamp 
05.
 
06.
rem deklarierung 
07.
rem Ordner wird vom Timejob übergeben und mit %1 abgefangen 
08.
set scdia_in_directory=%1 
09.
set scdia_backup_directory=c:\scdia_backup 
10.
set scdia_out_directory=c:\scdia_out 
11.
 
12.
del /Q %scdia_out_directory%\*.7z 
13.
 
14.
rem Wenn scdia_in_directory nicht leer ist, geh zum Programmpunkt Start 
15.
if "%scdia_in_directory%" neq "" goto start 
16.
 
17.
:start 
18.
 
19.
rem Verschiebt alle XML-Dateien im IN-Directory ins OUT-Directory 
20.
move %scdia_in_directory%\*.xml %scdia_out_directory%\ 
21.
 
22.
setlocal enableextensions 
23.
 
24.
rem Lässt sich die Zeit anzeigen und verpackt diese in Variable 
25.
FOR /f "tokens=1-3 delims=: " %%G IN ('time /t') DO set timestring=%%G_%%H%%I 
26.
 
27.
rem Verarbeitet mehrere befehle in einer Schleife.  
28.
rem Umbenennen der Date mit Timestring, kopieren der XML ins Backup, zippen der XML und löschen der XML 
29.
for %%F IN (%scdia_out_directory%\????_??_??.xml)  DO ( 
30.
	ren "%%F" "%%~nF_%timestring%%%~xF"  
31.
	copy "%scdia_out_directory%\????_??_??_??_??.xml" "%scdia_backup_directory%" 
32.
	for %%G IN (%scdia_out_directory%\????_??_??_??_??.xml) DO ("%ProgramFiles%\7-zip\7z.exe" a "%scdia_out_directory%\%%~nG.7z" "%%G") 
33.
	del /Q %scdia_out_directory%\????_??_??_??_??.xml 
34.
35.
 
36.
endlocal 
37.
 
38.
: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
Bitte warten ..
Mitglied: facebraker
04.09.2012 um 15:43 Uhr
Schaue ich mir heut Abend an!

Gruß Alex
Bitte warten ..
Mitglied: Lochkartenstanzer
04.09.2012, aktualisiert um 18:36 Uhr
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.


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.

lks
Bitte warten ..
Mitglied: 60730
04.09.2012, aktualisiert um 18:38 Uhr
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.
Bitte warten ..
Mitglied: ColdZero89
07.09.2012 um 11:20 Uhr
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
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (15)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...