andichrist
Goto Top

Aus Ordnernamen sollen TXT Dateien erstellt werden

Ich suche Lösungen für:
a) TXT-Datei aus kompletten Ordnernamen erstellen
b) TXT-Datei aus den ersten 4 Zeichen des Ordnernamens erstellen

Hallo an Alle!

ich möchte gerne 1) in einem Verzeichnis für jeden vorhanden Ordnern eine namentlich gleiche TXT-Dateien erstellen!

Ich meinte hier einen Ansatz Dateinamen auslesen und neue Dateien erstellen gefunden zu haben. Aber leider funktioniert, dass mit meinen Anpassungen nicht!

Ursprünglicher Quellcode von 'bastla'
@echo off & setlocal 
for %%i in ("C:\Ein bestimmter Ordner\*.*") do if not exist "%%~dpni.txt" echo\>"%%~dpni.txt"

Meine 'Code' Anpassung
@echo off & setlocal 
set "targetdir=." & REM  oder Verz. setzen z.B.  set "targetdir=C:\Temp" 
for %%i in ("%targetdir%\dir /b /ad") do if not exist "%%~dpni.txt" echo\>"%%~dpni.txt"

Leider funktioniert es nicht - es passiert gar nichts! GGGRRR

2) Benötige ich noch eine erweiterte Batch die nur aus den ersten 4 Zeichen (numerisch) des Ordnernamens jeweils eine TXT-Datei erstellt!

Beispiel für Ordner
....
3648 - Duschkopf chrom 
3649 - Duschkopf blau 
3650 - Blumenvase lila 
3651 - Blumenvase grün 
3652 - Abflußrohr 
...

Es wäre nett, wenn mir jemand weiter helfen könnte! face-smile

Viele Grüße und Danke im Voraus
Andychrist

Content-Key: 128579

Url: https://administrator.de/contentid/128579

Printed on: April 25, 2024 at 13:04 o'clock

Member: rubberman
rubberman Nov 04, 2009 at 00:29:06 (UTC)
Goto Top
Hallo Andychrist,

ganz hab ich nicht verstanden was du vorhast. Aber vielleicht
1) so:
@echo off &setlocal
set "targetdir=C:\Temp"  
pushd "%targetdir%"  
for /d %%i in (*) do echo %%i>"%~dp0\%%i.txt"  
popd
und 2) so:
@echo off &setlocal enabledelayedexpansion 
set "targetdir=C:\Temp"  
pushd "%targetdir%"  
for /d %%i in (*) do set "x=%%i" &set "x=!x:~,4!" &echo !x!>"%~dp0\!x!.txt"  
popd
Grüße
rubberman
Member: Andichrist
Andichrist Nov 04, 2009 at 00:52:20 (UTC)
Goto Top
Hallo rubberman,

danke für Deine rasche Antwort zu später Stunde! face-smile

Es ist ganz einfach was ich möchte. 1) Ich habe in einem Verzeichnis zB c:\Temp "tausende" durchnummerierte Order zB. "1236 - Brot"! Zwecks Weiterverarbeitung benötige ich für jeden Order eine gleich lautende TXT-Datei also "1236 - Brot.txt"!

Im 2) Schritt benötige ich von diesen "tausende" durchnummerierten Ordner nur die eindeutige 4-stellige Anfangsnummer! Zwecks Datenabgleich und Überprüfung ob vielleicht ein Ordner "1234 - Bratwurst" zwischen "1233 - Senf" und "1235 - Bier" abhanden gekommen ist. Auch wieder als als TXT-Datei, also 1233.txt, 1235.txt ...usw

Ich hoffe es ist jetzt etwas verständlicher geworden was ich meinte.

Deine Lösungsvorschläge zu (1) und (2) funktionieren ganz gut. Allerdings ist störend, dass die so erzeugten TXT-Dateien nicht LEER sind, sondern zusätzlich mit dem entsprechenden Dateinamen gefüllt sind.

Viele Grüße
Andychrist
Member: bastla
bastla Nov 04, 2009 at 09:09:21 (UTC)
Goto Top
@rubberman
1) hätte ich eher so interpretiert :
@echo off & setlocal
set "targetdir=C:\Temp"  

pushd "%targetdir%"  
for /d %%i in (*) do echo\>"%%~i.txt"  
popd

2) Wenn es darum geht, die Vollständigkeit zu prüfen,würde sich eine "for /L"-Schleife anbieten, etwa:
@echo off & setlocal enabledelayedexpansion 
set "targetdir=C:\Temp"  
set "Log=Fehlende.txt"  

pushd "%targetdir%"  
if exist "%Log%" del "%Log%"  
set Low=
set High=
for /f %%i in ('dir /b /ad /on') do set High=%%i & if not defined Low set /a Low=%%i  
if not defined High (echo Keine Ordner gefunden & goto :eof)
set /a Low=%Low:~,4% 2>nul || (echo Ungueltiger Ordnername %Low% & goto :eof)
if %Low%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
set /a High=%High:~,4% 2>nul || (echo Ungueltiger Ordnername %High% & goto :eof)
if %High%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
for /L %%i in (%Low%,1,%High%) do dir /b /ad|findstr /b /c:"%%i ">nul || >>Fehlende.txt echo %%i  
popd
Vorausgesetzt wird, dass es nur mit 4 Ziffern und einem darauffolgenden Leerzeichen beginnende Ordnernamen gibt. Die Log-Datei "Fehlende.txt" wird, wenn in Zeile 3 kein vollständiger Pfad angegeben ist, im Zielordner erstellt.

Grüße
bastla
Member: Andichrist
Andichrist Nov 04, 2009 at 13:15:14 (UTC)
Goto Top
Zitat von @bastla:
@rubberman
1) hätte ich eher so interpretiert :
@echo off & setlocal
 set "targetdir=C:\Temp"  
 
 pushd "%targetdir%"  
 for /d %%i in (*) do echo\>"%%~i.txt"  
 popd
 

Danke @bastla, das funktioniert perfekt! face-smile

Der Vollständigkeit halber für die Interessierten noch eine Lösung ohne pushd/ popd

Lösung von bastla:
for /d %%i in ("%targetdir%\*.*") do if not exist "%%~fi.txt" echo\>"%%~fi.txt"

2) Wenn es darum geht, die Vollständigkeit zu
prüfen,würde sich eine "for /L"-Schleife
anbieten, etwa:
@echo off & setlocal enabledelayedexpansion 
set "targetdir=C:\Temp"  
set "Log=Fehlende.txt"  

pushd "%targetdir%"  
if exist "%Log%" del "%Log%"  
set Low=
set High=
for /f %%i in ('dir /b /ad /on') do set High=%%i & if not defined Low set /a Low=%%i  
if not defined High (echo Keine Ordner gefunden & goto :eof)
set /a Low=%Low:~,4% 2>nul || (echo Ungueltiger Ordnername %Low% & goto :eof)
if %Low%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
set /a High=%High:~,4% 2>nul || (echo Ungueltiger Ordnername %High% & goto :eof)
if %High%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
for /L %%i in (%Low%,1,%High%) do dir /b /ad|findstr /b /c:"%%i ">nul || >>Fehlende.txt echo %%i  
popd
 
Vorausgesetzt wird, dass es nur mit 4 Ziffern und einem
darauffolgenden Leerzeichen beginnende Ordnernamen gibt. Die Log-Datei
"Fehlende.txt" wird, wenn in Zeile 3 kein vollständiger
Pfad angegeben ist, im Zielordner erstellt.

Auch dieses Script funktioniert perfekt! Zu perfekt! face-wink Du bist mir mit dieser Lösung sogar einen Schritt voraus, als die von mir ursprünglich gewollten tausend erzeugten TXT-Dateien auszuwerten! Denn diese Script liefert die fehlenden 'Nummern' direkt in eine LOG-Datei (das wäre bei mir der 2. Arbeitsschritt gewesen). Auch gut gelöst ist, dass ich per Abfrage VON -> BIS nicht angeben muss! TOP.

Da Du mir jetzt einen Arbeitsschritt erspart hast (!) ^^, brauche ich in der LOG anstatt der 'Nummer' den kompletten OrdnerNamen. Könntest Du bitte das Script noch so anpassen! face-wink Danke.

Viele Grüße
Andychrist
Member: bastla
bastla Nov 04, 2009 at 13:30:46 (UTC)
Goto Top
Hallo Andy!
... brauche ich in der LOG anstatt der 'Nummer' den kompletten OrdnerNamen.
Da in der Log-Datei die nicht gefundenen Nummern stehen, stelle ich es mir etwas schwierig vor, die dazugehörigen nicht vorhandenen Namen auszugeben face-wink - wie ist das also gemeint (ev mit Beispiel)?

Grüße
bastla
Member: Andichrist
Andichrist Nov 04, 2009, updated at Oct 18, 2012 at 16:39:52 (UTC)
Goto Top
Zitat von @bastla:
Hallo Andy!
> ... brauche ich in der LOG anstatt der 'Nummer' den
kompletten OrdnerNamen.
Da in der Log-Datei die nicht gefundenen Nummern stehen, stelle ich
es mir etwas schwierig vor, die dazugehörigen nicht vorhandenen
Namen auszugeben face-wink - wie ist das also gemeint (ev mit Beispiel)?

WIE - hast Du Deine Glaskugel heute nicht dabei! face-wink

Sorry, habe ich vergessen anzugeben. Es gibt eine vollständige Inventarliste.txt.

Die Lösung gibt es aber schon >>hier<<

Aufbau: Inventarliste.txt

0000 - Blaues Geländer
0001 - Treppenabsatz beige
....
3648 - Duschkopf chrom
3649 - Duschkopf blau
3650 - Blumenvase lila
3651 - Blumenvase grün
3652 - Abflußrohr
...
3753 - Stehlampe Modell Klara
3754 - Funkuhr Modell Schwarzwald
3755 - Tisch
....

Deine o. g. Batch(2) Ergebnis Fehlende.txt

...
3648
3650
3652
3753
3754
3755
...

Jetzt müssen beide Ergebnisse noch abgeglichen werden!

Endresultat was fehlt:

....
3649 - Duschkopf blau
3651 - Blumenvase grün
....

Lösungsansatz wäre:

@echo off & setlocal
set "Quelle=Inventarliste.txt"
set "Liste=Fehlende.txt"
set "Erg=Fehlliste.txt"

if exist "%Erg%" del "%Erg%"
for /f "usebackq delims=" %%i in ("%Liste%") do for /f "delims=" %%d in ('findstr /c:"%%i" "%Quelle%"') do >>"%Erg%" echo %%d


Das fertige Script würde dann so aussehen:

@echo off & setlocal enabledelayedexpansion 
set "targetdir=." & REM  oder Verz. setzen z.B.  set "targetdir=C:\Temp"  
set "Quelle=Inventarliste.txt"  
set "Log=Fehlende.txt"  
set "Erg=Fehlliste.txt"  



:: Teil 1  - fehlende Ordner ermitteln!
pushd "%targetdir%"  
if exist "%Log%" del "%Log%"  
set Low=
set High=
for /f %%i in ('dir /b /ad /on') do set High=%%i & if not defined Low set /a Low=%%i  
if not defined High (echo Keine Ordner gefunden & goto :eof)
set /a Low=%Low:~,4% 2>nul || (echo Ungueltiger Ordnername %Low% & goto :eof)
if %Low%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
set /a High=%High:~,4% 2>nul || (echo Ungueltiger Ordnername %High% & goto :eof)
if %High%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
for /L %%i in (%Low%,1,%High%) do dir /b /ad|findstr /b /c:"%%i ">nul || >>Fehlende.txt echo %%i  
popd

:: Teil 2 -  Abgleich wie heißen die fehlenden Ordner
if exist "%Erg%" del "%Erg%"  
for /f "usebackq delims=" %%i in ("%Log%") do for /f "delims=" %%d in ('findstr /c:"%%i" "%Quelle%"') do >>"%Erg%" echo %%d  

Danke für eure Hilfe!

Grüße
Andychrist
Member: Andichrist
Andichrist Nov 04, 2009 at 16:01:48 (UTC)
Goto Top
Hallo @bastla,

jetzt hätte ich noch eine bitte an Dich!

Dein Script(2) funktioniert mit Ordnern so gut, kannst Du es bitte auch für Dateien tauglich machen?

Also bitte so abändern, dass es anstatt mit Ordnern mit Dateien (.TXT) funktioniert! Das wäre zusätzlich sehr hilfreich für mich.

@echo off & setlocal enabledelayedexpansion 
set "targetdir=C:\Temp"  
set "Log=Fehlende.txt"  

pushd "%targetdir%"  
if exist "%Log%" del "%Log%"  
set Low=
set High=
for /f %%i in ('dir /b /ad /on') do set High=%%i & if not defined Low set /a Low=%%i  
if not defined High (echo Keine Ordner gefunden & goto :eof)
set /a Low=%Low:~,4% 2>nul || (echo Ungueltiger Ordnername %Low% & goto :eof)
if %Low%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
set /a High=%High:~,4% 2>nul || (echo Ungueltiger Ordnername %High% & goto :eof)
if %High%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
for /L %%i in (%Low%,1,%High%) do dir /b /ad|findstr /b /c:"%%i ">nul || >>Fehlende.txt echo %%i  
popd

Danke im Voraus.

Grüße
Andychrist
Member: bastla
bastla Nov 04, 2009 at 16:08:38 (UTC)
Goto Top
Hallo Andy!

Dann sparen wir doch den Zwischenschritt über die "Fehlende.txt" auch noch ein (das Testen übernimmst ja sicher Du face-wink):
@echo off & setlocal
set "targetdir=." & REM  oder Verz. setzen z.B.  set "targetdir=C:\Temp"  
set "Quelle=Inventarliste.txt"  
set "Erg=Fehlliste.txt"  

:: fehlende Ordner ermitteln!
pushd "%targetdir%"  
if exist "%Erg%" del "%Erg%"  
set Low=
set High=
for /f %%i in ('dir /b /ad /on') do set High=%%i & if not defined Low set /a Low=%%i  
if not defined High (echo Keine Ordner gefunden & goto :eof)
set /a Low=%Low:~,4% 2>nul || (echo Ungueltiger Ordnername %Low% & goto :eof)
if %Low%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
set /a High=%High:~,4% 2>nul || (echo Ungueltiger Ordnername %High% & goto :eof)
if %High%==0 (echo Ordner ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
for /L %%i in (%Low%,1,%High%) do dir /b /ad|findstr /b /c:"%%i ">nul || (  
    findstr /b /c:"%%i " "%Quelle%" >nul && (findstr /b /c:"%%i " "%Quelle%" >>"%Erg%") || (echo %%i konnte in %Quelle% nicht gefunden werden)  
)
popd
Wie es aussieht, werden wir übrigens "delayedExpansion" nicht benötigen, daher besser weglassen ...

Grüße
bastla

[Edit] Sollte eigentlich über den beiden vorigen Kommentaren stehen [/Edit]
Member: bastla
bastla Nov 04, 2009 at 16:13:17 (UTC)
Goto Top
Hallo Andy!
so abändern, dass es anstatt mit Ordnern mit Dateien (.TXT) funktioniert!
Eigentlich sollte dafür eine Anpassung des "dir"-Befehles genügen (jeweils von
dir /b /ad /on
auf
dir /b /a-d /on *.txt
ändern).

Grüße
bastla
Member: Andichrist
Andichrist Nov 04, 2009 at 17:09:40 (UTC)
Goto Top
Hallo bastla,

was soll ich sagen - ich bin begeistert! Es funktioniert alles zu meiner vollsten Zufriedenheit!

Deine vorherige Batch-Anpassung funktioniert ohne 'Zwischenschritt' tadellos.

Danke für den TIP mit der Anpassung für Dateien.

dir /b /a-d /on *.txt

Die Anpassung funktioniert einwandfrei!

Exkurs zum Abschluß:

Wie müßte die Code-Zeile lauten, wenn ich zwei Datei-Typen gleichzeitig überprüfen müßte?

Also zB.: .TXT und .INF

Grüße
Andy
Member: bastla
bastla Nov 04, 2009 at 17:37:02 (UTC)
Goto Top
Hallo Andy!
Es funktioniert alles zu meiner vollsten Zufriedenheit!
Freut mich. face-smile
Wie müßte die Code-Zeile lauten, wenn ich zwei Datei-Typen gleichzeitig überprüfen müßte?
Hinsichtlich des "dir" ginge das recht einfach:
dir /b /a-d /on *.txt *.inf
Allerdings wäre das im konkreten Fall eine "Oder"-Verknüpfung - eine Datei (egal welchen Typs) würde schon genügen, um als Ergebnis "nicht fehlend" zu produzieren.

Falls Du (vermutlich) eine "Und"-Verknüpfung willst, müsste in der "for /L"-Schleife nach beiden Typen getrennt geprüft werden, also etwa:
for /L %%i in (%Low%,1,%High%) do (
    dir /b /ad *.txt|findstr /b /c:"%%i ">nul || (  
        findstr /b /c:"%%i " "%Quelle%" >nul && (findstr /b /c:"%%i " "%Quelle%" >>"%Erg%") || (echo %%i konnte in %Quelle% nicht gefunden werden)  
    ) && (
    dir /b /ad *.inf|findstr /b /c:"%%i ">nul || (  
        findstr /b /c:"%%i " "%Quelle%" >nul && (findstr /b /c:"%%i " "%Quelle%" >>"%Erg%") || (echo %%i konnte in %Quelle% nicht gefunden werden)  
    )
)
(noch weniger getestet als vorhin face-wink)

Grüße
bastla
Member: Andichrist
Andichrist Nov 04, 2009 at 22:24:11 (UTC)
Goto Top
Hi,

danke für die rasche Antwort. In meinem Fall benötige ich eine "Oder"-Verknüpfung!

Wir müssen aber nochmals einen Schritt zurück!

Leider funktioniert es mit Dateien noch nicht! Ich habe mich geirrt. face-sad

TXT-Dateien
dir /b /a-d /on *.txt

bzw.

TXT-Dateien 'oder' INF-Dateien
dir /b /a-d /on *.txt *.inf


Beide Code-Zeilen führen jeweils zum gleichen Ergebnis! Es wird jeweils ein Auszug
beginnend bei %Low und endend bei %High aus der Inventarliste.txt erzeugt.

Für eine Lösung wäre es mir recht, wenn man gleich beide Fälle .TXT 'oder' .INF berücksichtigen könnte.

Grüße
Andychrist
Member: bastla
bastla Nov 04, 2009 at 23:18:03 (UTC)
Goto Top
Hallo Andy!

Eigentlich sollte es so funktionieren:
@echo off & setlocal
set "targetdir=." & REM  oder Verz. setzen z.B.  set "targetdir=C:\Temp"  
set "Quelle=C:\Inventarliste.txt"  
set "Erg=C:\Fehlliste.txt"  

:: fehlende Dateien ermitteln!
pushd "%targetdir%"  
if exist "%Erg%" del "%Erg%"  
set Low=
set High=
for /f %%i in ('dir /b /a-d /on *.txt *.inf') do set "High=%%i" & if not defined Low set "Low=%%i"  
if not defined High (echo Keine Dateien gefunden & goto :eof)
set /a Low=%Low:~,4% 2>nul || (echo Ungueltiger Dateiname %Low% & goto :eof)
if %Low%==0 (echo Datei ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
set /a High=%High:~,4% 2>nul || (echo Ungueltiger Dateiname %High% & goto :eof)
if %High%==0 (echo Datei ohne Nummer gefunden - Pruefung kann nicht erfolgen & goto:eof)
for /L %%i in (%Low%,1,%High%) do dir /b /a-d *.txt *.inf|findstr /b /c:"%%i ">nul || (  
    findstr /b /c:"%%i " "%Quelle%" >nul && (findstr /b /c:"%%i " "%Quelle%" >>"%Erg%") || (echo %%i konnte in %Quelle% nicht gefunden werden)  
)
popd
Zu beachten wäre, dass die Quell-Datei "Inventarliste.txt" und die Ergebnisdatei nicht im Ordner mit den nummerierten Dateien liegen dürfen - daher jeweils vollständige Pfade angeben.

Grüße
bastla
Member: Andichrist
Andichrist Nov 04, 2009 at 23:52:05 (UTC)
Goto Top
Hallo bastla,

Zu beachten wäre, dass die Quell-Datei "Inventarliste.txt" und die Ergebnisdatei nicht im Ordner
mit den nummerierten Dateien liegen dürfen - daher jeweils vollständige Pfade angeben.

ach ja, dass wäre auch zu schön gewesen, wenn es das gewesen wäre. Leider ändert sich nichts! Es funktioniert nichtface-sad

Es spielt keine Rolle, ob ich das Script mit absoluten oder relativen Pfaden aufrufe. In der Ergebnisdatei werden einfach alle Artikel durch gezählt (ob vorhanden oder nicht) und aus der Inventarliste.txt aufgelistet - beginnend bei %Low und endend bei %High! face-sad

Grüße
Andy
EDIT: Alles wieder zurück - ES FUNKTIONIERT!

Ich hatte übersehen, dass Du nicht nur die Pfade abgeändert hast, sondern zusätzlich die letzte FOR /L-Schleife angepaßt hast! Mit dieser Neuen funktioniert es! TOP

Alte-Code-Zeile:
for /L %%i in (%Low%,1,%High%) do dir /b /ad|findstr /b /c:"%%i ">nul || (  
    findstr /b /c:"%%i " "%Quelle%" >nul && (findstr /b /c:"%%i " "%Quelle%" >>"%Erg%") || (echo %%i konnte in %Quelle% nicht gefunden werden)  
)

Neue Code-Zeile:
for /L %%i in (%Low%,1,%High%) do dir /b /a-d *.txt *.inf|findstr /b /c:"%%i ">nul || (  
    findstr /b /c:"%%i " "%Quelle%" >nul && (findstr /b /c:"%%i " "%Quelle%" >>"%Erg%") || (echo %%i konnte in %Quelle% nicht gefunden werden)  
)