Batch Ordner suchen

lichar

Cadet 1st Year
Registriert
Aug. 2014
Beiträge
11
So ich bins wieder,

Ich möchte nach einem "suchOrdner" in einem Verzeichnis suchen, die Struktur sieht so aus:

c:\benutzername\Batchdatei\Umgebung\xx\suchOrdner

das "xx" kann ein beliebiger Name sein.

Wenn der suchOrdner gefunden wurde, möchte ich dessen Pfad in ein Log/Text schreiben. Das Textfile wird der Einfachheit halber bei jedem Ausführen der Batchdatei neu geschrieben, sowie alle Pfade entsprechend neu durchgegangen.

Folgendes habe ich schon probiert, aber es funktioniert nicht:
Code:
@echo off &setlocal
set "basedir=c:\benutzername\Batchdatei\Umgebung"
set "search=aBcordner"
set "age=+3"
set "log=c:\benutzername\Batchdatei\Umgebung\pfad.txt"
 
>"%log%" (
  for /f "delims=" %%i in (
    '2^>nul forfiles /P "%basedir%" /D %age% /C "cmd /c if @isdir==TRUE echo @path"'
  ) do (
    for /f "delims=" %%j in ('2^>nul dir /a:d-a /b /s "%%~i\%search%"') do (
      attrib +a "%%j"
      echo "%%j"
    )
  )
)

sowie das hier auch nicht:
Code:
for /r "c:\benutzername\Batchdatei\Umgebung\" %%i in (suchOrdner) do echo %%i >> "c:\benutzername\Batchdatei\Umgebung\pfad.txt"



Bin für jede Hilfe dankbar.

Gruß
 
edit: mein fehler..

lg
fire
 
Code:
for /R "%basedir%" /D %%a in (*suchOrdner) do (echo %%a)

spuckt dir alle Verzeichznisse die auf "suchOrdner" enden aus. Kann natürlich zu mehreren Ergebnissen kommen.
 
simpsonsfan schrieb:
Code:
for /R "%basedir%" /D %%a in (*suchOrdner) do (echo %%a)

spuckt dir alle Verzeichznisse die auf "suchOrdner" enden aus. Kann natürlich zu mehreren Ergebnissen kommen.


Super Danke! :)
Habs jetzt leicht geändert und nun schreibt er mir den Pfad in mein Logfile. Hier der Code für die Google oder Forensucher die das selbe machen wollen :
Code:
@echo off
set "basedir=C:\euer Pfad"
set "log=C:\Pfad des Logfiles"
for /R "%basedir%" /D %%a in (*NameDesSuchOrdners) do (echo %%a >> "%log%")




---------------------------------------------------------




Jetzt noch eine Erweiterung. Wenn der zu suchende Ordner älter als z.B. 3 Tage ist, dann soll er nicht in das Logfile aufgenommen werden.
Ist das realisierbar?

1. Habe es mit
Code:
set "age=+3"
...
for ... "%age" ...
probiert, aber hat nicht funktioniert oder ich hab es ander falschen Stelle eingefügt. Allerdings wird mir über die Hilfe, keine entsprechende Zeitabfragemöglichkeit angezeigt.

2. Möglichkeit die ich mir überlegt habe:
In meiner Batdatei kopiere ich Ordner mittels robocopy, hier erfolgt bereits eine Dateialtersabfrage.
Wie kann ich die beiden jetzt mittels einer If Schleife zusammenfügen? Also das nachdem ich die Dateien mit robocopy kopiert habe, gleich abfragen ob der SuchOrdner in den gerade kopierten Dateien enthalten ist.

Hier der robocopy Befehl(funktioniert auch):
Code:
robocopy "c:\benutzername\Batchdatei\Start\beliebigerName" "basedir=c:\benutzername\Batchdatei\Umgebung\beliebigerName" "*.txt" /MAXAGE:3 /s /TS /FP /LOG+:"c:\benutzername\Batchdatei\Umgebung\robocopyLOG.txt"

"beliebigerName" steht hier für variable (mehrere) Ordner

Danke und Gruß
Ergänzung ()

Ich weis leider nicht warum ich meinen Beitrag nicht editieren kann, das Fenster ist immer ausgegraut...

Hier noch etwas das mir aufgefallen ist:
Schreibe ich
Code:
...echo %%a > "%log%")
Sucht er nur einmal nachdem SuchOrdner, hat er diesen gefunden passiert nix mehr, bzw. wahrscheinlich überschreibt er das Logfile einfach immer mit dem nächsten Eintrag

Wenn ich ein ">" dazu schreibe:
Code:
...echo %%a >> "%log%")
bleibt das Logfile natürlich erhalten und es werden alle Einträge übernommen. Allerdings ist das suboptimal, da ich ja beim erneuten ausführen des Batchfiles alle Einträge erneut reingeschrieben bekomme und ich um das zu verhindern, das Logfile vor jedem erneuten ausführen löschen müsste. Das ist zwar nicht weiter schlimm, ich frage mich nur warum er bei nur einem ">", nur einen Eintrag reinschreibt.
Ergänzung ()

Ich weis leider nicht warum ich meinen Beitrag nicht editieren kann, das Fenster ist immer ausgegraut...

Hier noch etwas das mir aufgefallen ist:
Schreibe ich
Code:
...echo %%a > "%log%")
Sucht er nur einmal nachdem SuchOrdner, hat er diesen gefunden passiert nix mehr, bzw. wahrscheinlich überschreibt er das Logfile einfach immer mit dem nächsten Eintrag

Wenn ich ein ">" dazu schreibe:
Code:
...echo %%a >> "%log%")
bleibt das Logfile natürlich erhalten und es werden alle Einträge übernommen. Allerdings ist das suboptimal, da ich ja beim erneuten ausführen des Batchfiles alle Einträge erneut reingeschrieben bekomme und ich um das zu verhindern, das Logfile vor jedem erneuten ausführen löschen müsste. Das ist zwar nicht weiter schlimm, ich frage mich nur warum er bei nur einem ">", nur einen Eintrag reinschreibt.
 
Also Ordner finden hast du ja schon gelöst, ich hätte sonst noch folgendes vorgeschlagen:
dir /s /b | find "suchordner" >> logdatei

Zum thema zeit abfrage, mach mal aus deine code folgendes:

1.
Code:
@echo off2.set "basedir=C:\euer Pfad"3.set "log=C:\Pfad des Logfiles"4.for /R "%basedir%" /D %%a in (*NameDesSuchOrdners) do (echo %%~ta >> "%log%")

durch das %%~ta sollte eigentlich der zeitstempel der Datei bzw des ordners angezeigt werden.
Ergänzung ()

Kannst du nicht einfach das logfile nach jedem durchgang löschen?
Ergänzung ()

ich sehe grad das da mit dem kopieren des codes irgendwas schiefgelaufen ist...

btw ich kann meine beiträge auch nicht editieren ;)
 
So, hab mich auch mal nochmal versucht. Und zwar auch mit %~ta.

Dass übrigens nur eine Zeile in dem log steht unter Verwendung von > ist logisch, da die Zeilen separat ausgeführt werden und jeweils die Datei überschreiben. Kannst ja einfach in der Batch das logfile löschen.

So wie hier hab ich den Code getestet, aus unerfindlichen Gründen kommt manchmal ein Fehler in der letzten if-Abfrage, obwohl eignentlich syntaktisch korrekt. beim nächsten Durchlauf ging's dann wieder.

Code:
@echo off

if exist neu.txt del neu.txt

set year=%date:~6,4%
set month=%date:~3,2%
set day=%date:~0,2%


for /R "%cd%" /D %%a in (*test) do (
for /F "tokens=1,2,3 delims=. " %%b in ("%%~ta") do (
set /a delta=%day%-%%b
if "%%d" == "%year%" (
	if "%%c"=="%month%" (
		if %delta% leq 3 (
			echo %%a>>neu.txt
		)
	)
)
)
)
Die Pfade musst du halt entsprechend auf deine eigenen anpassen.
 
Also ich verstehe leider nicht wie das hier im Forum mit dem antworten funktioniert :freak:
Das Feld ist oft ausgegraut, wenn ich dann die Seite ein paar mal neu lade gehts... naja:

Danke euch beiden!

@st0rax
das Datum ins Logfile zu schreiben hat geklappt, bringt mir aber direkt nichts, ich möchte ja mit dem Pfaden von Ordnern arbeiten, die eben max. z.B. 3 Tage alt sind.
Das Logfile per Batch am Anfang zu löschen ist eine gute Idee und kann so benutzt werden :)


-------------------------------------------------------


@simpsonsfan
dein Skript hat leider nicht funktioniert, habe es aber leider auch nicht vollständig verstanden.

Code:
3.if exist neu.txt del neu.txt
1. Wenn ich es richtig verstanden habe muss ich "neu.txt" durch meinen Pfad "C/...logfile.txt" ersetzen (ohne " ")
Leider löscht er das File, aber erstellt es nicht neu.

2. Die Datumsangabe:
welche Zahlen gehören da hinein? Ich kann mit 6,4 u.ä. nix anfangen :D
Ich hoffe mal nicht, das ich das aktuelle Datum immer manuell ändern müsste?


...den code dazwischen versteh ich zwar nicht, aber solange es geht brauche ich das erstmal nicht wissen...


Code:
if %delta% leq 3 (
3. die "3" gibt das Alter von 3 Tagen an?

Code:
echo %%a>>neu.txt
4. Hier wieder "neu.txt" durch meinen Pfad "C/...logfile.txt" ersetzen (ohne " ")?



Dankeschön
 
Genau, bei dir müsste das dann quasi so aussehen:

Code:
@echo off

set "basedir=c:\benutzername\Batchdatei\Umgebung"
set "search=NameDesSuchOrdners"
set /a age=3
set "log=c:\benutzername\Batchdatei\Umgebung\pfad.txt"

if exist %log% del %log%

set year=%date:~6,4%
set month=%date:~3,2%
set day=%date:~0,2%


for /R "%basedir%" /D %%a in ("*search") do (
for /F "tokens=1,2,3 delims=. " %%b in ("%%~ta") do (
set /a delta=%day%-%%b
if "%%d" == "%year%" (
	if "%%c"=="%month%" (
		if %delta% leq %age% (
			echo %%a>>%log%
		)
	)
)
)
)

Falls er dir in Zeile 20 einen Fehler bringt "3" kann syntaktisch an dieser Stelle nicht verarbeitet werden, ersetze das %delta% im Code mal testweise mit einer Zahl (z.b. 3) und starte das Skript und schreibe es wieder um, keine Ahnung, warum der blöde Fehler manchmal kommt, und dann wieder nicht.

Edit: Und wegen den Zahlen, %variable:~a,b% nimmt b Zeichen ab Stelle a eines Strings, in dem obigen Fall jeweils Jahr, Monat und Tag.
 
Zuletzt bearbeitet:
So habe es nochmal probiert.

Leider wird - falls existent - das logfile gelöscht, aber kein neues erstellt oder etwas hinzugefügt. Wenn ich die 8. Zeile deines Codes auskommentiere, wird das vorhandene Logfile natürlich nicht mehr gelöscht, hineingeschrieben allerdings auch nichts.

Wollte mal nachsehen was genau getan wird und habe das @echo off raus genommen, sowie ganz ans Ende "pause" geschrieben. Das cmd Fenster öffnet ganz kurz und schliesst jedoch wieder, trotz "pause".

Irgendeine Idee?

Gruß
 
Füge mal ein
@setlocal enabledelayedexpansion
nach Zeile 1 ein und ändere %delta% in Zeile 20 in !delta!.

Das sollte helfen.
 
Hat sich leider nichts verändert, außer:

!delta! alleine bewirkt, dass das CMD Fenster mithilfe von Pause in der letzten Zeile offen bleibt. Es steht allerdings nur drin: "Drücken Sie eine beliebige Taste"

@setlocal enabledelayedexpansion hat mit oder ohne die delta Änderung nichts bewirkt. (Oder mir ist nichts aufgefallen)

----

Übrigens steht auch nach dem ersten, obigen funktionierenden Skriptteil, nichts ausser "Drücken Sie..." in der Console (mithilfe von "pause").


Ist bei mir evtl. irgendwas falsch eingestellt, das es bei mir nicht geht??

Danke und Gruß :)
 
Also wie jetzt? ein Fehler wird nicht mehr ausgegeben, das Skript läuft so also durch?

Allerdings wird nichts ausgegeben oder wie?

Kannst du mal mit deaktiviertem echo in der Konsole nach Rechtsklick auf "Alles markieren" gehen, dann einmal auf die Eingabetaste drücken (kopiert den markierten Inhalt) und die Ausgabe hier posten?

Die verzögerte Variablenexpansion war nötig, da sonst das delta in Zeile 20 zu "" expandiert wurde. So klappt es bei mir allerdings fehlerfrei.

Ach ja, und du musst schon die Ausrufezeichen zusammen mit enabledelayedexpansion verwenden, sonst kann die Variable nicht erkannt werden.
Ergänzung ()

Ach ja, hab grade gesehen, ich hab in Zeile 15 die %-zeichen vergessen. Es muss natürlich heißen (*%search%).

Ausserdem sollten um %log% jeweils noch Anfürhungszeichen, falls der Pfad ein Leerzeichen enthält.

Also hier nochmal:

Code:
@echo on
@setlocal enabledelayedexpansion

set "basedir=%cd%"
set "search=test"
set /a age=3
set "log=C:\Users\Peter\Desktop\Neuer Ordner\neu2.txt"
 
if exist "%log%" del "%log%"

set year=%date:~6,4%
set month=%date:~3,2%
set day=%date:~0,2%


for /R "%basedir%" /D %%a in ("*%search%") do (
for /F "tokens=1,2,3 delims=. " %%b in ("%%~ta") do (
set /a delta=%day%-%%b
if "%%d" == "%year%" (
		if "%%c"=="%month%" (
			if !delta! leq %age% (
				echo %%a>>"%log%"
			)
		)
)
)
)
 
Zuletzt bearbeitet:
Super funktioniert jetzt!! :D

Nur interessenshalber:

ich kann echo jetzt auch auf off schalten. Da das Consolenfenster eh sofort zu geht und ich daraus ja keine Informationen entnehme, richtig? :cool_alt:
Ergänzung ()

Ergänzung:

Gibt noch ein Problem. Er hat auch ältere Einträge genommen teilweise. Wenn ichs mir mal in der Console anschaue, kommt es mir so vor, als würde er nach jedem Eintrag/jeder neuen for schleife, vom Datum der zuletzt gefundenen Datei, wieder 3 Tage abziehen.

Also z.B.

heute ist der 30.
Date vom 28. --> gefunden
eine Datei die danach kommt, und am 26. erstellt wurde, würde er jetzt auch finden, da sie von der letzten Datei, vom 28., weniger wie 3 Tage alt ist....


war das verständlich?
 
Ja klar, echo kann off. Hab's nur selbst zu Testzwecken wieder kurz aktiviert. Das kommt davon, wenn man unterschiedliche Versionen vom gleichen Skript hat.
Ergänzung ()

Ok, das konnte ich nicht reproduzieren (hab allerdings auch nur 3 Ordner im zu Testzwecken, zwei vom 29. und einer vom 22.

Dann bitte vor dem
if !delta! leq %age% (
, also nach Zeile 20 noch ein echo !delta! und den Output hier reinkopieren.

Was ich mir vorstellen kann: Ich glaube %%~ta nimmt das Änderungsdatum, nicht das Erstelldatum. Vielleicht müsste man da nach was anderem schauen.
 
Zuletzt bearbeitet:
Kann dir den Output nicht reinkopieren, da es sauviele Zeilen/Dateien sind. Das passt hier gar nicht rein :lol:
Was mir allerdings noch aufgefallen ist, alle hineingeschriebenen Pfade, stammen von Dateien, welche ausschliesslich diesen Monat erstellt wurden.

Entweder ist das jetzt Zufall, oder es ist ein Indiz dafür, das im Script etwas mit dem "tag"-Teil nicht stimmt.

Gruß
 
Stimmt, momentan müssen das Änderungsdatum im selben Monat liegen, das ist so natürlich nicht immer richtig. Ich muss mir das die Tage mal noch anschauen. Mit dem dir-Befehl kann man evtl. auch an das Erstelldatum statt an das Änderungsdatum ran. Da muss dann aber einiges umgeschrieben werden. Hab heute keine Zeit mehr, aber vllt. mal die Woche noch schau ich mir das nochmal an.
 
So. Mittels dir /T:c kommt man an das Erstelldatum statt dem Änderungsdatum.

Was die Datumsrechnerei angeht, das ist wirklich kein Spaß mit Batch. Daher habe ich mich mal bei http://stackoverflow.com/questions/11210997/dos-date-math bedient.

In der folgenden Batch wird jedes gültige Datum einzeln abgefragt. Das heißt, du musst, um die 3-Tages-Frist zu verändern halt ein paar Zeilen einfügen bzw. entfernen. Es geht also nicht so komfortabel, einfach nur einen Wert umzustellen.
Evtl. ließe sich das auch noch entsprechend umschreiben, sodass das geht, ich bin mir aber grade nicht sicher, ob nach einem call die for-Schleife weiterlaufen würde.
Zumindest für ein Erstellungsdatum innerhalb der letzten drei Tage (bzw. vier: vor drei Tagen, vor zweien, gestern und heute) müsste die folgende Batch klappen:

Code:
@echo off

:Einstellungen
set "basedir=Hauptverzeichnis"
set "search=Suchtext"
set "log=Pfad zum logfile"

if exist "%log%" del "%log%"

call :datetojulian %date%

set /a jdate1=jdn-1
set /a jdate2=jdn-2
set /a jdate3=jdn-3

call :juliantodate %jdate1% date1
call :juliantodate %jdate3% date2
call :juliantodate %jdate2% date3


set "basedir=%cd%"
set "search=test"
set /a age=3
set "log=C:\Users\Peter\Desktop\Neuer Ordner\neu2.txt"

cd "%basedir%"

setlocal enabledelayedexpansion

for /F "delims=" %%a in ('dir /A:D /S /B *%search%') do (
	cd "%%a"
	set /a zeilennr=1
	for /F "skip=5 tokens=1 delims=
 " %%b in ('dir /A:D /T:C') do (
		if !zeilennr! == 1 (
			REM Hier kommen die Tage, bei denen aufgelistet wird rein
			if %%b==%date% echo %%a >>"%log%"
			if %%b==%date1% echo %%a >>"%log%"
			if %%b==%date2% echo %%a >>"%log%"
			if %%b==%date3% echo %%a >>"%log%"
		)
		set /a zeilennr=zeilennr+1
	)
)
endlocal

goto :end

:datetojulian
REM CONVERT DATE TO JULIAN DAY NUMBER
REM ANTONIO PEREZ AYALA
REM GET MONTH, DAY, YEAR VALUES
FOR /F "TOKENS=1-3 DELIMS=." %%A IN ("%1") DO SET DD=%%A& SET MM=%%B& SET YY=%%C
REM ELIMINATE LEFT ZEROS
SET /A DD=10%DD% %% 100, MM=10%MM% %% 100
REM CALCULATE JULIAN DAY NUMBER
IF %MM% LSS 3 SET /A MM+=12, YY-=1
SET /A A=YY/100, B=A/4, C=2-A+B, E=36525*(YY+4716)/100, F=306*(MM+1)/10, JDN=C+DD+E+F-1524
goto :eof

:juliantodate
REM CONVERT JULIAN DAY NUMBER TO MONTH, DAY, YEAR
REM ANTONIO PEREZ AYALA
SET /A W=(%1*100-186721625)/3652425, X=W/4, A=%1+1+W-X, B=A+1524, C=(B*100-12210)/36525, D=36525*C/100, E=(B-D)*10000/306001, F=306001*E/10000, DD=B-D-F, MM=E-1, YY=C-4716
IF %MM% GTR 12 SET /A MM-=12, YY+=1
REM INSERT LEFT ZEROS, IF NEEDED
IF %DD% LSS 10 SET DD=0%DD%
IF %MM% LSS 10 SET MM=0%MM%
REM SHOW THE DATE
set %2=%DD%.%MM%.%YY%
goto :eof

:end
 
Zurück
Oben