Top-Themen

Aktuelle Themen (A bis Z)

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, 10297 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
VB for Applications
Dateien nach "Text" durchsuchen und Pfad ausgeben
Frage von chgs2011VB for Applications32 Kommentare

Hallo, ich suche dringend ein kleines VBScript. Das Script soll einen bestimmt Text in Dateien suchen, den der Benutzer ...

Batch & Shell
Powershell Pfad überprüfen
gelöst Frage von H41mSh1C0RBatch & Shell11 Kommentare

Hi @ PS Profis, Irgendwie seh ich den Wald vor lauter Bäumen nicht. (oder es ist einfach Zeit für ...

Outlook & Mail
Outlook 2007 - Suchfunktion: Die Datei kann nicht gefunden werden. Überprüfen sie den Pfad und den Dateinamen
Frage von staybbOutlook & Mail3 Kommentare

Hallo, ich habe an einem Outlook 2007 Client unter Windows 7 das Problem, wenn ich in einem Ordner etwas ...

Batch & Shell
Powershell - Pfade und Dateien vergleichen nicht möglich da Pfad oder Dateiname zu lang
gelöst Frage von oliver12Batch & Shell9 Kommentare

Moin, ich bin dabei einen File-Server zu replizieren bzw. auf einen neuen zu wechseln. Um zu überprüfen ob beide ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 103 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 1 TagInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 1 TagDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Windows Server
GPO nur für bestimmte Computer
Frage von Leo-leWindows Server13 Kommentare

Hallo Forum, gern würde ich ein Robocopy script per Bat an eine GPO hängen. Wichtig wäre aber dort der ...

Windows Server
KMS Facts for Client configuration
Frage von winlinWindows Server13 Kommentare

Hey Leute, wir haben in unserem Netz nun einen neuen KMS Server. Haben Bestands-VMs die noch nicht aktiviert sind. ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

Windows Tools
Software-Tool zum Entfernen von bösartigem Windows
Frage von emeriksWindows Tools11 Kommentare

Hi, siehe Betreff hat das jemals irgendjemand schonmal sinnvoll eingesetzt? (MRT) E.