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, 10233 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 ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Text-Datei auslesen und Inhalt als Parameter übergeben (1)

Frage von aubm2013 zum Thema Batch & Shell ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
gelöst PowerShell, Log Datei auslesen, bei Änderungen E-Mail senden (12)

Frage von swissbull zum Thema Batch & Shell ...

Microsoft Office
Excel Dateien durchsuchen und Werte einzeln in neue Excel Datei auslesen (1)

Frage von krischanii zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...