diwaffm
Goto Top

Verzeichnis überwachen und neue Dateien automatiosch umbenennen

Hi Leute,

ich suche ein Tool / Skript unter Windows, dass ein Verzeichnis überwacht und neu dort abgelegte (Text-)Dateien umbenennt - und zwar umbenennt, in dem es Teile der ersten Zeile des Inhalts als Dateinamen verwendet...

Zwar habe ich für einzelne Teilaufgaben hier schon Infos gefunden - schaffe es aber nicht, diese vernünftig zusammenzufügen.

Die umzubenennenden Dateien kann ich in einem separaten (Unter-) Verzeichnis ablegen und mit einem Prefix versehen, der gelöscht werden kann, wenn die Datei bearbeitet ist. Alternativ könnte die ganze Originaldatei nach der Bearbeitung gelöscht werden.
Die bearbeitete/umbenannte Datei kann dann in einem anderen Verzeichnis gespeichert werden.

Die Dateien haben Namen in der Form "90000019-90000019-02.lif"

Die erste Zeile hat einen Inhalt ähnlich dieser Zeile:

90000019,90000019,2,60m (7HK) Riege 3 MJA,,,,,,,

Die Datei soll in "60m (7HK) Riege 3 MJA-02.lif" umbenannt werden...


In der Zwischenzeit schaffe ich es, mit alle Dateien mit Namen wie "__ 90000019-90000019-02.lif" anzeigen zu lassen (den PRefix "__ " lasse ich durch die Anwendung dazuschreiben, die die Datei erzeugt.)

Die Datei umbenennen bzw. kopieren kriege ich auch noch hin.
Doch den neuen Namen aus der Datei extraieren kriege ich nicht hin...

Merci

dirk

Content-Key: 134908

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

Printed on: April 23, 2024 at 18:04 o'clock

Member: AndreasBrecht
AndreasBrecht Feb 02, 2010 at 11:00:57 (UTC)
Goto Top
Wo genau hängt es denn? Kannst Du die Datei nicht einlesen, oder weißt Du nicht, wie Du den Teilstring aus dem Eingelesenen rausfummeln sollst?
Member: diwaffm
diwaffm Feb 02, 2010 at 11:07:55 (UTC)
Goto Top
Wohl eine Kombination aus beidem face-wink

Das "Rausfummeln" sollte eigentlich mit

FOR /F "skip=3 tokens=1 delims=," %%j in (%%Datei%%) do

gehen.

Allerdings sucht er in DIESER Variante im Dateinamen und nicht in der Datei...

Ciao

dirk
Member: diwaffm
diwaffm Feb 02, 2010, updated at Oct 18, 2012 at 16:41:02 (UTC)
Goto Top
Ich habe nun
	FOR /F "tokens=4 delims=," %%j in ( 90000019-90000019-02.lif ) do	echo 8- %%j  
ausprobiert - und bekomme die jeweils 4. "Spalte" ALLER Zeilen der Datei 90000019-90000019-02.lif angezeigt.

Ich brauch aber nur die erste Zeile.

Ein ähnliches Problem wird hier (per batch neue dateien in verzeichnis auslesen, dateinamen als variable in xml datei einfügen.) beschrieben.
Leider komme ich mit der Lösung dort nicht weiter.

Wenn ich

FOR %%i in (*.lif) do (
	echo %%~ni
	FOR /F "tokens=4 delims=," %%j in ( 'echo %%~ni' ) do echo  %%j  
)

ausführe, bekomme ich durch "echo %%~ni" die Dateinamen angezeigt - allerdings kommt keine
Ausgabe innerhalb der inneren FOR Schleife...

Ciao

dirk
Member: AndreasBrecht
AndreasBrecht Feb 02, 2010 at 12:32:39 (UTC)
Goto Top
Lass es mich mal so sagen, wenn Du nix gegen vb script einzuwenden hast,kann ich Dir sagen wie's geht, aonst eher nicht. (Du kannst auch mit cscript.exe ein script aus einer batch aufrufen).
Member: diwaffm
diwaffm Feb 02, 2010 at 14:41:24 (UTC)
Goto Top
Mit dem Skripting Host hab' ich früher auch mal gespielt - ist aber laaange her face-wink

Solange er zum Ziel führt, ist mir der Weg eigentlich egal...

Ciao

dirk
Member: diwaffm
diwaffm Feb 02, 2010 at 17:31:07 (UTC)
Goto Top
So,

hier mal meine bisherigen Ergebnisse:
@echo off
CLS

for %%i in (__*.lif) do (
	echo Betrachte Datei %%i
	Set Datei = %%i
	FOR /F \"tokens=4 delims=,\" %%j in (%Datei%) do (  
		set name=%%j
		goto :exit
	)
	:exit
	echo Name: \"%name%\"  
	FOR /F \"tokens=3 delims=-\" %%a in (\"%i\") do (  
	  set lauf=%%a
	)
	echo Lauf: \"%lauf%\"  

	echo  Verschiebe Datei \"%%i\" nach \"%name%-%lauf%\"  
	rename \"%%i\" \"%name%-%lauf%\"  
)

:eof

Es ist eine Datei im Verzeichnis, die der Maske \"__*.lif\" entspricht - und diese enthält die folgende erste Zeile:

90000021,90000021,2,60m Hürden (5HK) Riege 7 WJB,,,,,,,

Es müsste also als \"name\" eigentlich \"60m Hürden (5HK) Riege 7 WJB\" ausgelesen werden.

Und da der Dateiname \"__ 90000021-90000021-02.lif\" lautet, müsste \"lauf\" \"02.lif\" enthalten.

Beide Variablen sind aber leer...

Dirk
Member: pieh-ejdsch
pieh-ejdsch Feb 02, 2010 at 23:45:02 (UTC)
Goto Top
Hallo Dirk,

haben Deine lif Dateien nun am Anfang dieses __ unterstichvorsatzetwas oder nicht?
in Deiner nächsten Schleife Zeile 13. ist Deine lif wieder im Übergeordneten Verzeichnis oder irgendwie undefinierbar.

möchtest Du diese Datei nun Verschieben oder nur umbenennen? Im Moment egal die Zeile wird in der Datei überprüft und nur wenn diese im Dateinamen enthalten ist auch entsprechend umbenannt.

@echo off & setlocal
chcp 1252>nul
for %%i in (*.lif) do (
	echo Betrachte Datei %%i
	set "Datei=%%i"  
	for /f "tokens=1-3 delims=-" %%j in ("%%i") do set "end=%%l" & set "pre=%%j%%k"   
	call :readone
)
chcp 850>nul
pause
:readone
for /f "useback tokens=1-9 delims=, " %%i in ("%Datei%") do if not "%pre%" == "%%i%%j" (goto :eof) else echo Verschiebe "%Datei%" & move "%Datei%" "%%l %%m %%n %%o %%p %%q-%end%" & goto :eof  

für einen Pfad zum Arbeiten würde ein
pushD "D:\Verzeichnis" empfehlenswert sein als zweite Zeile.

Gruß Phil
Member: diwaffm
diwaffm Feb 03, 2010 at 08:06:39 (UTC)
Goto Top
Zitat von @pieh-ejdsch:

haben Deine lif Dateien nun am Anfang dieses __ unterstichvorsatzetwas oder nicht?

Ja, sie haben...

in Deiner nächsten Schleife Zeile 13. ist Deine lif wieder im Übergeordneten Verzeichnis oder irgendwie undefinierbar.

?
Das sollte auf die gleiche Datei - nur halt diesmal auf den Inhalt verweisen...


möchtest Du diese Datei nun Verschieben oder nur umbenennen?

Umbenennen - die original-Datei wird nicht benötigt.

Im Moment egal die Zeile wird in der Datei überprüft
und nur wenn diese im Dateinamen enthalten ist auch entsprechend umbenannt.

?
Aus der ersten Zeile soll der 4. Teilstring extraiert werden und als neuer Dateiname verwendet werden...


Dein Skript werde ich mir mal in Ruhe vornehmen.
Ich habe meines gestern Abend noch ein wenig angepasst - und es scheint zu funktionieren.
Das werde ich heute Mittag in "live" sehen face-wink

ciao

dirk