Top-Themen

Aktuelle Themen (A bis Z)

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 Schleife in Batch-Datei funktioniert nicht wie gewollt, bitte um Hilfestellung

Mitglied: panguu

panguu (Level 2) - Jetzt verbinden

09.10.2013 um 13:23 Uhr, 2460 Aufrufe, 11 Kommentare

Hallo miteinander,

ich verwende in einer Batch-Datei folgendes Schleifenkonstrukt:

:improcess
If Exist D:\test\*.pdf (
for %%f in ("D:\test\*.pdf") DO (
convert_program -option1 -option2 "%%f" D:\test\%date:~-2,2%%date:~-7,2%%date:~-10,2%_%time:~-11,2%%time:~-8,2%%time:~-5,2%%time:~-2,2%.tiff
)
)

Das bewirkt folgendes: es prüft das Verzeichnis D:\test auf vorhandene PDF-Dateien und falls dort welche vorhanden sind, werden diese mit einem extra Konvertierungsprogramm nach TIFF umgewandelt. Dabei generiere ich einen Dateinamen nach folgendem Schema:

131009_13184533.tiff

13 = aktuelles Jahr
10 = aktueller Monat
09 = heutiger Tag

13 = Uhrzeit/Stunden
18 = Uhrzeit/Minuten
45 = Uhrzeit/Sekunden
33 = Uhrzeit/Millisekunden

Ich habe die Millisekunden extra mitaufgenommen, weil ich verhindern wollte, dass Duplikate entstehen können. Aber das Problem ist, dass diese Schleife für alle generierten .TIFF Dateien dieselben Zeiten verwendet. Wenn ich z.B. in D:\test drei PDF-Dateien namens test1.pdf test2.pdf und test3.pdf liegen habe, dann generiert diese Schleife folgenden Output

131009_13213345.tiff

und zwar für alle 3 Dateien. Ich weiß das weil ich noch einen Zähler zum Testen genutzt habe und noch an den Dateinamen angefügt habe. Die %time% Variable scheint aber nur 1x eingelesen zu werden von der Schleife. Wie kann ich das verhindern und abändern, so daß Dateien entstehen nach diesem Muster:

131009_13213511.tiff (also um 13:21 Uhr und 35 Sekunden und 11 Millisekunden)
131009_13213869.tiff (also um 13:21 Uhr und 38 Sekunden und 69 Millisekunden)
131009_13214822.tiff (also um 13:21 Uhr und 48 Sekunden und 22 Millisekunden)

Bin für jeden Tip sehr dankbar.
Mitglied: bastla
09.10.2013 um 16:54 Uhr
Hallo panguu!

Vorweg: (Batch-) Code liest sich besser mit passender Formatierung ...

Dein Stichwort wäre "delayedExpansion" - ungetestet etwa:
Die Prüfung per
kannst Du Dir sparen, da der "do"-Teil der Schleife ohnehin nur für vorhandene PDF-Dateien ausgeführt wird ...

Grüße
bastla
Bitte warten ..
Mitglied: panguu
09.10.2013 um 16:59 Uhr
Hallo bastla,

leider funktioniert's auch mit "setlocal enabledelayedexpansion" nicht noch 'ne andre Idee?
Bitte warten ..
Mitglied: bastla
09.10.2013, aktualisiert um 17:10 Uhr
Hallo panguu!

Was verstehst Du unter "funktioniert nicht"? Die Timestamps für die tiff-Dateinamen sollten auf jeden Fall passend erstellt werden ...

Anyhow - Du kannst es auch mit dieser Zeile (als Ersatz für die Zeilen 3 bis 5) versuchen:
Grüße
bastla
Bitte warten ..
Mitglied: panguu
09.10.2013 um 17:21 Uhr
Auch mit "call" funktioniert es nicht. Schau mal, ich hänge im Dateinamen am Ende noch eine Ziffer mitdran, das ist ein ganz normaler Zähler.

Meine generierten Dateinamen lauten dann:

131009_17164533_1.tiff
131009_17164533_2.tiff
131009_17164533_3.tiff
131009_17164533_4.tiff

Verstehst du was ich nun meine?
Bitte warten ..
Mitglied: bastla
09.10.2013, aktualisiert um 17:48 Uhr
Hallo panguu!

Kann ich trotzdem nicht nachvollziehen - bei mir sieht das so aus:
Du könntest es noch mit einem Unterprogramm versuchen:
Grüße
bastla
Bitte warten ..
Mitglied: panguu
10.10.2013 um 10:01 Uhr
dein oberes Beispiel funktioniert nur deswegen, weil du auch
verwendet hast. Wenn du das auskommentierst, dann wirst du dasselbe Ergebnis wie ich erhalten.

Also könnte ich durch diesen kleinen Workaround-Trick mit dem ping Befehl eine kleine Zeitverzögerung einbauen, das würde klappen, ja.
Danke dir hierfür. Auch wenn dadurch mein Problem behoben wurde, würde mich ordnungshalber trotzdem interessieren, warum das so innerhalb der Schleife abgearbeitet wird (also in einem Stück, zur exakt derselben Zeit).

Kennt ihr vielleicht noch eine elegantere/saubere Lösung zu diesem Phänomen?

Bastla, den unteren Teil habe ich mir jetzt gar nicht erst angeschaut mit den Unterprogrammen, da das obere ja bereits funktioniert hat. Trotzdem auch hierfür danke.

Grüße,
Pangu
Bitte warten ..
Mitglied: bastla
10.10.2013 um 10:20 Uhr
Hallo panguu!
Wenn du das auskommentierst, dann wirst du dasselbe Ergebnis wie ich erhalten.
Mit dem "ping" wird ja nur die Zeit für den Programmablauf simuliert (der "Aufruf" besteht in meinem Beispiel ja nur aus einem "echo" und davon gehen sich in einer Hundertstelsekunde einige aus), um zeigen zu können, dass die Timestamp-Erstellung innerhalb der Schleife sehr wohl unterschiedliche Werte (Zeiten) ergibt.
warum das so innerhalb der Schleife abgearbeitet wird (also in einem Stück, zur exakt derselben Zeit).
In einem Stück abgearbeitet wird nur die Variablenauflösung (wenn nicht "delayed" wird). Vermutlich ist einfach Dein Programm sehr schnell ...

Grüße
bastla
Bitte warten ..
Mitglied: panguu
10.10.2013 um 11:06 Uhr
Hallo bastla, ich hab gerade noch etwas herumexperimentiert. Wenn ich deinen obigen Code
betrachte, dann habe ich festgestellt, daß du statt %date% !date! verwendest, also statt dem Prozentzeichen (%) ein Ausrufezeichen (!). Und genau deswegen klappt es oder klappt es nicht. Es liegt also nicht wie vorhin von mir vermutet an dem "Ping"-Befehl, sondern ich hatte erstmal von dir abgeschrieben und ! verwendet. Und dann in meinem Code hatte ich wieder die Prozentzeichen drinstehen. Und beim Prozentzeichen scheint das enabledelayedexpansion nicht zu greifen. Ich habe also daraufhin den Ping-Befehl wieder gelöscht und verwende überall für meine date und time Variablen das Ausrufezeichen. Damit krieg ich nen Zeitstempel der einzelnen Datein mit 3 Millisekunden, das passt!

Was ist denn nun der Unterschied zwischen Prozentzeichen und Ausrufezeichen bei Variablen?
Bitte warten ..
Mitglied: pieh-ejdsch
10.10.2013 um 12:27 Uhr
moin pangu,

wenn Du wärend der Schleifenabrbeitung eine Ausgabe in die Console erzeugst, könnte es auslangen diese Millisekunde zu überbrücken.

erster Test in der CMD Line wieviele Zeilen je Millisekunde
Da nun hier auch eine Ausgabe erfolgt, aber die Millisekunde zum Unterschied nicht erreicht wird ist die Bearbeitung zu schnell.
Ein Wert geht sogar über 470 potentielle Zeilen, obwohl je zeile zwei Variablen dargestellt werden müssen und eine erstellt wird.
10000 zu 34 Millisekunden passt da auch noch nicht.
Eine Ausgabe reicht also nicht. Aber eine Ausgabe zu Dursuchen könnte dazu langen:
Da jetzt find (sogar ohne Ausgabe) etwas zu tun hat, verzögert das um ca 1 Millisekunde

Durch Verlegen der seperaten CMD instanz gibt es auch eine Verzögerung von je einer Millisekunde.
Vllt ist die bessere Alternative eine Temporäre vbs zu schreiben, welche eine Millisekunde wartet.

Gruß Phil
Bitte warten ..
Mitglied: bastla
10.10.2013 um 13:24 Uhr
Hallo panguu!
Was ist denn nun der Unterschied zwischen Prozentzeichen und Ausrufezeichen bei Variablen?
Falls ich das noch nicht erwähnt haben sollte: "delayedExpansion"

Schau Dir einmal das einschlägige Tutorial zur FOR-Schleife von Friemler an ...

Grüße
bastla
Bitte warten ..
Mitglied: panguu
10.10.2013, aktualisiert um 15:09 Uhr
@phil, danke für deinen ausführlichen Beitrag. Jedoch habe ich durch Bastlas Hilfe herausgefunden, wo das ursprüngliche Problem war. "delayedExpansion" ist tatsächlich das richtige Schlagwort hierfür.

@bastla: Vielen herzlichen Dank für die Verlinkung dieses tollen Tutorials, das Friemler hier freundlicherweise zur Verfügung stellt. Sehr nettes Tutorial *daumen_Hoch!*. Da wird genau dieser Fall erörtert und beantwortet damit meine vorherige Frage zum Unterschied von Prozent- und Ausrufezeichen.

Durch ENABLEDELAYEDEXPANSION wird die verzögerte Variablenerweiterung aktiviert. Dadurch, dass ein Variablenname in Ausrufezeichen statt in Prozentzeichen eingeschlossen ist, wird dem Befehlsinterpreter mitgeteilt, diesen Variablennamen erst bei Ausführung des Befehls durch seinen Wert zu ersetzen, der durch den vorhergehenden SET-Befehl gesetzt wurde

Vielen Dank! Problem wurde als gelöst markiert.
Bitte warten ..
Ähnliche Inhalte
Windows Netzwerk

Batch- Datei: Netzwerkzugriff funktioniert nicht

Frage von 133722Windows Netzwerk14 Kommentare

Hallo zusammen, ich habe folgendes Problem: eine kleine Batchdatei soll bei einem Programmstart einen Satz an Programmdaten von einem ...

Windows Server

PowerShell script Hilfestellung

Frage von ollip2016Windows Server2 Kommentare

Guten Tag Administrator-User, ich bin auf der Suche nach Hilfestellung für eine Powershell Skript, hier mal kurz eine Beschreibung, ...

Router & Routing

Hilfestellung, Mikrotik hinter Fritzbox

gelöst Frage von wusa88Router & Routing22 Kommentare

Hallo Zusammen, ich habe mir den Mikrotik RB941-2nD gekauft um alles was mit Netzwerk, Routing, VLAN usw. zu tun ...

Batch & Shell

Batch Datei - Verzeichnis kopieren funktioniert nicht - nur Dateien

gelöst Frage von inspiratioBatch & Shell12 Kommentare

Hallo zusammen, ich habe eine Batch Datei erstellt wo die Unterverzeichnisse von A nach B kopiert werden sollen: echo ...

Neue Wissensbeiträge
Administrator.de Feedback
Hinweise auf Dienstleister oder auf Suchmaschinen
Information von Frank vor 2 TagenAdministrator.de Feedback71 Kommentare

Lieber User, Admins und Moderatoren, aus gegebenen Anlass möchte ich zwei Dinge endgültig klarstellen und für die Nachwelt festhalten: ...

Router & Routing

PfSense 2.4 IPSec VPN mobile Clients Phase 2 wird plötzlich nicht mehr aufgebaut - So einfach war die Lösung

Tipp von the-buccaneer vor 3 TagenRouter & Routing9 Kommentare

Moinsen! Nachdem ich mir hierbei nen Wolf gesucht habe, möchte ich doch die Welt an dieser simplen Lösung teilhaben ...

Humor (lol)
Wählscheiben Telefon
Information von brammer vor 3 TagenHumor (lol)4 Kommentare

Hallo, Mal wirkliche eine nette Spielerei brammer

Sicherheit

Zeitenwende: Mehr pot. Mac- (Heise Wortlaut) als Windowsbedrohungen

Information von certifiedit.net vor 4 TagenSicherheit4 Kommentare

Wir hatten es ja hier erst letztens, dass OS bzw Mac auch nicht der Weisheit letzter Schluss ist, nun ...

Heiß diskutierte Inhalte
Netzwerke
Instagram Fake Account
Frage von NurangnNetzwerke18 Kommentare

Hey Leute, Ich bin neu hier und hätte eine Frage. Und zwar werden mein Freund und ich von Mehreren ...

Server-Hardware
Verkaufe mein HomeLab - Hat jemand Interesse?
Frage von BirdyBServer-Hardware13 Kommentare

Hallo miteinander, auf Grund eines bald bevorstehenden Umzugs, chronischer Nichtnutzung und des sehr eingeschränkten FAF (Frauen-Akzeptanz-Faktors) möchte ich mein ...

Hyper-V
HyperV Cluster nachträglich in neue Domäne einbinden - Fehler Livemigration
Frage von bierzapferHyper-V13 Kommentare

Hallo zusammen, wir haben einen neuen HyperV Cluster implementiert und die produktive Gesamtstruktur inkl. produktiver Domäne auf neue Win2019 ...

Erkennung und -Abwehr
Außenstehenden (Fremden) Remote Zugriff via VM erlauben
gelöst Frage von Cyphy98Erkennung und -Abwehr11 Kommentare

Moin Liebe Community Schlagt mich nicht falls ich was falsch mache, ist mein erster Beitrag hier 🤪. Aber zum ...