tobiisfreaky
Goto Top

Ordnerstruktur auslesen und in Textdatei speichern

Hallo Forummitglieder,

ich habe eine Problem und zwar sollen alle Ordner (keine Dateien) in einer text-Datei angegeben werden. Es müsste also eine Abfrage erstellt werden, die die gesamte Ordnerstruktur auf unserem Fileserver ausliest und in einer Textdatei speichert.

Befehle wie DIR oder TREE bringen nicht viel, da diese zusatzinformationen mitbringen, die aufwendig herausgefiltert werden müssten.

Hat jmd eine Idee mit welchem Befehl man das am besten machen könnte, oder mit welchem Programm??

Mit freundlichen Grüßen

Tobi

Content-Key: 103631

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

Printed on: April 25, 2024 at 00:04 o'clock

Member: Driver401
Driver401 Dec 09, 2008 at 10:04:31 (UTC)
Goto Top
Schonmal die Optionen bei DIR angeschaut?
Wie hättest Du es denn gerne?

Beispiel:
dir /A:D /B /N /S

Gruß
J.
Member: TobiisFreaky
TobiisFreaky Dec 09, 2008 at 10:11:54 (UTC)
Goto Top
Alle Ordner UND Unterordner in einer Textdatei ohne zusätzlichen Informationen wie Datum, Größe etc und auch keine Dateien.

Ach und der Pfad der ganzen Datei muss angegeben werden.

LG Tobi
Member: bastla
bastla Dec 09, 2008 at 10:19:17 (UTC)
Goto Top
Hallo TobiisFreaky!

Abgesehen davon, dass auch
dir /s /b /ad
genügt - was ist an der Lösung von Driver401 auszusetzen? Die Umleitung in eine Datei lässt sich ja leicht ergänzen:
dir /s /b /ad>D:\Ordnerliste.txt

Grüße
bastla
Member: Driver401
Driver401 Dec 09, 2008 at 10:34:09 (UTC)
Goto Top
stimmt, das /N ist nicht notwendig face-wink
Member: TobiisFreaky
TobiisFreaky Dec 09, 2008 at 12:12:46 (UTC)
Goto Top
Ich hatte das so ähnlich gehabt, aber bei mir wurde immer noch die Größe mit angegeben....
Vllt war ich auch nur ein bisschen zu faul..
auf jeden Fall vielen Dank an Driver und Bastla!

Funktioniert hervorragend, auch wenns ne 7,4 MB Text-Datei ist :D

Mit freundlichen Grüßen

Tobi
Member: katze78
katze78 May 23, 2009 at 21:33:19 (UTC)
Goto Top
Ich habe ein ähnliches Problem, nur bei mir liestet er mir es falsch auf.

Verzeichnis auslesen:

Code:
REM Build transfer Template
echo open 127.0.0.1 > transfer.ftp
echo user >> transfer.ftp
echo password >> transfer.ftp
REM create root directory
echo mkdir test >> transfer.ftp
REM Build Directory Structure
for /f "tokens=1,2,3,4 delims=\" %%a in ('dir C:\test\transfer /ad /o /b /s') do @echo mkdir %%b\%%c\%%d >> transfer.ftp
REM create transfer list
for /f "tokens=1,2,3,4,5 delims=\" %%A in ('dir C:\test\transfer /a-d /o /b /s') do @echo send %%~pfB%%~pC%%C%%~pD%%D%%~pE%%E %%~B%%~pC%%C%%~pD%%D%%~pE%%E >> transfer.ftp
hier der erfolgreiche versuch:
echo quit >> transfer.ftp
echo by >> transfer.ftp

Das Resultat dieser Datei siehst so aus (Falsch):

open 127.0.0.1
user
password
mkdir test
mkdir test\transfer\test1
mkdir test\transfer\test2
send C:\test\test\test\transfer\test\test1\test\testdatei.txt test\test\transfer\test\test1\test\testdatei.txt
send C:\test\test\test\transfer\test\test2\test\a.rtf test\test\transfer\test\test2\test\a.rtf
send C:\test\test\test\transfer\test\test2\test\hallo yves.wav test\test\transfer\test\test2\test\hallo yves.wav
send C:\test\test\test\transfer\test\test2\test\testdatei1.wav test\test\transfer\test\test2\test\testdatei1.wav
quit
bye

Richtig aussehen sollte die Datei so:

open 127.0.0.1
user
password
mkdir test
mkdir test\transfer\test1
mkdir test\transfer\test2
send C:\test\test1\testdatei.txt
send C:\test\transfer\test2\a.rtf
send C:\test\transfer\test2\hallo yves.wav
send C:\test\transfer\test2\testdatei1.wav
quit
by

wo ist mein denkfehler, das er mir dies so komisch darstellt? Den so kann ich den fefehlt

ftp -s:xtrans.ftp

nicht ausführen, da er die dateien nicht findet, wäre toll, wenns gehen würde
Member: bastla
bastla May 24, 2009 at 06:43:06 (UTC)
Goto Top
Hallo katze78 und willkommen im Forum!

Versuche es mit dem Ersetzen von
for /f "tokens=1,2,3,4,5 delims=\" %%A in ('dir C:\test\transfer /a-d /o /b /s') do @echo send %%~pfB%%~pC%%C%%~pD%%D%%~pE%%E %%~B%%~pC%%C%%~pD%%D%%~pE%%E >> transfer.ftp
durch
for /f "tokens=" %%a in ('dir C:\test\transfer /a-d /o /b /s') do echo send %%a >> transfer.ftp
Wegen des beim "dir" verwendeten "/s" erhältst Du ohnehin bereits einen vollen Dateipfad ...

Grüße
bastla
Member: katze78
katze78 May 24, 2009 at 07:16:00 (UTC)
Goto Top
habe diese zeile so angepasst
for /f "tokens=1,2,3,4,5 delims=\" %%A in ('dir C:\test\transfer /a-d /o /b /s') do @echo send %%a >> transfer.ftp

so wird es nun in die datei geschrieben.


open 127.0.0.1
user
password
mkdir test
mkdir test\transfer\test1
mkdir test\transfer\test2
send %a
send %a
send %a
send %a
Member: bastla
bastla May 24, 2009 at 07:51:45 (UTC)
Goto Top
Hallo katze78!

Warum hast Du die Zeile "angepasst" und nicht einfach übernommen?

Grüße
bastla
Member: katze78
katze78 May 24, 2009 at 08:00:45 (UTC)
Goto Top
habe sie nun mal übernommen, aber er zeigt mir nichts an?
for /f "tokens=" %%a in ('dir C:\test\transfer /a-d /o /b /s') do echo send %%a >> transfer.ftp


ist das windows abhängig, wie der befehl aussehen muss?
ich habe windows xp prof sp3
Member: bastla
bastla May 24, 2009 at 08:09:15 (UTC)
Goto Top
Hallo katze78!

Dein Batch sollte derzeit etwa so aussehen:
REM Build transfer Template
echo open 127.0.0.1 > transfer.ftp
echo user >> transfer.ftp
echo password >> transfer.ftp
REM create root directory
echo mkdir test >> transfer.ftp
REM Build Directory Structure
for /f "tokens=1,2,3,4 delims=\" %%a in ('dir C:\test\transfer /ad /o /b /s') do @echo mkdir %%b\%%c\%%d >> transfer.ftp  
REM create transfer list
for /f "delims=" %%a in ('dir C:\test\transfer /a-d /o /b /s') do echo send %%a >> transfer.ftp  
echo quit >> transfer.ftp
echo by >> transfer.ftp
und dann auch entsprechend in die "transfer.ftp" schreiben (soferne es in bzw unterhalb von "C:\test\transfer" Dateien gibt).

Wenn Du meine vorgeschlagene Schleife direkt an der Eingabezeile testen willst, kannst Du das so machen:
for /f "delims=" %a in ('dir C:\test\transfer /a-d /o /b /s') do @echo send %a
Damit sollten dann die entsprechenden "send"-Zeilen angezeigt werden.

Grüße
bastla

[Edit] Sorry, ist anscheinend noch viel zu früh heute ... face-sad

Natürlich muss es anstelle von "tokens" richtig "delims" heißen - habe das korrigiert.
[/Edit]
Member: katze78
katze78 May 24, 2009 at 08:17:22 (UTC)
Goto Top
ich habe deine zeilen 1-12 mal so in meine batch datei übernommen

das ist das resultat


open 127.0.0.1
user
password
mkdir test
mkdir test\transfer\test1
mkdir test\transfer\test2
quit
by
Mitglied: 78632
78632 May 24, 2009 at 08:54:34 (UTC)
Goto Top
Vermutlich enthält deine Teststruktur noch keine Dateien in den Unterverzeichnissen?

Dann musst du noch beachten, dass du die Dateien nur dann hochschieben kannst, wenn du dich (bei FTP) bereits in dem entsprechenden Pfad befindest. Du musst also vorher noch ein cd ausführen, sonst landen die alle dort, wo du dich im FTP-Verzeichnis momentan befindest. face-wink
Member: katze78
katze78 May 24, 2009 at 08:59:46 (UTC)
Goto Top
doch in den verzeichnissen hats jeweils zurzeit als test 1-2 dateien.

das beispiel von "bastla schreibt am 24.05.2009 um 10:09:15 Uhr: " geht bei mir eben nicht,
Member: bastla
bastla May 24, 2009 at 09:01:29 (UTC)
Goto Top
Hallo katze78!

Hast Du meine in der Zwischenzeit vorgenommene Korrektur ("delims" anstelle von "tokens") berücksichtigt?

Grüße
bastla
Mitglied: 78632
78632 May 24, 2009 at 09:04:51 (UTC)
Goto Top
Dann stimmt möglicherweise was nicht mit den Dateien. Sind die evtl. versteckt?
Member: katze78
katze78 May 24, 2009 at 09:14:10 (UTC)
Goto Top
ja, ich habe beide deine forschläge gemacht, geht aber nicht. "bastla schreibt am 24.05.2009 um 11:01:29 Uhr: "
die längste datei ist 11Zeichen lang, eine davon hat ein leerschlag darin. "blablanick schreibt am 24.05.2009 um 11:04:51 Uhr: "

ist es windows abhängig der befehl, das es bei euch geht und bei mir nicht?
Mitglied: 78632
78632 May 24, 2009 at 09:19:56 (UTC)
Goto Top
überschnitten. face-smile
Member: bastla
bastla May 24, 2009 at 09:20:59 (UTC)
Goto Top
Hallo katze78!

Was wird angezeigt, wenn Du an der Kommandozeile folgenden Befehl eingibst?
dir C:\test\transfer /a-d /o /b /s
Solltest Du damit die Auflistung der gewünschten Dateien erhalten, müsste auch
for /f "delims=" %a in ('dir C:\test\transfer /a-d /o /b /s') do @echo send %a
die entsprechenden "send"-Zeilen (auf dem Bildschirm) erzeugen (wobei es im Hinblick auf die Leerzeichen für die weitere Verwendung besser wäre, das letzte "%a" unter Anführungszeichen zu setzen).

Grüße
bastla

[Edit] @78632: Danke für die Unterstützung ... face-smile [/Edit]
Member: katze78
katze78 May 24, 2009 at 09:53:41 (UTC)
Goto Top
einen halben erfolg habe ich.
speichere ich diese datei (batch) auf das C: direkt wird meine liste korekt erstellt

REM FTP Liste Löschen
del ftpliste.ftp
REM FTP Liste erstellen
echo open 127.0.0.1>> ftpliste.ftp
echo user>> ftpliste.ftp
echo pass>> ftpliste.ftp
REM create root directory
echo mkdir test >> ftpliste.ftp
REM Build Directory Structure
for /f "tokens=1,2,3,4 delims=\" %%a in ('dir C:\test /ad /o /b /s') do @echo mkdir %%b\%%c\%%d >> ftpliste.ftp
REM create transfer list
for /f "tokens=1,2,3,4,5 delims=\" %%A in ('dir C:\test /a-d /o /b /s') do @echo send %%~pfB%%~pC%%C%%~pD%%D%%~pE%%E %%~B%%~pC%%C%%~pD%%D%%~pE%%E >> ftpliste.ftp
echo bye>> ftpliste.ftp

===
so sieht sie aus, wenn der obere BATCH auf dem C: gespeichert ist.


open 127.0.0.1
user
pass
mkdir test
mkdir test\transfer\
mkdir test\transfer\test1
mkdir test\transfer\test2
send C:\test\auflistung.cmd test\auflistung.cmd
send C:\test\ausfhrung.bat test\ausfhrung.bat
send C:\test\falsch.ftp test\falsch.ftp
send C:\test\ftp via batch.zip test\ftp via batch.zip
send C:\test\Kopie von auflistung.cmd test\Kopie von auflistung.cmd
send C:\test\richtig.ftp test\richtig.ftp
send C:\test\transfer.ftp test\transfer.ftp
send C:\test\transfer1.ftp test\transfer1.ftp
send C:\test\transfer2.ftp test\transfer2.ftp
send C:\test\transfer3.ftp test\transfer3.ftp
send C:\test\transferx.ftp test\transferx.ftp
send C:\test\u.txt test\u.txt
send C:\test\xtrans.ftp test\xtrans.ftp
send C:\test\zauflistung.txt test\zauflistung.txt
send C:\test\ztransfer.ftp test\ztransfer.ftp
send C:\test\transfer\test1\testdatei.txt test\transfer\test1\testdatei.txt
send C:\test\transfer\test2\a.rtf test\transfer\test2\a.rtf
send C:\test\transfer\test2\hallo yves.wav test\transfer\test2\hallo yves.wav
send C:\test\transfer\test2\testdatei1.wav test\transfer\test2\testdatei1.wav
bye

===
speichere ich es zb auf den Desktop die BATCH datei, so wird diese so ausgelesen:

open 127.0.0.1
user
pass
mkdir test
mkdir test\transfer\
mkdir test\transfer\test1
mkdir test\transfer\test2
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\auflistung.cmd test\Dokumente und Einstellungen\yves\Desktop\ftp\auflistung.cmd
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\ausfhrung.bat test\Dokumente und Einstellungen\yves\Desktop\ftp\ausfhrung.bat
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\falsch.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\falsch.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\ftp via batch.zip test\Dokumente und Einstellungen\yves\Desktop\ftp\ftp via batch.zip
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\Kopie von auflistung.cmd test\Dokumente und Einstellungen\yves\Desktop\ftp\Kopie von auflistung.cmd
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\richtig.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\richtig.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer1.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer1.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer2.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer2.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer3.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer3.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transferx.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\transferx.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\u.txt test\Dokumente und Einstellungen\yves\Desktop\ftp\u.txt
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\xtrans.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\xtrans.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\zauflistung.txt test\Dokumente und Einstellungen\yves\Desktop\ftp\zauflistung.txt
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\ztransfer.ftp test\Dokumente und Einstellungen\yves\Desktop\ftp\ztransfer.ftp
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test1\Dokumente und Einstellungen\yves\Desktop\ftp\testdatei.txt test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test1\Dokumente und Einstellungen\yves\Desktop\ftp\testdatei.txt
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test2\Dokumente und Einstellungen\yves\Desktop\ftp\a.rtf test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test2\Dokumente und Einstellungen\yves\Desktop\ftp\a.rtf
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test2\Dokumente und Einstellungen\yves\Desktop\ftp\hallo yves.wav test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test2\Dokumente und Einstellungen\yves\Desktop\ftp\hallo yves.wav
send C:\Dokumente und Einstellungen\yves\Desktop\ftp\test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test2\Dokumente und Einstellungen\yves\Desktop\ftp\testdatei1.wav test\Dokumente und Einstellungen\yves\Desktop\ftp\transfer\Dokumente und Einstellungen\yves\Desktop\ftp\test2\Dokumente und Einstellungen\yves\Desktop\ftp\testdatei1.wav
bye


also liegt es am absoluten oder relativen pfad, wie kann ich es auf absolut machen?
Mitglied: 78632
78632 May 24, 2009 at 10:08:34 (UTC)
Goto Top
Ich frage mich ja, warum bastla dir alles vorkaut und du dann doch deinen eigenen Kram einsetzt.
Ich bin raus.
Member: katze78
katze78 May 24, 2009 at 10:41:16 (UTC)
Goto Top
ich habe ja es nach dem von "bastla" gemacht, aber es gab mir nichts aus, der befehl ging nicht
Member: bastla
bastla May 24, 2009 at 11:23:15 (UTC)
Goto Top
Hallo katze78 und blablanick!

Ihr werdet Euch doch wohl meinetwegen nicht in die Haare (ins Fell face-wink) kriegen ...

... vor allem, weil mein Vorschlag im Grunde genommen ohnehin, wie Biber das immer vornehm auszudrücken pflegt, "suboptimal" war (ist anscheinend wirklich nicht mein Tag).

Einen Versuch mach' ich aber noch:
@echo off & setlocal
set "BasePath=C:\test"  
REM ftp-Steuerdatei im Verzeichnis der Batchdatei erstellen
set "ftp=%~dp0ftpliste.ftp"  
REM Alternativ dazu kann ntürlich auch ein absoluter Pfad angegeben werden
REM set "ftp=C:\ftpliste.ftp"  

REM Absluten Pfadanteil entfernen
for %%i in ("%BasePath%") do set "RemoveAbs=%%~dpi"  
REM FTP Liste Löschen
del "%ftp%" 2>nul  
REM FTP Liste erstellen
>>"%ftp%" echo open 127.0.0.1  
>>"%ftp%" echo user  
>>"%ftp%" echo pass  
REM create root directory
for %%i in ("%BasePath%") do >>"%ftp%" echo mkdir "%%~nxi"  
REM Build Directory Structure
for /f "delims=" %%i in ('dir "%BasePath%" /ad /o /b /s') do call :ProcessDir "%%i"  
REM create transfer list
for /f "delims=" %%i in ('dir "%BasePath%" /a-d /o /b /s') do call :ProcessFile "%%i"  
>>"%ftp%" echo bye  

goto :eof

:ProcessDir
set "AbsPath=%~1"  
call set "RelPath=%%AbsPath:%RemoveAbs%=%%"  
>>"%ftp%" echo mkdir "%RelPath%"  
goto :eof

:ProcessFile
set "AbsPath=%~1"  
call set "RelPath=%%AbsPath:%RemoveAbs%=%%"  
>>"%ftp%" echo send %1 "%RelPath%"  
goto :eof
Damit sollte eigentlich nur noch die Position der erstellten Datei "ftpliste.ftp" vom Ort der Batchdatei abhängig sein (was sich durch das Entfernen des "REM" vor Zeile 6 auch ändern lässt) ...

Grüße
bastla
Member: katze78
katze78 May 24, 2009 at 13:41:50 (UTC)
Goto Top
Danke "bastla" dieser scrip funktioniert einwandfrei und genau so wie ich es mir vorgestellt habe.