jeeroy
Goto Top

Datei suchen und den Pfad als Variable speichern in einer Batch Datei.

Hallo Leute,
ich probiere Derzeitig eine Backup Batch Datei zu erzeugen.

Für diese Backup Datei brauche ich eure Hilfe, ich möchte das die Datei nach 4 bestimmten Dateinamen sucht (die 4 Dateien befinden sich immer im gleichen Ordner).
Dann soll er in den Unterordner von den 4 Dateien gehen und den Kompletten Ordner der 4 Dateien Kopieren.

Ich hatte mir das so überlegt, dass die 4 Dateien gesucht werden, und der Dateipfad der Dateien als Variable (Bsp: %var%) speichern, sodass ich dann einfach den Ordner kopieren kann %var%\.. !

Ich weiss nur nicht wie ich das umsetzten soll und bin schon halb am verzweifeln.

Mein Problem besteht darin, dass ich nicht weiss wie ich das eingeben soll, dass er mir von den 4 Datein den Dateipfad als Variable speichert.

Über Hilfe, oder weiteren Vorschlägen würde ich mich sehr freuen.

Danke!

Content-Key: 159778

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

Printed on: April 18, 2024 at 04:04 o'clock

Member: Nagus
Nagus Jan 31, 2011, updated at Oct 18, 2012 at 16:45:41 (UTC)
Goto Top
Moin,
mach doch mal ein DOS Fenster auf und gib for /? ein.

Im Tutorial steht auch was Tutorial FOR

Und hier

Außerdem ist das was Du schreibst ziemlich allgemein ..

Gruß
Nagus
Member: Jeeroy
Jeeroy Jan 31, 2011 at 10:30:09 (UTC)
Goto Top
Danke erstmal für deine Antwort Nagus.

Ich habe das mit For schon probiert, aber kam da halt auch nicht zu einer Lösung.

Probiere es mal präziser zu verfassen:

4 Dateien zum Beispiel:
dat1.db
dat2.db
dat3.db
dat4.db
Liegen in einem Ordner, allerdings weiss ich nicht wo der Ordner ist, er könnte überall auf C oder D sein, und der Ordner ist auch immer an verschiedener stelle.

In dem Ordner sind nicht nur diese 4 Dateien, sondern noch mehr, die allerdings immer einen anderen namen haben und immer eine andere Endung (ein code).
Diese Dateien möchte ich Kopieren, damit mein Archiv von den Mails sicher ist.

Somit muss ich die dateien dat1.db - dat4.db such um den Ordner zu finden und dann die Dateien daraus kopieren in meine Sicherung.
Member: miniversum
miniversum Jan 31, 2011 at 12:06:14 (UTC)
Goto Top
Du kannst nur nach einander die Laufwerke nach jeder Datei durchsuchen.
Nach einer Datei kannst du z.b. mit
dir /s /b C:\dat1.db
suchen. Die Ausgabe kannst du dann mit einer For Schleife abfangen und in eine Variable schreiben.
Beachte auch den Hinweis am ende der Hilfe zum For Befehl wie du die Variable benutzen kannst.
Member: Jeeroy
Jeeroy Jan 31, 2011 at 15:09:31 (UTC)
Goto Top
Dann müsste ich das aber noch irgendwie machen, dass auch abgeprüft wird, ob die 4 Dateien denn in einem Ordner sind und wenn ja, dass alle Dateien aus dem Ordner rauskopiert werden.

Ich weiss nicht wie ich das umsetzten kann, und wie ich von

dir /s /b C:\dat1.db

den Pfad rauslesen kann.

Sorry mein wissen ist sehr beschränkt.
Danke für die Hilfe.
Member: bastla
bastla Jan 31, 2011 at 15:28:48 (UTC)
Goto Top
Hallo Jeeroy und willkommen im Forum!

Den Pfad erhältst Du so:
for /f "delims=" %%i in ('dir /s /b C:\dat1.db') do set "Pfad=%%~dpi"
bzw wenn auf mehreren Laufwerken gesucht werden muss:
for %%a in (C D) do for /f "delims=" %%i in ('dir /s /b %%a:\dat1.db') do set "Pfad=%%~dpi"
Ob ein Pfad gefunden wurde, lässt sich mit
if not defined Pfad goto :FehlerPfad
feststellen bzw darauf reagieren.
Das Vorhandensein der Dateien überprüfen kannst Du danach einfach per "if exist" bzw "if not exist":
if not exist "%Pfad%\dat2.db" goto :FehlerDatei
Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 06:56:46 (UTC)
Goto Top
Hey bastla,

erstmal danke für die Willkommens Grüße hier im Forum!

Und danke für deinen Beitrag, dieser hat mir echt weitergeholfen, doch ist mein Problem noch nicht ganz gelöst

es kann nämlich auch so sein, dass zum Beispiel dat1.db auch in einem anderen Ordner vorhanden ist aber dann halt ohne die anderen 3 Dateien.

Die Batch Datei prüft zwar den Ordner, ob die anderen Dateien vorhanden sind, doch auch wenn sie nicht vorhanden sind gibt er den Pfad von der zuletzt gefundenen dat1.db aus.

Ich habe mir nun gedacht das ich das so schreibe:

for %%a in (C D) do for /f "delims=" %%i in ('dir /s /b %%a:\dat1.db') do set "gw=%%~dpi"
if not defined gw goto :Fehlergw
if exist "%gw%dat2.db'" set d1=1
if exist "%gw%dat3.db'" set d2=1
if exist "%gw%dat4.db'" set d3=1
set d4=%d1%%d2%%d3%
if %d4% == 111 goto :Weiter

Also mit einer Abfrage, dass er nur auf Weiter geht, wenn die Variable %d4% = 111 ist.
Wenn das nicht erfüllt ist, sollte er die variable d4 wieder auf 000 setzten und die Suche von da an weiter machen.

Doch wie macht er die Suche da weiter wo er gerade war, oder startet die Suche von neuen doch lässt diesen Ordner aus,
klar könnte ich alles kopieren und daunter schreiben das %gw% ausgeschlossen wird.
Doch das kann ich nicht 10 mal oder so machen, da sollte ne schleife her, nur weiss ich nicht wie.

Mein Zweites Problem ist, wenn das nun klappt, wie mach ich das dann, dass auch mehrere Ordner die alle 4 Dateien beinhalten ausgelsen werden.

Sorry, dass ich so viele Fragen habe, komme hierbei nur alleine nicht zurecht.

Danke euch für eure Hilfe.
Member: Jeeroy
Jeeroy Feb 01, 2011 at 07:23:56 (UTC)
Goto Top
Und was mir gerade auch aufgefallen ist, dass er erst alle Dateien durchsucht und immer wenn er die dat1.db gefunden hat die Variable "gw" neu benennt, erst nachdem er alle daten durchsucht hat fängt er an zu prüfen ob in dem Pfad "gw" die anderen Dateien vorhanden sind face-sad
Member: bastla
bastla Feb 01, 2011 at 07:48:23 (UTC)
Goto Top
Hallo Jeeroy!

Wenn tatsächlich die gleiche Aktion mit mehreren Fundstellen vorzunehmen ist, würde ja eigentlich etwas in der Art genügen:
for %%a in (C D) do for /f "delims=" %%i in ('dir /s /b %%a:\dat1.db') do if exist "%%~dpidat2.db" if exist "%%~dpidat3.db" if exist "%%~dpidat4.db" echo Alle da, tun wir's mit "%%~dpi"
Anstelle des "echo" wäre dann die konkrete Aktion einzutragen - bei Bedarf auch mehrzeilig:
for %%a in (C D) do for /f "delims=" %%i in ('dir /s /b %%a:\dat1.db') do if exist "%%~dpidat2.db" if exist "%%~dpidat3.db" if exist "%%~dpidat4.db" (  
    echo Alle da, tun wir's mit "%%~dpi"  
    echo Und das auch für "%%~dpi"  
    echo Einmal geht's mit "%%~dpi" noch  
    echo Fertig
)
Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 08:04:27 (UTC)
Goto Top
Ok, danke nochmal.
Das verstehe ich soweit und kann es nachvollziehen, doch ist es dadurch auch möglich, dass er die Pfade von mehreren Orten, wo die 4 Dateien vorhanden sind raussuchen kann und als Variable setzen kann?
Auch wenn man nicht weiss wie oft, es vorkommen kann, das die 4 Dateien in kombination in einem Ordner stecken?

Vielen Dank für deine Hilfe!
Member: bastla
bastla Feb 01, 2011 at 10:00:44 (UTC)
Goto Top
Hallo Jeeroy!
doch ist es dadurch auch möglich, dass er die Pfade von mehreren Orten, wo die 4 Dateien vorhanden sind raussuchen kann und als Variable setzen kann?
Was sagen denn Deine Tests dazu? Mit dem "echo" als Aktion passiert ja nix Schlimmes, und Du kannst sehen, was gefunden (und verarbeitet) wird.

Ansonsten nochmals der Hinweis: Anstatt zu versuchen, die Ordner in Variablen zu speichern, solltest Du einfach gleich unmittelbar die gewünschte Verarbeitung (was genau hast Du denn mit den gefundenen Ordnern vor?) in die Schleife einbeziehen ...

Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 10:20:44 (UTC)
Goto Top
Hey bastla,

Bei dem Test mit echo findet er alle und jedesmal wenn er einen gefunden hat gibt er die 3 echos aus, aber halt auch wenn nur 2 von den dat.db in einem Ordner vorhanden ist.

Was mit den Verzeichnissen geschehen soll:
Jedes verzeichniss, wo genau die 4 Dateien drin sind, soll an einen gewünschten ort zum Beispiel nach C:\ kopiert werden, aber mit allen Dateien, die im Ordner sind. (das ist dann ein Email Archiv).

Grüße
Member: bastla
bastla Feb 01, 2011 at 11:43:25 (UTC)
Goto Top
Hallo Jeeroy!
... aber halt auch wenn nur 2 von den dat.db in einem Ordner vorhanden ist.
Sorry - kann es eigentlich nicht geben, da ja jedes "if" (und erst recht der Teil in der Klammer ab dem Ende der Zeile) nur ausgeführt wird, wenn die jeweils vorher geprüfte Datei vorhanden ist.
soll an einen gewünschten ort zum Beispiel nach C:\ kopiert werden
Sehr genau ist diese Beschreibung allerdings nicht, da in diesem Fall jeweils die bereits vorhandenen Dateien überschrieben würden - es sei denn, es würde aus dem Ursprungspfad ein neuer Unterordner erzeugt, etwa aus "C:\Testdaten\Versuch2" der Ordner "C_Testdaten_Versuch2" ...

Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 12:17:18 (UTC)
Goto Top
Hey bastla!

Ok, ich habe mir das nochmal genau angeguckt und du hast recht, ich hatte mich verguckt, das war nur der Befehl der eingegeben war, der gezeigt wurde, das echo richtig ausgegeben war tatsächlich nur bei denen der Fall, wo die Dateien wirklich zu 4 in einem Ordner waren.


Um es Genauer zu Beschreiben:

Der komplette Ordner, wo sich die 4 Dateien drin befinden soll dann nach "C:\Backup\GW_Archiv\"

Ich hoffe, dass das genau genug ist.

Grüße Jeeroy
Member: Jeeroy
Jeeroy Feb 01, 2011 at 12:54:55 (UTC)
Goto Top
Hey,

ich habe das nun so gemacht und das funktioniert auch soweit, wie getestet, nur würde ich gerne noch, dass der Ordnername von den Dateien, wo sie drin lagen oder besser noch der Pfad mitgegeben wird und sie da nicht alle vermischt sind.


set ZIELDGW=D:\BackupTest\GW\
set GWPT=/S /COPY:DAT /A-:H /R:0 /W:0

:Abfrage
color 0A
for %%a in (C D) do for /f "delims=" %%i in ('dir /s /b %%a:\msg.db') do if exist "%%~dpiuser.db" if exist "%%~dpingwguard.db" if exist "%%~dpingwguard.dc" (
robocopy %%~dpi %ZIELDGW% %GWPT%
echo Fertig
)
Member: bastla
bastla Feb 01, 2011 at 13:03:27 (UTC)
Goto Top
Hallo Jeeroy!
nur würde ich gerne noch, dass der Ordnername von den Dateien, wo sie drin lagen oder besser noch der Pfad mitgegeben wird
Guter Plan - könnte von mir sein ... face-wink

Versuch es dann etwa so (ungetestet):
@echo off & setlocal
set ZIELDGW=D:\BackupTest\GW\
set GWPT=/S /COPY:DAT /A-:H /R:0 /W:0

:Abfrage
color 0A
for %%a in (C D) do for /f "delims=" %%i in ('dir /s /b %%a:\msg.db') do if exist "%%~dpiuser.db" if exist "%%~dpingwguard.db" if exist "%%~dpingwguard.dc" call :ProcessDir "%%~dpi"  
goto :eof

:ProcessDir
set "Pfad=%~f1"  
set "Pfad=%Pfad::=%"  
set "Pfad=%Pfad:\=_%"  
robocopy "%Pfad%" %ZIELDGW% %GWPT%  
echo Fertig
goto :eof
Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 13:37:20 (UTC)
Goto Top
Hey,

Leider funktioniert es nicht, habe auch probiert das noch umzuschreiben, aber das geht auch nicht:
Er sagt nur, dass das System die angegebene Datei nicht finden kann, probiert davor aber schon die sachen zu kopieren, ich glaube er findet den Pfad nicht mehr, wo die dateien gespeichert sind, den

%%~dpi

Grüße Jeeroy
Member: bastla
bastla Feb 01, 2011 at 14:00:00 (UTC)
Goto Top
Hallo Jeeroy!

Konnte ja gar nicht funktionieren ... face-sad

Damit sollte es jetzt besser gehen:
robocopy %1 "%ZIELDGW%%Pfad:,-1%" %GWPT%
Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 14:09:14 (UTC)
Goto Top
Hey bastla,

damit funktioniert es leider auch nicht:

robocopy %1 "%ZIELDGW%%Pfad:,-1%" %GWPT%

Habe aber noch ein bissl probiert und kam nun auf die Lösung:

:ProcessDir
set Pfad=%~f1
set Pfad=%Pfad::=%
set Pfad=%Pfad:\=_%
set Pfad=D:\BackupTest\GWD\%Pfad:\=_%
robocopy %~f1 %Pfad% %GWPT%

Nun kopiert er mir das echt rüber, auch mit dem Ordnername.

Doch kopiert er nun nur die ersten 4 Dateien, die er in einem Ordner findet, nach weiteren sucht er nicht und kopiert er auch nicht.
Member: bastla
bastla Feb 01, 2011 at 14:21:42 (UTC)
Goto Top
Hallo Jeeroy!

Deine Variante unterscheidet sich eigentlich nur durch das zusätzliche "D" in der Zielpfadangabe (gegenüber der Zuweisung in der Zeile 2 oben) und das unnötige nochmalige Ersetzen von "\" durch "_" von meinem Ansatz (sowie dadurch, dass ich auch noch den abschließenden Pfadbestandteil "_" eliminiert hatte) - aber wenn's passt, kann ich ja auch nix dagegen haben ... face-wink

Dass "robocopy" aus einem übergebenem Quellpfad nur einige Dateien kopieren würde, kann eigentlich nur an den Parametern lt %GWPT% liegen - die habe ich mir allerdings nicht angesehen. Du könntest Dir aber durch ein "echo" vor dem "robocopy" den kompletten Kopierbefehl anzeigen lassen, um das besser nachvollziehen zu können.

Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 14:29:14 (UTC)
Goto Top
Hey bastla,

ich meinte das anders, habe mich wahrscheinlich blöd ausgedrückt.

Robocopy kopiert schon alle Daten aus dem Pfad, doch sobald die Batch Datei unsere 4 Dateien in einem Ordner gefunden hat und diese rauskopiert hat, hört die Batch Datei auf zu suchen, ob diese 4 Dateien auch in anderen Ordnern erhalten sind, um diese raus zu kopieren.

Ich hoffe du weisst nun was ich meine ;)

Wenn ich das richtig sehe müsste somit unser...

for %%a in (C D) do for /f "delims=" %%i in ('dir /s /b %%a:\msg.db') do if exist "%%~dpiuser.db" if exist "%%~dpingwguard.db" if exist "%%~dpingwguard.dc" call :ProcessDir "%%~dpi"  
:ProcessDir 
set Pfad=%~f1
set Pfad=%Pfad::=%
set Pfad=%Pfad:\=_%
set Pfad=D:\BackupTest\GWD\%Pfad:\=_%
robocopy %~f1 %Pfad% %GWPT%

... in eine Schleife gesetzt werden, die klar difiniert, das C und D einmal komplett abgesucht werden.

Grüße
Member: bastla
bastla Feb 01, 2011 at 14:55:04 (UTC)
Goto Top
Hallo Jeeroy!

Das Unterprogramm ":ProcessDir" wird aus einer (sogar geschachtelten) Schleife (für die Laufwerke "C" und "D" aus der äußeren Schleife werden alle "msg.db" gesucht) aufgerufen, und zwar für jeden Ordner, in dem die gesuchten Dateien alle gefunden wurden, und kehrt auch wieder dorthin zurück - insofern kann ich das Problem nicht nachvollziehen ...

Dass in Deinem zuletzt geposteten Schnipsel das "goto :eof" vor ":ProcessDir" fehlt, führt ja nur dazu, dass das Unterprogramm einmal zu oft, und dann auch noch ohne Übergabe eines Parameters, durchlaufen wird - vorher müssten aber bereits alle Fundstellen abgearbeitet worden sein.

Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 15:06:25 (UTC)
Goto Top
Hey bastla!

Klasse, es haut hin, ich hatte das goto :eof hinter robocopy vergessen, aber ganz verstehen tue ich es nicht, was bedeutet das eof?

Vielen Dank für deine Hilfe!
Member: bastla
bastla Feb 01, 2011 at 15:18:48 (UTC)
Goto Top
Hallo Jeeroy!
was bedeutet das eof?
Eigentlich (so wie sonst auch) "end of file" - im Hauptprogramm wird mit mit dem Sprung nach ":eof" das Ende des Batches gekennzeichnet, in einem Unterprogramm wirkt ein entsprechendes "goto" als "Rücksprungbefehl" ...

Grüße
bastla
Member: Jeeroy
Jeeroy Feb 01, 2011 at 17:56:23 (UTC)
Goto Top
Hey bastla,

Alles klar, dann danke ich dir für deine Info, war halt das erste mal, dass ich eine Batch datei geschrieben habe ;)

Also nochmals vielen dank für deine Hilfe!