webazubi
Goto Top

Batch: Suche Ordner, der dem Suchordner am nähesten kommt

Hallo.
Ich komme mit einer Batch nicht weiter.
Ich suche einen vorhandenen Ordner, der so ähnlich klingt wie ein Suchordner.

Ich habe also eine Variable, in der ein Teil eines Ordnernamens gespeichert wird. Ich möchte nun, dass mir die Batch den real existierenden Ordnernamen ausgibt, der dem Suchordner am ehesten entspricht.

Konkret geht es darum, dass ich viele Fotos in der Regel nach dem Muster JJJJMMTT_Zähler.jpg benannt habe. Diese Fotos sind in der Regel in einem Ordner, der ebenfalls aus dem Datum rückwärts besteht.
Also z.B.

C:\fotos\2006\20061214\
und darin sind dann Dateien wie
20061214_01.jpg
20061214_02.jpg ...

Ich habe aber einen weiteren Ordner, in dem Fotos liegen, die zwar vom Dateinamen her wie der Ordnername benannt sind, aber manche Ordner können inzwischen umbenannt sein.
Beispiel:
Die Datei heißt 20061214_01.jpg
der Ordner heißt aber inzwischen 2006\20061214XXX

Ich möchte jetzt per Batch überprüfen, in welchem Ordner die Datei liegt.
Dazu übergebe ich den Dateinamen an die Batch. Ist Ordername und Dateiname eindeutig vom Datum her, klappt das auch schon, und das Fotoprogramm (ThumbsPlus) öffnet mit den Ordner und setzt sogar den Focus auf die Datei aus dem Suchordner.
Doch wenn Ordername und Dateiname nicht eindeutig übereinstimmen, komme ich nicht weiter.

Habe versucht
Dir /s /b /ad %suchdir% | findstr /e /i "\%strjahr%%strmonat%%strtag%*"  
und auch andere Wildcards getestet, aber es wird mir gar kein Ordner angezeigt. Was mache ich falsch?
Danke

Content-Key: 366296

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: Friemler
Friemler Feb 27, 2018 updated at 23:32:52 (UTC)
Goto Top
Hallo webazubi,

die Syntax für Suchmuster in FINDSTR unterscheidet sich von den "normalen" Dateimasken, wie man sie z.B. vom DIR-Befehl her kennt. Wie immer hilft natürlich FINDSTR /? als erstes weiter...

Suchmuster in FINDSTR sind eine sehr rudimentäre Version von regulären Ausdrücken. Was Du wahrscheinlich benötigst ist folgendes:
findstr /ie "\%strjahr%%strmonat%%strtag%.*"

Grüße
Friemler
Member: Pjordorf
Pjordorf Feb 27, 2018 at 23:57:27 (UTC)
Goto Top
Hallo,

Zitat von @webazubi:
Ich suche einen vorhandenen Ordner, der so ähnlich klingt wie ein Suchordner.
Solange du deinen Namen noch kennst face-smile
Da das suchen in (DOS ?) oder in Batchdatei doch länger dauert, vielleicht ein Suchwerkzeug nutzen welches ein weinig schneller ist und dir evtl. auch möglichkeiten beim Dateiöffnen bietet. http://www.voidtools.com/ oder etwas langsamer beim Suchen aber dafür mit anderen Optionen https://www.mythicsoft.com/agentransack/ (oder File Locator Lite)

Gruß,
Peter
Member: Kraemer
Kraemer Feb 28, 2018 at 07:20:03 (UTC)
Goto Top
Zitat von @Pjordorf:
(DOS ?)
nö!
Member: webazubi
webazubi Feb 28, 2018 at 15:07:58 (UTC)
Goto Top
Hallo. Danke für die Hinweise.
Ich würde es gerne mit Bordmitteln (Windows 10) machen statt auf externe Lösungen zu greifen.
Leider klappt es noch nicht.
Ich habe jetzt folgendes:
Einen Ordner C:\Fotos\2016\20160308x
mit der Datei darin 20160308_05.JPG

Und einen Ordner C:\Fotos\sammlung
mit der Datei 20160308_05.JPG darin

An meine Batch übergebe ich den Dateinamen 20160308_05.JPG
den ich mit set strtag=%str:~6,2% usw. auf das Jahr, Monat, und Tag zurechtschneide.

Jetzt kommt
set SUCHJAHR="C:\Fotos\%strjahr%"  
und dann
Dir /s /b /ad %SUCHJAHR% | findstr /ie "\%strjahr%%strmonat%%strtag%.*"  

Wenn ich das ausgebe mit
echo  Suche in: %SUCHJAHR% suche nach: \%strjahr%%strmonat%%strtag%.* 
kommt:
C:\Fotos\sammlung>echo Suche in; "C:\Fotos\2016 suche nach: \20160308.*

Den Backslash hatte ich schon versucht an 2016 ranzuhängen, ging aber auch nicht.

Ich hätte jetzt erwartet, dass mit das gesuchte Verzeichnis ausgegeben wird. Oder müsste ich das erst in einer Variablen speichern?
Member: Pjordorf
Solution Pjordorf Feb 28, 2018 at 18:01:09 (UTC)
Goto Top
Hallo,

Zitat von @webazubi:
Den Backslash hatte ich schon versucht an 2016 ranzuhängen, ging aber auch nicht.
set SUCHJAHR="C:\Fotos\%strjahr%\"  
gibt dir den Backslash am ende

Ich hätte jetzt erwartet, dass mit das gesuchte Verzeichnis ausgegeben wird.
Das Verzeichniss nicht aber dessen Inhalt sofern da etwas was dein Suchbegriff entspricht gefunden wird. Ein "%strjahr%%strmonat%%strtag%.*" sucht nach genau diesen Inhalt, und der existiert nicht. Ein
 Dir /s /b /ad %SUCHJAHR% | findstr /ie "%strjahr%%strmonat%%strtag%*.*"  
sollte da näher kommen.

Oder müsste ich das erst in einer Variablen speichern?
Nö, aber wenn du es möchtest.

Du solltest dich mal mit Findstr mit Regulären Ausdrücken (Regular Expressions RegEx) befassen (dürftig).
https://www.windows-commandline.com/findstr-command-examples-regular/
https://stackoverflow.com/questions/2613826/regular-expressions-in-finds ...
https://stackoverflow.com/questions/13028228/regular-expression-with-fin ...

Gruß,
Peter
Member: webazubi
webazubi Feb 28, 2018 at 20:43:39 (UTC)
Goto Top
Hallo.
Habe jetzt das hier:
set SUCHJAHR="C:\Fotos\%strjahr%\"  
for /f %%i in ('Dir /s /b /ad %SUCHJAHR% ^| findstr /ie "%strjahr%%strmonat%%strtag%*.*"') do Set var=%%i  
(Das |-Zeichen muss kaschiert werden)
var gibt mir einen Ordner aus, der unter dem gesuchten Datumsnamen liegt. Das hilft mir schon mal weiter.
Denn tatsächlich können unter C:\Fotos\2016\20160308x auch noch weitere Ordner liegen. z.B.
C:\Fotos\2016\20160308x\auswahl
C:\Fotos\2016\20160308x\www
usw.
Die Batch findet einen dieser Unterordner, nicht aber den Hauptordner. Von daher wäre es ja schön, wenn die Batch die gefundenen Ordner durchnummerieren würde und ich dann nur noch 1, 2 oder 3 eintippen muss, um zu dem gewünschten Ordner zu gelangen. Dafür eine Idee?
Aber auf jeden Fall schon mal vielen Dank bis hierher!!!!!