per batch textfile mit Dateipfad-und-Namen auslesen, Dateipfad erzeugen, Datei kopieren
Hallo, als Forumneuling erst mal herzliche Grüße an Alle, die mir helfen wollen.
Kommentare wie: Dau, Honk, Hauptschüler... lassen mich kalt (für die, die nicht so gern helfen)
Mein Problem (wenn es denn eins ist)
Ist-Stand: - Laufwerk mit Unterordnern (P:\OrdnA\OrdnB)
(P:\OrdnA\OrdnB\OrdnB1) und (P:\OrdnA\OrdnB\OrdnB2)
- in diesen Ordnern, bzw. Unterordnern befinden sich Dateien - (OLE.SVZ in P:\OrdnA\OrdnB\OrdnB1)
(hört...hört - jetzt hab ich echt wie ein Honk geschrieben)
- ich bekomme von User A ein Textfile, in dem diese Dateien untereinander aufgelistet sind (Dateien sind eineindeutig benannt)
Ich-möchte: - die Dateien auf besagtem Laufwerk finden
- den Dateipfad zu den gefundenen Dateien in einem Ordner (z.B. c:\1) in der Struktur (C:\1\OrdnA\OrdnB\OrdnB1) generieren
- die Datei OLE.SVZ in den Ordner auf C:\1 kopieren, in dem erzeugten Pfad/Ordner (c:\1\OrdnA\OrdnB\OrdnB1)
- das Ganze möchte ich dann automatisch für jede im Textfile aufgelistete Datei
Hab schon ein paar Sachen probiert mit ner FOR-Schleife und TOKEN, aber ich bekomme die Syntax irgendwie nich auf die Reihe.
Wenn mir jemand helfen könnte, wäre das super.
Danke
der woro
Kommentare wie: Dau, Honk, Hauptschüler... lassen mich kalt (für die, die nicht so gern helfen)
Mein Problem (wenn es denn eins ist)
Ist-Stand: - Laufwerk mit Unterordnern (P:\OrdnA\OrdnB)
(P:\OrdnA\OrdnB\OrdnB1) und (P:\OrdnA\OrdnB\OrdnB2)
- in diesen Ordnern, bzw. Unterordnern befinden sich Dateien - (OLE.SVZ in P:\OrdnA\OrdnB\OrdnB1)
(hört...hört - jetzt hab ich echt wie ein Honk geschrieben)
- ich bekomme von User A ein Textfile, in dem diese Dateien untereinander aufgelistet sind (Dateien sind eineindeutig benannt)
Ich-möchte: - die Dateien auf besagtem Laufwerk finden
- den Dateipfad zu den gefundenen Dateien in einem Ordner (z.B. c:\1) in der Struktur (C:\1\OrdnA\OrdnB\OrdnB1) generieren
- die Datei OLE.SVZ in den Ordner auf C:\1 kopieren, in dem erzeugten Pfad/Ordner (c:\1\OrdnA\OrdnB\OrdnB1)
- das Ganze möchte ich dann automatisch für jede im Textfile aufgelistete Datei
Hab schon ein paar Sachen probiert mit ner FOR-Schleife und TOKEN, aber ich bekomme die Syntax irgendwie nich auf die Reihe.
Wenn mir jemand helfen könnte, wäre das super.
Danke
der woro
Sorry, erster NOOB-FOULT: BS ist WinXP Pro<<
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 19943
Url: https://administrator.de/contentid/19943
Ausgedruckt am: 22.11.2024 um 02:11 Uhr
9 Kommentare
Neuester Kommentar
Moin worugu,
wenn das Textfile "Dateiliste.txt" so aufgebaut ist:
~~~Dateiliste.txt
P:\OrdnA\OrdnB\OrdnB1\OLE.SVZ
P:\OrdnA\OrdnB\OrdnB1\OLB24.SVZ
P:\OrdnA\OrdnB\OrdnB1\Und mal einer mit Leerzeichen dabei\OLE.SVZ
~~~Dateiliste.txt
und Du auf c:\1 Verzeichnisse anlegen willst, egal ob diese aufgelisteten Dateien auch tatsächlich auf P: vorhanden sind, wären zwei Oneliner-Möglichkeiten im Batch:
For /F "delims=" %%i in (dateiliste.txt) do (md "c:\1%%~pi" 2>nul) & copy "%%i" "c:\1%%~pi"
oder *
For /F "delims=" %%i in (dateiliste.txt) do xcopy /i /y /s "%%i" c:\1
Da es sich ja kaum lohnt, dafür einen Batch zu schreiben, tipp das am CMD-Prompt ein und ersetz das "%%" dann durch "%".
HTH Biber
P.S. Was ist denn ein Honk?
wenn das Textfile "Dateiliste.txt" so aufgebaut ist:
~~~Dateiliste.txt
P:\OrdnA\OrdnB\OrdnB1\OLE.SVZ
P:\OrdnA\OrdnB\OrdnB1\OLB24.SVZ
P:\OrdnA\OrdnB\OrdnB1\Und mal einer mit Leerzeichen dabei\OLE.SVZ
~~~Dateiliste.txt
und Du auf c:\1 Verzeichnisse anlegen willst, egal ob diese aufgelisteten Dateien auch tatsächlich auf P: vorhanden sind, wären zwei Oneliner-Möglichkeiten im Batch:
For /F "delims=" %%i in (dateiliste.txt) do (md "c:\1%%~pi" 2>nul) & copy "%%i" "c:\1%%~pi"
oder *
For /F "delims=" %%i in (dateiliste.txt) do xcopy /i /y /s "%%i" c:\1
Da es sich ja kaum lohnt, dafür einen Batch zu schreiben, tipp das am CMD-Prompt ein und ersetz das "%%" dann durch "%".
HTH Biber
P.S. Was ist denn ein Honk?
Tja, woro,
ursprünglich wollte ich ja vorhin nachfragen, ob denn nun in der "dateiliste.txt" die vollständigen Namen mit Pfad stehen oder nur die Dateinamen ohne Pfadangaben. Dann habe ich noch einen Blick auf den Titel geworfen und dachte: Ach Quatsch - da steht doch ganz eindeutig "mit Dateipfad".. nun aber doch suchen mit "DIR p:...."??
Also : wenn Du nur zwei Informationen hast (oder kommunizierst), nämlich den Quell-Pfad-und-Dateinamen und den für alle Dateien gemeinsamen neuen Ziel-Root-Ordner..dann ist kaum mehr automatisierbar als die zwei Zeilen oben.
Jetzt scheinen ja noch zwei Zusatzregeln dazuzukommen:
- die Dateien sind halt (jeweils ein einziges Mal irgendwo auf Laufwerk P: bzw. in einem bestimmten Zweig von P:\
- es wird u.U. nicht die ganze Verzeichnisstruktur "repliziert", sondern nur ein Teil-Zweig
Demnach sieht die Dateiliste also heute doch nur so ausFragezeichen)???
~~~Dateiliste.txt
OLE.SVZ
OLB24.SVZ
OLE.SVZ
~~~Dateiliste.txt
Okay, die Dateien dann zu finden (wenn sie denn "einmalig ab Such-Startverzeichnis" unter diesem Namen vorhanden sind), mag ja angehen.
Aber wo sind die Infos "Ab Verzeichnisebene xyz suchen" und "erste Verzeichnisebene nicht replizieren"? Sind das neue Spalten in der Dateiliste? Andere Dateien? Oder logische Regeln?
Ich bitte nun doch um einen (skizzierten) Abdruck der "dateiliste.txt" oder wie sie bei Dir heißt und Erläuterung zu den obigen Fragen.
Dann schauen wir weiter.
Biber
ursprünglich wollte ich ja vorhin nachfragen, ob denn nun in der "dateiliste.txt" die vollständigen Namen mit Pfad stehen oder nur die Dateinamen ohne Pfadangaben. Dann habe ich noch einen Blick auf den Titel geworfen und dachte: Ach Quatsch - da steht doch ganz eindeutig "mit Dateipfad".. nun aber doch suchen mit "DIR p:...."??
Also : wenn Du nur zwei Informationen hast (oder kommunizierst), nämlich den Quell-Pfad-und-Dateinamen und den für alle Dateien gemeinsamen neuen Ziel-Root-Ordner..dann ist kaum mehr automatisierbar als die zwei Zeilen oben.
Jetzt scheinen ja noch zwei Zusatzregeln dazuzukommen:
- die Dateien sind halt (jeweils ein einziges Mal irgendwo auf Laufwerk P: bzw. in einem bestimmten Zweig von P:\
- es wird u.U. nicht die ganze Verzeichnisstruktur "repliziert", sondern nur ein Teil-Zweig
Demnach sieht die Dateiliste also heute doch nur so ausFragezeichen)???
~~~Dateiliste.txt
OLE.SVZ
OLB24.SVZ
OLE.SVZ
~~~Dateiliste.txt
Okay, die Dateien dann zu finden (wenn sie denn "einmalig ab Such-Startverzeichnis" unter diesem Namen vorhanden sind), mag ja angehen.
Aber wo sind die Infos "Ab Verzeichnisebene xyz suchen" und "erste Verzeichnisebene nicht replizieren"? Sind das neue Spalten in der Dateiliste? Andere Dateien? Oder logische Regeln?
Ich bitte nun doch um einen (skizzierten) Abdruck der "dateiliste.txt" oder wie sie bei Dir heißt und Erläuterung zu den obigen Fragen.
Dann schauen wir weiter.
Biber
Na ja, woro,
jetzt klingst Du langsam schon glaubwürdiger...
Und ich finde es immer wieder erstaunlich, was für neckische Details oft herauskommen, wenn ich einmal etwas ausführlicher nachfrage. Aber Du hast es jetzt sehr schön aufgedröselt.. jetzt kann es eigentlich irgendein weggefangener Azubi vom Bremer Hauptbahnhof so runterschreiben in irgendeiner Scriptsprache.
Was jetzt eigentlich fällig wäre, ist ein Hinterfragen dieser abstrusen Verteilmimik via Admin in eine Verzeichnisstruktur auf Zuruf... na ja, geht mich ja auch nichts an ;-9 und zu toppen ist das allemal ( s. hier: Variablen und Wildcards???).
Back to Thread...
Also, soooooooo holzig ist das ja gar nicht beim zweiten Hinsehen.
Die Form "dateiliste2.txt" sollte für die Verarbeitung immer der Ausgangspunkt sein.. wenn die Quelldatei-Namen in dieser Form vorliegen, dann ist der Rest auch automatisierbar. Wobei auch Wildcard-Fälle zugelassen sein sollten.
Die banalen (alle Dateien *.txt in P:\007\VP\UZA oder alle 123??.mdb in P:\007\EC\UZA etc) und
alle Dateien 12345.abc in irgendeinem Unterverzeichnis unterhalb P:\007\VP\
dateiliste2.txt
P:\007\VP\UZA\90112.txt
P:\007\VP\UZA\90134.txt
P:\007\VP\UZA\81345.mdb
P:\007\VP\*\12345.abc
dateiliste2.txt
Das "Bringen in Normalform" von einer dateiliste.txt (erstes Beispiel oben) in die "dateiliste2.txt"-Form geht natürlich wieder per Batch (Input-Datei "DateiNoPath.txt" siehe unten):
Output:
DATEINOPATH.TXT
90112.txt
90134.txt
81345.mdb
..wird zu..
p:\temp\90112.txt
p:\temp\90134.txt
p:\temp\81345.mdb
Überschreiben OK (J/N)? j
1 Datei(en) kopiert.
~~~~~~~~~~
Und ab dann, wenn Du Dich mit dieser Strategie anfreunden kannst, erstmal die "Quelldateien" in vereinheitlichter Form zu erwarten bzw. in Form zu bringen... dann können wir den Rest auch hinkriegen.
Ob da nun Dateien mit Leerzeichen im Namen sind oder nicht, macht mir nicht so viele Sorgen.
Also, falls Du jetzt noch nicht alles fertig hast, poste mal, wo Du grad stehst, dann steige ich gern wieder ein.
Grüße Biber
jetzt klingst Du langsam schon glaubwürdiger...
Und ich finde es immer wieder erstaunlich, was für neckische Details oft herauskommen, wenn ich einmal etwas ausführlicher nachfrage. Aber Du hast es jetzt sehr schön aufgedröselt.. jetzt kann es eigentlich irgendein weggefangener Azubi vom Bremer Hauptbahnhof so runterschreiben in irgendeiner Scriptsprache.
Was jetzt eigentlich fällig wäre, ist ein Hinterfragen dieser abstrusen Verteilmimik via Admin in eine Verzeichnisstruktur auf Zuruf... na ja, geht mich ja auch nichts an ;-9 und zu toppen ist das allemal ( s. hier: Variablen und Wildcards???).
Back to Thread...
Also, soooooooo holzig ist das ja gar nicht beim zweiten Hinsehen.
Die Form "dateiliste2.txt" sollte für die Verarbeitung immer der Ausgangspunkt sein.. wenn die Quelldatei-Namen in dieser Form vorliegen, dann ist der Rest auch automatisierbar. Wobei auch Wildcard-Fälle zugelassen sein sollten.
Die banalen (alle Dateien *.txt in P:\007\VP\UZA oder alle 123??.mdb in P:\007\EC\UZA etc) und
alle Dateien 12345.abc in irgendeinem Unterverzeichnis unterhalb P:\007\VP\
dateiliste2.txt
P:\007\VP\UZA\90112.txt
P:\007\VP\UZA\90134.txt
P:\007\VP\UZA\81345.mdb
P:\007\VP\*\12345.abc
dateiliste2.txt
Das "Bringen in Normalform" von einer dateiliste.txt (erstes Beispiel oben) in die "dateiliste2.txt"-Form geht natürlich wieder per Batch (Input-Datei "DateiNoPath.txt" siehe unten):
::--snipp PfadDazu.bat
::--Dateiliste ohne Pfadangaben in eine DateiListe mit Pfadangaben transformieren.
:: Annahme - die Pfadangaben selbst enthalten KEINE Leerzeichen.
@echo off & setlocal
If [%1]== (goto Syntax) Else IF [%2]== goto Syntax
if exist "%1" goto start
:syntax
(echo Fehlender/Ungültiger Parameter. Aufruf: %0 ^<DateiListeOhnePfad.ext^> ^<strPfadDazu^>) & goto :eof
:start
Set "tmpNew=%temp%\%random%.txt"
Echo.>%tmpnew%
For /f "delims=" %%i in (%1) do echo %2\%%~i>>%tmpnew%
find "." %1 & (Echo ..wird zu..) & type %tmpNew%
set /p OK="Überschreiben OK (J/N)? "
if /i [%OK%]==[J] copy /y %tmpnew% %1
goto :eof
::--snapp Pfaddazu.bat
Pfaddazu DateiNoPath.txt p:\temp
DATEINOPATH.TXT
90112.txt
90134.txt
81345.mdb
..wird zu..
p:\temp\90112.txt
p:\temp\90134.txt
p:\temp\81345.mdb
Überschreiben OK (J/N)? j
1 Datei(en) kopiert.
~~~~~~~~~~
Und ab dann, wenn Du Dich mit dieser Strategie anfreunden kannst, erstmal die "Quelldateien" in vereinheitlichter Form zu erwarten bzw. in Form zu bringen... dann können wir den Rest auch hinkriegen.
Ob da nun Dateien mit Leerzeichen im Namen sind oder nicht, macht mir nicht so viele Sorgen.
Also, falls Du jetzt noch nicht alles fertig hast, poste mal, wo Du grad stehst, dann steige ich gern wieder ein.
Grüße Biber
Also, woro,
ich bin nicht ganz sicher, ob und wo Du grad hängst..
...ich schwafel mal vor mich hin, vielleicht hilft es ja.
Wenn/Falls Deine Datei ungefähr so aussieht jetzt:
::-------snipp woru111.txt
p:\Dokumente und Einstellungen\user\dau\90112.txt
p:\Dokumente und Einstellungen\user55\dau\90114.txt
p:\Dokumente und Einstellungen\Lokale Einstellungen\user23\dau\90117.txt
::-------snipp woru111.txt
dann lässt die sich jetzt ja mal zur Abwechslung zerlegen mit "\" als Trennzeichen.
Beispiel vom CMD-Prompt:
$MyPrompt$for /f "tokens=1,2,3,4,* delims=\" %i in (woru111.txt) do @echo %i %j %k %l %m
p: Dokumente und Einstellungen user dau 90112.txt
p: Dokumente und Einstellungen user55 dau 90114.txt
p: Dokumente und Einstellungen Lokale Einstellungen user23 dau\90117.txt
etwas deutlicher:
$MyPrompt$for /f "tokens=1,2,3,4,* delims=\" %i in (woru111.txt) do @echo 1:[%i] 2=[%j] 3=[%k] 4=[%l] 5=[%m]
1:[p:] 2=[Dokumente und Einstellungen] 3=[user] 4=[dau] 5=[90112.txt]
1:[p:] 2=[Dokumente und Einstellungen] 3=[user55] 4=[dau] 5=[90114.txt]
1:[p:] 2=[Dokumente und Einstellungen] 3=[Lokale Einstellungen] 4=[user23] 5=[dau\90117.txt]
ergo, falls Du Das Laufwerk (=Token 1) und die ersten beiden Unterpfadebenen nicht willst:
Pfad ab Ebene 4: [dau\90114.txt]
Pfad ab Ebene 4: [user23\dau\90117.txt]
HTH Biber
ich bin nicht ganz sicher, ob und wo Du grad hängst..
...ich schwafel mal vor mich hin, vielleicht hilft es ja.
Wenn/Falls Deine Datei ungefähr so aussieht jetzt:
::-------snipp woru111.txt
p:\Dokumente und Einstellungen\user\dau\90112.txt
p:\Dokumente und Einstellungen\user55\dau\90114.txt
p:\Dokumente und Einstellungen\Lokale Einstellungen\user23\dau\90117.txt
::-------snipp woru111.txt
dann lässt die sich jetzt ja mal zur Abwechslung zerlegen mit "\" als Trennzeichen.
Beispiel vom CMD-Prompt:
$MyPrompt$for /f "tokens=1,2,3,4,* delims=\" %i in (woru111.txt) do @echo %i %j %k %l %m
p: Dokumente und Einstellungen user dau 90112.txt
p: Dokumente und Einstellungen user55 dau 90114.txt
p: Dokumente und Einstellungen Lokale Einstellungen user23 dau\90117.txt
etwas deutlicher:
$MyPrompt$for /f "tokens=1,2,3,4,* delims=\" %i in (woru111.txt) do @echo 1:[%i] 2=[%j] 3=[%k] 4=[%l] 5=[%m]
1:[p:] 2=[Dokumente und Einstellungen] 3=[user] 4=[dau] 5=[90112.txt]
1:[p:] 2=[Dokumente und Einstellungen] 3=[user55] 4=[dau] 5=[90114.txt]
1:[p:] 2=[Dokumente und Einstellungen] 3=[Lokale Einstellungen] 4=[user23] 5=[dau\90117.txt]
ergo, falls Du Das Laufwerk (=Token 1) und die ersten beiden Unterpfadebenen nicht willst:
for /f "tokens=4,* delims=\" %i in (woru111.txt) do @echo Pfad ab Ebene 4: [%i\%j]
Pfad ab Ebene 4: [dau\90112.txt]Pfad ab Ebene 4: [dau\90114.txt]
Pfad ab Ebene 4: [user23\dau\90117.txt]
HTH Biber