Discussion:
Dateiname auslesen, Ordner erstellen, Dateien kopieren
(zu alt für eine Antwort)
Andreas H.
2010-10-27 10:24:52 UTC
Permalink
Hallo,

folgenden Code habe ich (DOS-Nichtsblicker) mir aus verschiedenen
Foren usw zusammengeklebt.
Mit dem Code sollen Dateinamen ausgelesen werden, die Zeichen vor dem
ersten Unterstrich "_" als Benennung eines neuen Ordners verwendet
werden und dann alle Dateien, die mit dieser Zeichenkette anfangen, in
den neuen (dann bestehenden) Ordner kopiert werden.

--------------------<SNIP>-----------------
@echo off & setlocal
set "Quelle=P:\temp\%username%\incoming\Test\Out\"
set "Ziel=P:\temp\%username%\incoming\Test\Out\"

for /f "delims=" %%i in ('dir /b /a-d "%Quelle%" 2^>nul') do
call :ProcessFile "%%i"
goto :eof

:ProcessFile
for /f "delims=_" %%a in (%1) do set "ID=%%a"
if not defined ID goto :eof
set "ZielOrdner=%Ziel%\%ID%"
if not exist "%ZielOrdner%" md "%ZielOrdner%" & ping -n 2 127.0.0.1
nul 2>&1 || (echo %ZielOrdner% konnte nicht erstellt werden) &
goto :eof
move /-Y "%Quelle%\%~1" "%ZielOrdner%\"
--------------------<SNIP>-----------------

Der Code funktioniert im Wesentlichen. Blöderweise vergisst der Code
aber eine Datei zu kopieren, nämlich diejenige, anhand der der Name
des zu erzeugenden Ordners ausliest. Beim zweiten Durchlauf, wenn
bereits ein entsprechent benannter Ordner existiert, werden alle
Dateien korrekt kopiert.

Woran könnte das liegen?
Ich hab bereits die ping -n...-Pause eingebaut, weil ich dachte, der
Ordner sei ggf noch nicht "fertig". Scheint aber nicht das Problem zu
sein...

Vielen Dank für Eure Hilfe schon jetzt!!!

Grüße aus Stuttgart,
Andreas

PS.: Peinlich, peinlich, aber wo kann ich lernen, was ich mit dem
vorstehenden Code überhaupt mache????
Herbert Kleebauer
2010-10-27 18:56:20 UTC
Permalink
Post by Andreas H.
--------------------<SNIP>-----------------
@echo off & setlocal
set "Quelle=P:\temp\%username%\incoming\Test\Out\"
set "Ziel=P:\temp\%username%\incoming\Test\Out\"
for /f "delims=" %%i in ('dir /b /a-d "%Quelle%" 2^>nul') do
call :ProcessFile "%%i"
goto :eof
:ProcessFile
for /f "delims=_" %%a in (%1) do set "ID=%%a"
if not defined ID goto :eof
set "ZielOrdner=%Ziel%\%ID%"
if not exist "%ZielOrdner%" md "%ZielOrdner%" & ping -n 2 127.0.0.1
nul 2>&1 || (echo %ZielOrdner% konnte nicht erstellt werden) &
goto :eof
move /-Y "%Quelle%\%~1" "%ZielOrdner%\"
--------------------<SNIP>-----------------
Der Code funktioniert im Wesentlichen. Blöderweise vergisst der Code
aber eine Datei zu kopieren, nämlich diejenige, anhand der der Name
des zu erzeugenden Ordners ausliest. Beim zweiten Durchlauf, wenn
bereits ein entsprechent benannter Ordner existiert, werden alle
Dateien korrekt kopiert.
Woran könnte das liegen?
Ich vermute mal an dem "& goto :eof" in der Zeile

if not exist "%ZielOrdner%" .....

weil der move Befehl dann nicht ausgeführt wird wenn der Zielordner
nicht existiert.
Post by Andreas H.
PS.: Peinlich, peinlich, aber wo kann ich lernen, was ich mit dem
vorstehenden Code überhaupt mache????
set /?
for /?
call /?
goto /?
if /?
Markus Humm
2010-10-27 21:07:04 UTC
Permalink
Hallo,

tipp: mit @echo off unterdrückst du die Ausgabe die dir während der
Ausführung evtl. zeigen könnte was das Skript gerade tut...

Das @ vor dem echo unterdrückt sogar die Anzeige des Textes echo off ;-)

Lernen kann man sowas wie Herr Kleebauer schon schriebt mittels set /?
etc. oder mittels einem alten DOS Handbuch oder unter MS DOS 6.x gab's
ne schöne Hilfe.

Gruß

Markus
Jens Fittig
2010-10-27 21:17:39 UTC
Permalink
Post by Andreas H.
PS.: Peinlich, peinlich, aber wo kann ich lernen, was ich mit dem
vorstehenden Code überhaupt mache????
z.B.

http://www.script-example.com/themen/Windows_Batch.php

http://www.robvanderwoude.com/batexamples.php?fc=D

anonsten selbst googeln
Andreas H.
2010-10-28 06:41:50 UTC
Permalink
DANKE!!!

Genau daran lag es!

mein Code sieht jetzt so aus und funktioniert:

--------------------<SNIP>-----------------
@echo off & setlocal
set "Quelle=P:\temp\%username%\incoming\Test\Out"
set "Ziel=P:\temp\%username%\incoming\Test\Out"

for /f "delims=" %%i in ('dir /b /a-d "%Quelle%" 2^>nul') do
call :ProcessFile "%%i"
net send %computername% Die Dateien sollten jetzt nach %ZielOrdner%
verschoben worden sein.
goto :eof

:ProcessFile
for /f "delims=_" %%a in (%1) do set "ID=%%a"
if not defined ID goto :eof
set "ZielOrdner=%Ziel%\%ID%"
if not exist "%ZielOrdner%" md "%ZielOrdner%" & ping -n 1 127.0.0.1
nul 2>&1
if not exist "%ZielOrdner%" (net send %Computername% Der Ordner
%ZielOrdner% konnte nicht erstellt werden, die Bearbeitung wird
abgebrochen.) & exit
move /-Y "%Quelle%\%~1" "%ZielOrdner%\"
--------------------<SNIP>-----------------

Die Hinweise bezüglich Tutorials, Büchern und der /?-Funktion werde
ich nachgehen!

Nochmals Danke einstweilen!
Andreas H.
2010-10-28 09:10:43 UTC
Permalink
Nachtrag...
Wie sollte es anders sein, eine weitere Idee...

Wie, wo und womit könnte man in dem Code einbauen, dass die
verschobenen Dateien umbenannt werden. Deren Namen besteht aktuell aus
TeilA_TeilB_TeilC.*. Schön wäre, wenn nur TeilC.* übrig bliebe...

In jedem Fall Danke für Hinweise!!!

Grüße aus Stuttgart,
Andreas
Markus Humm
2010-10-28 17:38:02 UTC
Permalink
Post by Andreas H.
Nachtrag...
Wie sollte es anders sein, eine weitere Idee...
Wie, wo und womit könnte man in dem Code einbauen, dass die
verschobenen Dateien umbenannt werden. Deren Namen besteht aktuell aus
TeilA_TeilB_TeilC.*. Schön wäre, wenn nur TeilC.* übrig bliebe...
In jedem Fall Danke für Hinweise!!!
Grüße aus Stuttgart,
Andreas
Was du sicher auf alle Fälle brauchen wirst ist der Befehl zum
Umbenennen. Dieser ist: ren

Gruß

Markus

Loading...