Jump to content

For-Schleife zum Abrufen der Dateigrößen (Batch)


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 Groesse
datei2.txt mit 2 Byte Groesse
datei3.txt mit 3 Byte Groesse

 

Hier nun mein Versuch:

====================

@echo off

dir *.txt /B >dateiliste

for /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 Byte
datei2.txt Groesse 3 Byte
datei3.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

Link zu diesem Kommentar

Hallo,

 

danke für die Antwort und den Tipp mit setlocal.

 

Ich habe das ausprobiert mit folgender Batch:

=======
@echo off
setlocal EnableDelayedExpansion
dir *.txt /B >dateiliste
for /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
 

Link zu diesem Kommentar

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 von Daniel -MSFT-
Link zu diesem Kommentar

Hallo,

 

danke für das Beispiel.

Ich hab's auch so probiert, allerdings auch ohne Erfolg:

======

@echo off
setlocal EnableDelayedExpansion
dir *.txt /B >dateiliste
for /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:

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...