yauhun
Goto Top

Batch-Anfängerfrage: Variablenfreie Ausgabe und mehrere Suchergebnisse ermöglichen

Hallo liebe Leute, mein erster Beitrag.

Ich versuche mich seit gestern erstmals am Batch-Scripting, also blutiger Anfänger.
Nach fleißigem Nachlesen ist mein erstes kleines Tool ausführbar und einigermaßen funktional.
Die Idee war, eine kleine *.cmd Datei zu haben, die meinen PC nach Ordnern oder Dateien durchsucht, die ich eingebe und mir anschließend den Pfad ausgibt, unter welchem die Datei zu finden ist. Gesucht werden kann auch mit Platzhaltern wie „*“ und „?“.

Inzwischen habe ich auch geschafft, dass mein Programm sich nicht einfach schließt bei falschen Usereingaben, usw.

Zwei Probleme bekomme ich allerdings nicht in den Griff, weiß ehrlich gesagt auch nicht genau, wonach ich am besten googeln sollte bzw. die Suchergebnisse behandeln meistens ähnliche aber doch andere Probleme. Ich hoffe, ihr könnt mir Tipps geben.

Problem 1:
Meine Suche ist so noch ziemlich ineffizient. Es wird immer nur ein Ergebnis (Pfad) ausgegeben, das erste beste.
Suche ich z.B. nach „Beispiel.txt“, und die Datei existiert mit identischem Namen in zwei Ordnern, bekomme ich trotzdem nur den erstbesten Pfad ausgegeben.
Suche ich z.B. nach „Beispiel*“, und erhoffe mir die „Beispiel2.txt“, habe aber Pech und woanders gibt es die „Beispiel1.txt“, könnte ich den falschen Pfad erhalten.
Ich würde gerne, falls vorhanden mehrere Pfade ausgeben, bzw. alle passenden Dateien suchen lassen. Mein Tool hört nach dem ersten Ergebnis scheinbar zu suchen auf.

Problem 2:
Suche ich z.B. nach „Beisp*.txt“, wird das Tool brav die „Beispiel.txt“ in z.B. den eigenen Dokumenten finden und mir den Pfad ausgeben.
Leider wird aber auch meine uneindeutige Variable übergeben, nämlich: „File „Beisp*.txt“ found under <path>.“
Schöner wäre natürlich, wenn der korrekte Name der gefundenen Datei am Schluss ausgegeben wird („File „Beispiel.txt“ found under <path>.“), und nicht meine amateurhafte Usereingabe.
Ich habe dazu auch schon ein bisschen gesucht, nach „veränderten Variablen ausgeben“ usw., aber die Leute wollen scheinbar alle was anderes als was ich hier versuche.

Hier mein Code-Ausschnitt, der für die Analyse vermutlich nötig ist:

echo Name of the searched folder/file:
echo.
SET /p SearchedData=
If "%SearchedData%"=="" cls & goto start  

echo.
echo Please wait, data is being searched...
echo.

If not defined PathFound for /F "delims=" %%i in ('dir /b /s "c:\%SearchedData%" ^2^>Nul') do set "PathFound=%%~dpi"  
If not defined PathFound for /F "delims=" %%i in ('dir /b /s "d:\%SearchedData%" ^2^>Nul') do set "PathFound=%%~dpi"  

If not defined PathFound (
	echo File "%SearchedData%" not found.  
	) else (
	echo File "%SearchedData%" found under "%PathFound%".   
	)

set PathFound=
endlocal

Und wie gesagt, ich bin absoluter Frischling, jedoch lernfähig, bitte nicht gemein sein. face-smile

Gruß
Yauhun

Content-Key: 319028

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

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: Biber
Lösung Biber 25.10.2016 um 15:54:24 Uhr
Goto Top
Moin Yauhun,

willkommen im Forum.
Versuche es mit diesen (ungetesteten) Änderungen;
echo Name of the searched folder/file:
echo.
SET /p SearchedData=
If "%SearchedData%"=="" cls & goto start  

echo.
echo Please wait, data is being searched...
echo.

REM Entweder werden ein oder mehrere Treffer ausgegeben
for /F "delims=" %%i in ('dir /b /s "c:\%SearchedData%" ^2^>Nul') do (   
   set "PathFound=jepp"  
  echo File "%SearchedData%" found as "%%~nxi" in "%%~dpi".   
)

REM Oder es wird dieses  ausgegeben
If not defined PathFound (
	echo File "%SearchedData%" not found.  
)
set PathFound=
endlocal

Da die Variable %PathFound% nur als Flag dient, also als boolsche Variable "Gefunden_oder_nicht" ist ziemlich egal, was du da rein schreibst. Gesetzt oder nicht gesetzt ist wesentlich und steuert den Programmfluss.

Grüße
Biber
Mitglied: Yauhun
Yauhun 26.10.2016 aktualisiert um 09:04:01 Uhr
Goto Top
Das löst es simpel und einfach. Vielen Dank für deine Hilfe und dein großes Engagement auf dieser Seite, habe schon viel von dir gelesen.
Ich denke ich schaue mir nochmal den For-Schleifen-Guide an.
Gibt es noch die Möglichkeit, dynamisch zu suchen für den Fall mehrerer Laufwerke - wie baue ich das Syntaxtechnisch korrekt auf? Grad schon bisschen ausprobiert, mir ein Laufwerk erstellt, aber scheinbar ergänze ich weitere Laufwerkssuche dann falsch denn es durchsucht trotzdem nur C.

EDIT: Hat sich erledigt, hab's hinbekommen... manchmal sieht man den Wald vor lauter Bäumen nicht.
In jedem Fall vielen Dank, Biber.