rdietrich
Goto Top

Pfade aus Text-Datei auslesen, überprüfen und Dateinamen vom Pfad extrahieren.

Hallo zusammen, habe mich eben mal angemeldet und möchte auch gleich das erste Problem aufführen, bei dem ich Hilfe benötige. Habe Administrator.de bisher nur als Anonymous genießen dürfen und bedanke mich hiermit schonmal für die vielen Male, wo mir die verschiedenen Beiträge und Howtos geholfen haben.

Mein Problem:

Ich habe eine Text-Datei, in der eine Reihe von Pfaden zu Dateien aufgeführt sind. Ich möchte diese Text-Datei in einer Schleife durchlaufen, jeden Eintrag auf Existenz überprüfen und auch, ob der aktuelle Pfad lokal oder auf einem Share liegt. Für den Fall, dass die Datei lokal existiert, soll der Dateiname vom Pfad getrennt werden und beide Werte in Variablen geschrieben werden.

Beispielinhalt der Text-Datei:
C:\Programme\test.txt
U:\blah\test.db
C:\wäs für nen mist mit umläuten.txt
C:\Programme\test\la la la.txt
C:\Programme\test2.txt
C:\Programme\mein kleiner test.txt
  1. ------------Ende test.txt-----------------------------

Zum Testen habe ich die Dateien C:\Programme\test.txt und mein kleiner test.txt angelegt.

  1. ------------Start test.bat-----------------------------
@echo off


REM # Hauptschleife, durchlaeuft Textdatei und prueft.

for /f "tokens=*" %%i IN (test.txt) DO if exist %%i call :ausgeben "%%i"  

echo.
echo Fertig..
echo.
pause
goto :eof

:ausgeben
		
	set mypfad=%1

	set mytmp=%mypfad:~1,2%
	
	
	for %%x in (c: C: d: D: e: E:) do IF "%mytmp%"=="%%x" (  
		
		echo.
		echo ----------------------
		echo Pfad mit Datei: %mypfad%

		for %%y in (%mypfad%) do (
			set tempDatei=%%~ny%%~xy 
			echo tempdatei: %tempDatei%
		)

		for %%j in (%mypfad%) do (
			set tempPfad=%%~dj%%~pj
			echo tempPfad: %tempPfad%
		)
		echo ----------------------
		echo.
	)


	
goto :eof
  1. ------------Ende test.bat-----------------------------

soweit, so schlecht. funktioniert eher mittelpraechtig bis gar nicht. kommt zwar keine fehlermeldung, aber die ausgabe ist sehr verwirrend, da die Ausgabe von Pfad und Dateiname des ersten Schleifendurchlaufs scheinbar erst beim zweiten Schleifendurchlauf gezeigt wird und dafür beim ersten Schleifendurchlauf nichts angezeigt wird.

  1. ------------Start Ausgabe test.bat-----------------------------
----------------------
Pfad mit Datei: "C:\Programme\test.txt"
tempdatei:
tempPfad:
----------------------

----------------------
Pfad mit Datei: "C:\Programme\mein kleiner test.txt"
tempdatei: test.txt
tempPfad: C:\Programme\
----------------------

Fertig..

Drücken Sie eine beliebige Taste . . .
  1. ------------Ende Ausgabe test.bat-----------------------------

Wenn jemand einen Tipp hat, vielleicht einen Zaunpfahl, der mir den Weg zur richtigen Lösung zeigt, bin ich wirklich dankbar.

Gruß,

R.D.

P.S.: Wie kann ich das ungewollte Emoticon deaktivieren?

Content-Key: 106255

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

Printed on: April 24, 2024 at 07:04 o'clock

Member: Biber
Biber Jan 16, 2009 at 15:43:21 (UTC)
Goto Top
Moin rdietrich,

willkommen im Forum.
P.S.: Wie kann ich das ungewollte Emoticon deaktivieren?
Durch die so genannte Code-Formatierung, siehe den Link "Formatierungshilfe") bei Schreiben eines Beitrags/Kommentars oder in den FAQ.

Codezeilen konnen in < code > </ code > [ohne Leerzeichen] gesetzt werden.

Grüße
Biber
Member: bastla
bastla Jan 16, 2009 at 16:08:01 (UTC)
Goto Top
Hallo rdietrich und willkommen im Forum!
die ausgabe ist sehr verwirrend, da die Ausgabe von Pfad und Dateiname des ersten Schleifendurchlaufs scheinbar erst beim zweiten Schleifendurchlauf gezeigt wird und dafür beim ersten Schleifendurchlauf nichts angezeigt wird.
Durch Verwendung von "delayedExpansion" ließe sich verhindern, dass den Variablen %tempDatei% und %tempPfad% zwar innerhalb der "for"-Schleife ein Wert zugewiesen wird, dieser aber erst nach der Schleife "aufgelöst" (und damit ausgelesen) werden kann - allerdings geht es auch einfacher ...

Zusammen mit einem Mittel gegen den "mist mit umläuten" sähe das dann etwa so aus:
@echo off & setlocal
:: # aktuelle CP zwischenspeichern, ANSI-Codepage setzen
for /f "tokens=3 delims=. " %%i in ('chcp') do set "CP=%%i"  
chcp 1252>nul

REM # Hauptschleife, durchlaeuft Textdatei und prueft.
for /f "delims=" %%i in (test.txt) do if exist "%%i" call :ausgeben "%%i"  

:: # vorherige Codepage wieder herstellen
chcp %CP% >nul

echo.
echo Fertig..
echo.
pause
goto :eof

:ausgeben
set "mypfad=%~1"  
echo %mypfad:~,2%|findstr /i "C: D: E:">nul || goto :eof  

set "tempDatei=%~nx1"  
set "tempPfad=%~dp1"  

echo.
echo ----------------------
echo Pfad mit Datei: %mypfad%
echo tempdatei: %tempDatei%
echo tempPfad: %tempPfad%
echo ----------------------
echo.

goto :eof
Bliebe als (hoffentlich) einziges Problem noch dieses: Eface-smile ... face-wink

Dagegen hilft ein günstig platziertes Leerzeichen: E: ) oder vielleicht doch besser die Verwendung der ...

Grüße
bastla
Member: rdietrich
rdietrich Jan 19, 2009 at 10:07:06 (UTC)
Goto Top
ah, das funktioniert prima. vielen dank.

zugegebenermaßen verstehe ich nicht wirklich, was dort passiert, aber die hauptsache ist wohl dass es funktioniert.
Member: bastla
bastla Jan 19, 2009 at 11:04:24 (UTC)
Goto Top
Hallo rdietrich!

zugegebenermaßen verstehe ich nicht wirklich, was dort passiert
Viel ist es ja nicht, und kaum anders als in Deinem ersten Ansatz ...

Die Zeilen 3, 4, und 10 dienen nur dem vorübergehenden Ändern der Codepage, sodass Umlaute entsprechend angezeigt werden.



In den Zeilen 22 und 23 schließlich habe ich nur noch die Schreibweise von zB "%%~dj%%~pj" reduziert auf "%%~dpj".

Grüße
bastla
Member: rdietrich
rdietrich Jan 19, 2009 at 11:50:35 (UTC)
Goto Top
bin beeindruckt vom umfang der kompetenten unterstützung und kann mich nur nochmals bedanken.

gruß,

r.d.