Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: rdietrich

rdietrich (Level 1) - Jetzt verbinden

16.01.2009, aktualisiert 19.01.2009, 10285 Aufrufe, 5 Kommentare

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-----------------------------
01.
@echo off 
02.
 
03.
 
04.
REM # Hauptschleife, durchlaeuft Textdatei und prueft. 
05.
 
06.
for /f "tokens=*" %%i IN (test.txt) DO if exist %%i call :ausgeben "%%i" 
07.
 
08.
echo. 
09.
echo Fertig.. 
10.
echo. 
11.
pause 
12.
goto :eof 
13.
 
14.
:ausgeben 
15.
		 
16.
	set mypfad=%1 
17.
 
18.
	set mytmp=%mypfad:~1,2% 
19.
	 
20.
	 
21.
	for %%x in (c: C: d: D: e: E:) do IF "%mytmp%"=="%%x" ( 
22.
		 
23.
		echo. 
24.
		echo ---------------------- 
25.
		echo Pfad mit Datei: %mypfad% 
26.
 
27.
		for %%y in (%mypfad%) do ( 
28.
			set tempDatei=%%~ny%%~xy  
29.
			echo tempdatei: %tempDatei% 
30.
31.
 
32.
		for %%j in (%mypfad%) do ( 
33.
			set tempPfad=%%~dj%%~pj 
34.
			echo tempPfad: %tempPfad% 
35.
36.
		echo ---------------------- 
37.
		echo. 
38.
39.
 
40.
 
41.
	 
42.
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?
Mitglied: Biber
16.01.2009 um 16:43 Uhr
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
Bitte warten ..
Mitglied: bastla
16.01.2009 um 17:08 Uhr
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:
01.
@echo off & setlocal 
02.
:: # aktuelle CP zwischenspeichern, ANSI-Codepage setzen 
03.
for /f "tokens=3 delims=. " %%i in ('chcp') do set "CP=%%i" 
04.
chcp 1252>nul 
05.
 
06.
REM # Hauptschleife, durchlaeuft Textdatei und prueft. 
07.
for /f "delims=" %%i in (test.txt) do if exist "%%i" call :ausgeben "%%i" 
08.
 
09.
:: # vorherige Codepage wieder herstellen 
10.
chcp %CP% >nul 
11.
 
12.
echo. 
13.
echo Fertig.. 
14.
echo. 
15.
pause 
16.
goto :eof 
17.
 
18.
:ausgeben 
19.
set "mypfad=%~1" 
20.
echo %mypfad:~,2%|findstr /i "C: D: E:">nul || goto :eof 
21.
 
22.
set "tempDatei=%~nx1" 
23.
set "tempPfad=%~dp1" 
24.
 
25.
echo. 
26.
echo ---------------------- 
27.
echo Pfad mit Datei: %mypfad% 
28.
echo tempdatei: %tempDatei% 
29.
echo tempPfad: %tempPfad% 
30.
echo ---------------------- 
31.
echo. 
32.
 
33.
goto :eof
Bliebe als (hoffentlich) einziges Problem noch dieses: E ...

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

Grüße
bastla
Bitte warten ..
Mitglied: rdietrich
19.01.2009 um 11:07 Uhr
ah, das funktioniert prima. vielen dank.

zugegebenermaßen verstehe ich nicht wirklich, was dort passiert, aber die hauptsache ist wohl dass es funktioniert.
Bitte warten ..
Mitglied: bastla
19.01.2009 um 12:04 Uhr
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 Zeile 20 werden (da ich das Anführungszeichen nicht in die Variable schreibe) die ersten beiden Zeichen des Pfades (= Laufwerksbuchstabe: ) mit einer Liste von lokalen Laufwerksbuchstaben verglichen (durch das "/i" bei "findstr" wird dabei nicht auf Groß-/Kleinschreibung geachtet) und durch die Schreibweise "||" der folgende Befehl (Rücksprung) nur ausgeführt, wenn der Laufwerksbuchstabe nicht in der Liste "C: D: E:" aufscheint.

Die verwendete Schreibweise mit "||" ist eine Abkürzung für "if errorlevel1" und sorgt dafür, dass die folgende Anweisung nur ausgeführt wird, wenn die vorhergehende Anweisung einen Fehler (Errorlevel > 0) verursacht hat (bei "findstr" wird "nicht gefunden" mit Errorlevel=1 gekennzeichnet).

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

Grüße
bastla
Bitte warten ..
Mitglied: rdietrich
19.01.2009 um 12:50 Uhr
bin beeindruckt vom umfang der kompetenten unterstützung und kann mich nur nochmals bedanken.

gruß,

r.d.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst ZIP-Archive nach Dateien durchsuchen und Pfade ausgeben (33)

Frage von evinben zum Thema Batch & Shell ...

Batch & Shell
Leerzeichen im Pfad (4)

Frage von Jallio zum Thema Batch & Shell ...

Batch & Shell
gelöst Datei zeilenweise auslesen - es passiert aber nichts (3)

Frage von Nagus zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Tools

Zeit für Energiesparmodus, Bildschirmabschaltung etc. schnell anpassen

Anleitung von hannsgmaulwurf zum Thema Windows Tools ...

Linux Netzwerk

Ping und das einstellbare Bytepattern

(1)

Erfahrungsbericht von LordGurke zum Thema Linux Netzwerk ...

Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

(4)

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Heiß diskutierte Inhalte
Firewall
Richtige Grundeinstellungen der Pfsense für mein Netzwerk (12)

Frage von Spitzbube zum Thema Firewall ...

Switche und Hubs
gelöst Cisco 2960x Stacking über mehrere Etagen (12)

Frage von b3scher zum Thema Switche und Hubs ...