Batch: Dateien mit bestimmter endung auslesen?
Ich habe einen Ordner mit sehr vielen dateien die alle die endung .x haben
ein Batch skript soll nun einfach die erste (egal welche) auslesen, und sowohl den namen (dateinamen ohne .x ) in eine variable schreiben, und den inhalt in eine andere
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
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