worogu
Goto Top

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

Sorry, erster NOOB-FOULT: BS ist WinXP Pro<<

Content-ID: 19943

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

Ausgedruckt am: 22.11.2024 um 02:11 Uhr

worogu
worogu 21.11.2005 um 09:17:20 Uhr
Goto Top
OK... hat wohl keiner Lust mir zu helfen...
also, bin nun schon soweit, dass ich mit:

for /f "delims=: tokens=" %%i in ('dir /b /s U*') do mkdir c:\1\%N%

Alle Ordner und Unterordner die mit U anfangen in einem Ordner auf c:\1 repliziere.
Probleme gibt es nur, wenn die Ordnernamen Leerzeichen haben (z.B. c:\Dokumente und Einst...), ich weis, dass das am delims liegt - bekomme das aber nicht in den Griff
außerdem hab ich noch Schwierigkeiten wenn in der auszulesenden TEXTDATEI (siehe o.)
die Struktur (z.B. c:\Ordner1\Ordner2\fileA.xyz) ist, denn ich will ja erst mal nur \Ordner1\Ordner2 als neuen Ordner auf c:\1 erzeugen und dann die Datei fileA.xyz in diesen Ordner kopieren....

please help me
woro

> hab gerade ersst gecheckt, dass der Beitrag im Entwurfsstatus war, sorry... ich lerne das auch noch
Biber
Biber 21.11.2005 um 11:58:03 Uhr
Goto Top
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? face-wink
worogu
worogu 21.11.2005 um 13:30:09 Uhr
Goto Top
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? face-wink

Hi BIBER,
erst mal vielen Dank für die Antwort---bringt mich schon weiter (ein Stück zu mindest)
ist evtl nicht ganz klar geworden aus meinen S.O. Anfragen
wie gestaltet sich das
For /F "delims=" %%i in (dateiliste.txt) do (md "c:\1%%~pi" 2>nul) & copy "%%i" "c:\1%%~pi"
wenn ich nicht den ganzen Pfad (z.B. P:\OrdnA\OrdnB\OrdnB1 - also dann c:\1\OrdnA\OrdnB\OrdnB1), sondern erst ab Ordner B (C:\1\OrdnB\OrdnB1) generieren will
gibt es außerdem eine Möglichkeit, in der Klammer (dateiliste.txt) noch zusätzlich ein dir mit Unteroption nur in einem bestimmten Ordner zu durchsuchen (dir /b /s UCA* in OrdnB1)
etwa wie:
For /F "delims=" %%i in (´P: Dir /b /s datei*.xyz´) do (md "c:\1%%~pi" 2>nul) & copy "%%i" "c:\1%%~pi"

ach so, Honk
http://www.redensarten-index.de/suche.php?suchbegriff=ein+Honk&bool ...

Danke nochmal
woro
Biber
Biber 21.11.2005 um 16:00:21 Uhr
Goto Top
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 ausface-sadFragezeichen)???
~~~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
worogu
worogu 21.11.2005 um 16:43:08 Uhr
Goto Top
OK, ich seh schon... ich sollte mir erst mal darüber klar werden was ich will:::
User schreibt mir ne Mail mit (wenn er diszipliniert ist):
mail
Bitte Dateien von Ordner P:\007\VP\UZA
an EC senden
mail
mit nem Anhang:
dateiliste.txt
90112.txt
90134.txt
81345.mdb
dateiliste.txt

kann aber auch passieren, dass er so fit ist, und die Liste so aussehen lässt:

dateiliste2.txt
P:\007\VP\UZA\90112.txt
P:\007\VP\UZA\90134.txt
P:\007\VP\UZA\81345.mdb
dateiliste2.txt

Ich möchte diese Dateiliste (kann auch passieren, dass er mehrere Unterordner mit zugehörigen Dateien auflistet --- dateiliste3.txt) ab dem Ordner 007 in einem anderen Ordner (C:\1)
abbilden ---- c:\1\007\VP\UZA und die Dateien (deren Attrib. ich bestimme) in den betreffenden Ordner kopieren (lokales Backup mit Struktur zum komprimieren und versenden an einen User mit --- gleicher Ordnerstruktur, aber evtl. unterschiedlicher Laufwerksangabe &/oder Ordnerstruktur in einem Unterordner von --- meinetwegen D: z.B. d:\Daten_von_Honk\007)

dateiliste3.txt
P:\007\VP\UZA\90112.txt
P:\007\VP\UZA\90134.txt
P:\007\VP\UZA\81345.mdb
P:\007\VP\UVA\12345.txt
P:\007\VP\UVA\54321.txt
P:\007\VP\UVA\19181.dxf
dateiliste3.txt

-ich muss also die Files (eindeutig benannt, aber evtl. in mehreren Unterordnern vorhanden)
P:\007\VP\UZA\90112.txt
P:\007\EC\UZA\90112.txt
P:\007\BH\UZA\90112.txt
P:\007\LK\UZA\90112.txt
selektiv im Ordner P:\007\VP finden (werde eine Abfrage machen, in welchem Ordner gesucht werden soll VP, oder EC, BH, LK)
-die Ordnerstruktur der gefundenen Dateien in einem lokalen Ordner abbilden
-die Dateien dorthin kopieren
-darauf achten, dass mancher User einen Ordner mit Leerzeichen anlegt (P:\007\VP altuell\U BG - also kein "delims= ")
-richtig abartig wird es dann für mich, wenn der User verlangt, ich soll alle 90*.* aus Ordner EC versenden

Du verstehst jetzt sicher mein Dilemmer
Biber
Biber 21.11.2005 um 21:15:03 Uhr
Goto Top
Na ja, woro,
jetzt klingst Du langsam schon glaubwürdiger... face-wink

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 ^&ltDateiListeOhnePfad.ext^&gt ^&ltstrPfadDazu^&gt) & 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
Output:
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
worogu
worogu 22.11.2005 um 10:03:51 Uhr
Goto Top
vielen Dank BIBER, die Vereinheitlichung der Syntax in Dateiinfo... macht Sinn... werde das anregen.
Gibt es ne Möglichkeit mit
for /f %i in ('dir /aD /b /s *.txt') do (echo %i) und der Einschränkung, bei gefundener *.txt
C:\1\007\VP\UZA\7564.txt (Name auch mehr Zeichen 1234567.txt) die Sache so auszugeben, dass
C:\1\007\VP\UZA\ entsteht? Hab zwar was mit ...echo %%i:~-4 probiert, erhalte dann aber
C:\1\007\VP\UZA\7564.txt~-4
Hintergrund: immer noch die Suche nach Dateien aus der Liste und Übergabe des Pfades in eine Variable --- meinetwegen so:
in Dateiliste steht:
12345.txt
12453.txt
12678.txt
ende Dateiliste
12345.txt ---befindet sich auf P:\007\VP\URA---
12453.txt ---befindet sich auf P:\007\VP\UZA---
12678.txt ---befindet sich auf P:\007\EC\URA---

ich muss die Dateiliste jetzt mit Pfad versehen (Pfaddazu.bat)
und dann das Xcopy-Prozedere abfahren...
So viele Fragen! Und ja, meine User spinnen --- soll halt ne automatisierte und DAU-sichere Sache werden, die fast alle Eventualitäten berücksichtigt.

THX for answering
woro
worogu
worogu 29.11.2005 um 15:40:35 Uhr
Goto Top
Bin ein bischen weiter... (hätte doch beinahe wieder in Abkürzungen geschrieben --- aber Du kannst das ja nicht leiden :gnnffface-smile

for /f "usebackq delims==;" %%J in (111.txt) do (dir /b /s %%J>>tempvar)
for /f "usebackq delims==;" %%I in (tempvar) do @echo %%~pnxI>>1111.txt
del /f tempvar

@Biber: nich lachen!
aus Dateiliste 111.txt werden die gefundenen Dateien unf Pfade in tempvar geschrieben---
und in der zweiten Schleife dann vom Laufwerkbuchstaben befreit
1111.txt --- "\Dokumente und Einstellungen\user\dau\ 90112.txt "
111.txt - analog ---------- DATEINOPATH.TXT (s. o.)

hab es noch nicht geschafft, das ... "Dokumente und Einstellungen" rauszuschmeißen (oder andere beliebige Pfadangaben) --- schön wäre z. B. ein Listing ab dau (\dau\90112.txt)

naja, wird schon...

woro
Biber
Biber 30.11.2005 um 19:44:30 Uhr
Goto Top
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:
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