UweE 0 Geschrieben 5. Februar 2014 Melden Teilen Geschrieben 5. Februar 2014 Hallo, ich bin neu hier und hoffe, dass mir bei einem Programmierungsproblem geholfen werden kann. Ich habe mehrere Dateien, die immer wieder mit neuem Inhalt gefüllt werden. Dabei kann es passieren, dass einige Dateien die Dateilänge 0 haben. Diesen Fall muss ich in einer Batch abfangen, um dann entsprechend zu verweigen. Als Beispiel habe ich drei Dateien verwendet: datei1.txt mit 1 Byte Groessedatei2.txt mit 2 Byte Groessedatei3.txt mit 3 Byte Groesse Hier nun mein Versuch: ==================== @echo offdir *.txt /B >dateilistefor /F %%i in (dateiliste) do ( rem Groesse ermitteln set g1=%%~zi echo %%i Groesse %g1% Byte rem weiterer Code zum Verzweigen, wenn Dateigroesse 0 ist)=================== Ausgabe: datei1.txt Groesse 3 Bytedatei2.txt Groesse 3 Bytedatei3.txt Groesse 3 Byte Es wird also immer die Größe der letzten Datei ausgegeben. Hat jemand eine Idee, wie man das lösen könnte? Viele Grüße Uwe Lösung inzwischen gefunden. if %%~zi == 0 ( Befehl wenn Datei = 0 byte hat ) ELSE ( Befehl wenn Datei mehr als 0 Byte hat ) Setzen als Variable mit "set g1=%%~zi" funktioniert nicht - scheint ein Bug zu sein!? Uwe Zitieren Link zu diesem Kommentar
Daniel -MSFT- 129 Geschrieben 5. Februar 2014 Melden Teilen Geschrieben 5. Februar 2014 Kein Bug. Die Variable wird in der Schleife nicht ausgewertet, wenn Du nicht 'setlocal ENABLEDELAYEDEXPANSION' vorher setzt: http://www.administrator.de/wissen/tutorial-zur-for-schleife-155681.html Zitieren Link zu diesem Kommentar
UweE 0 Geschrieben 5. Februar 2014 Autor Melden Teilen Geschrieben 5. Februar 2014 Hallo, danke für die Antwort und den Tipp mit setlocal. Ich habe das ausprobiert mit folgender Batch: =======@echo offsetlocal EnableDelayedExpansiondir *.txt /B >dateilistefor /F %%i in (dateiliste) do ( set g1 = %%~zi set g1 echo %%i Groesse %g1% Byte) ====== Die Zeile mit "set g1" zeigt den korrekten Inhalt (1, 2, 3) an, in der echo-Zeile funktioniert es nicht . Ich habe jetzt schon 'ne Weile erfolglos rumprobiert. Mit "if %%~zi == 0 ( ...." funktioniert es aber. Danke und Grüße Uwe Zitieren Link zu diesem Kommentar
Daniel -MSFT- 129 Geschrieben 5. Februar 2014 Melden Teilen Geschrieben 5. Februar 2014 (bearbeitet) Du musst bei 'Setlocal EnableDelayedExpansion' die Variable mit ! statt % ansprechen. Wenn Du % nutzt, dann bekommst Du den Inhalt der Variable beim parsen. Wenn Du ! nutzt, dann den beim Ausführen. Hier ein kleines Beispiel: @echo off Setlocal EnableDelayedExpansion Set I=eins Set I=zwei& Echo %I% !I! Als Ausgabe bekommst Du bei %I% eins und bei !I! zwei. Beim Ausführen der Zeile 'Set I=zwei& Echo %I% !I!' wird %I% geparsed. In der Variable wird beim Parsen die Zuweisung aus der Vorzeile ('eins') ausgelesen. Dann wird die Zeile ausgeführt und bei !I! die Variable wegen der DelayedExpansion durch das Ausführen durch 'zwei' ersetzt. Ergo ist die Ausgabe: eins zwei. Das hat einige Auswirkungen bei Batchprogrammierung. Das Beispiel habe ich von http://ss64.com/nt/delayedexpansion.html, wo Du noch weitere gute Anwendungsbeispiele findest. Have fun!Daniel bearbeitet 5. Februar 2014 von Daniel -MSFT- Zitieren Link zu diesem Kommentar
UweE 0 Geschrieben 6. Februar 2014 Autor Melden Teilen Geschrieben 6. Februar 2014 Hallo, danke für das Beispiel. Ich hab's auch so probiert, allerdings auch ohne Erfolg: ====== @echo offsetlocal EnableDelayedExpansiondir *.txt /B >dateilistefor /F %%I in (dateiliste) do ( set G1 = %%~zI set G1 echo %%I !G1!) ===== Grüße Uwe G1 wird nur bei set ausgegeben, jedoch nicht in der echo-Zeile. :confused: Zitieren Link zu diesem Kommentar
Daniel -MSFT- 129 Geschrieben 10. Februar 2014 Melden Teilen Geschrieben 10. Februar 2014 (bearbeitet) Ich habe mal einen Rechner ausgegraben, weil am SmartPhone kein cmd.exe zu finden war. Du kannst das in einer Zeile machen, ohne die Dateiliste zu erzeugen: for %%I in (datei*.txt) do echo %%I %%~zI bearbeitet 10. Februar 2014 von Daniel -MSFT- Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.