Batch: Dateien mit bestimmter endung auslesen?

2 Antworten

nicht erschrecken, das sind effektiv nur 7 Zeilen, der rest ist Kommentar und Anzeige.

Jede Zeile muss einzeln in eine Array-Variable gespeichert werden.

Ich weiß nicht was Deine .x-Dateien enthalten...

Batch ist nicht gerade geeignet zur Verarbeitung von Text. So wie diese Batch ist werden keine Ausrufezeichen (!) dargestellt. Steuerzeichen im Text, wie: &|<> bringen die Anzeige (echo:!Zeile[%%~a]!) in der Batch zum Absturz!

Der Aufwand um derartiges abzufangen ist nicht zu verachten...

Ist derartiges der Fall, solltest Du erwägen ob Du nicht besser , eine andere in Windows integrierte Programmiersprache (Powershell,JavaScript, VBScript oder C#) verwendest.

@echo off
setlocal enableDelayedExpansion
chcp 65001 >nul & rem ümlaute  anzeigen 

  rem aktuelles Verzeichnis nach  dateien mit der Endung  .x durchsuchen.
  rem ergebnisse werden de laufvariable %%a zugewiesen...
for /f "tokens=*" %%a in ('dir /b "*.x"') do (
      rem nackten Dateinamen ohne Endung einer Variable zuweisen
    set "FileName=%%~na"
      rem Tricky und sehr schnell, um  nicht mit Berechnung eine Zählvariabel zu arbeiten  lassen wir Find die Datei einlesen
      rem ...und gleich die Zeilen  nummerieren
      rem  find /v ""   listet  keine Zeilen, welche keinen Suchbegriff  ("") enthalten (also alle  ---Batch ist geil---)
    for /f " skip=2 tokens=1* delims=[]" %%k in ('find /v /n "" "%%~a"') do (
          rem %%k enthält die Zeilennummer  %%l den Inhalt der Zeile
          rem die variable maxLines bekommt bei jeder Zeile  die aktuelle Zeilennummer (und  hat  am Ende die letzte Zeilennummer)
        set "maxLines=%%~k"
          rem den  inhalt  der Zeilen speichern wir in einem (pseudo)Array
        set "Zeile[%%~k]=%%~l"
    )
      rem  nach erster Datei abbrechen
    goto :break
)
:break

  rem  zur Demo die einzelnen Variablen das Array anzeigen (ehemals leere Zeilen werden nicht als variable angelegt)
  rem kann weg...
set "zeile["

echo:
echo Name der Datei  ohne Endung= ###%FileName%###
echo alle Zeilen normal anzeigen.  Simple Zählschleife von 1 bis maxLines...
for /l %%a in (1,1,%maxLines%) do (
      rem alle  Zeilenvariablen schön der  Reihe nach, wenn eine nicht existiert Leerzeile...
    echo:!Zeile[%%~a]!
)

echo:
echo der inhalt von Zeile 2 ist: %Zeile[2]%
pause

..als DropTarget (Datei auf die Batch ziehen....)

@echo off
setlocal enableDelayedExpansion
chcp 65001 >nul & rem ümlaute  anzeigen 
  rem prüfen ob eine datei übergeben wurde...
if "%~1"=="" (
    echo DropTarget... ziehe eine Textdatei ^(... .x^) auf die Datei "%~nx0"
    timeout 4 >nul
    exit /b
)

  rem übergebene Datei verarbeiten... alles wie Demo 1
for %%a in ("%~1") do (
    set "FileName=%%~na"
    for /f " skip=2 tokens=1* delims=[]" %%k in ('find /v /n "" "%%~a"') do (
        set "maxLines=%%~k"
        set "Zeile[%%~k]=%%~l"
    )
)

echo:
echo Name der Datei  ohne Endung= ###%FileName%###
echo alle Zeilen normal anzeigen.  Simple Zählschleife von 1 bis maxLines...
for /l %%a in (1,1,%maxLines%) do (
    echo:!Zeile[%%~a]!
)

echo:
echo der inhalt von Zeile 2 ist: %Zeile[2]%
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
for /f " usebackq delims=" %A in (`dir /b *.x`) do (
  rem voller Dateiname
  set dateiname=%A
  rem Dateiname ohne Endung
  set dateinameOE=%~nA
)

setlocal enabledelayedexpansion

set dateiinhalt=
for /f %A in (dateiname) do (
  set dateiinhalt=!dateiinhalt!^J%A
)

wobei ^J als Strg+J einzugeben ist

Woher ich das weiß:Berufserfahrung – Software-Entwickler