webtrajo
Goto Top

Batch Script welches Pfad zu allen a.txt Dateien ausgibt?

Hallo,

ich bin auf der Sucher nach einem Script welches einen Verzeichnispfad auf meiner
Festplatte nach "a.txt" durchsucht und mir dazu die dazugehörigen Pfade ausgibt.

Hat jemand eine Idee?

Vielen Dank!
Gruß

Content-Key: 141477

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

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

Member: Dani
Dani Apr 26, 2010 at 12:56:30 (UTC)
Goto Top
Hi,
versuch es mal manuell in der Konsole mit "dir /s /b a.txt". Damit sollten alle Dateien gefunden und ausgegeben werden.


Grüße,
Dani
Member: webtrajo
webtrajo Apr 26, 2010 at 13:05:13 (UTC)
Goto Top
Hallo,
leider kein Erfolg. Gibt es eine andere Möglichkeit?
Gruß
Member: edepfau
edepfau Apr 26, 2010 at 13:05:13 (UTC)
Goto Top
Auf der Kommandozeile listet
for /R E:\PFAD %i in (a.txt) do @echo %i

alle Dateien namens "a.txt" in E:\PFAD und allen Unterverzeichnissen auf, vollständig mit Pfad.

for /R E:\PFAD %i in (a.txt) do @echo %~pi

gibt nur die Pfade zurück. Allerdings auch mehrfach, wenn es mehr als ein Treffer pro Verzeichnis gibt.


Hast Du wirklich vorher schon alles durchprobiert gehabt?

Gruss,
Ede
Member: Dani
Dani Apr 26, 2010 at 13:10:27 (UTC)
Goto Top
Hi,
seltsam...was für ein Betriebssystem benutzt du?

Bei mir sieht das so aus:
C:\>dir /s /b firefox
C:\Lokal\Firefox
C:\Lokal\Firefox\App\Firefox
C:\Users\test\AppData\Roaming\Mozilla\Firefox
Läuft bei mir unter Windows 7...


Grüße,
Dani
Member: bastla
bastla Apr 26, 2010 at 13:26:26 (UTC)
Goto Top
@edepfau
Schaut auch lustig aus, wenn Du
for /R E:\PFAD %i in (ichbinnichtda.txt) do @echo %i
draus machst ... face-wink

Insofern würde ich Danis Ansatz bevorzugen (und zur Not mit "/a-d" ergänzen).

Grüße
bastla
Member: edepfau
edepfau Apr 26, 2010 at 13:42:12 (UTC)
Goto Top
das scheint eine Eigenart der for-Schleife zu sein..kann aber sehr einfach durch
for /R E:\PFAD %i in (a.txt) do @if exist %i echo %~pi

behoben werden.
Inzwischen habe ich mich darum gekümmert, den uniq-Befehl nachzubilden, damit die Pfade nur einmal angezeigt werden.

Das geht in einem Batchfile z.B. so
@echo off
for /R E:\PFAD %%i in (%1) do @if exist %%i CALL :COMP "%%~pi"  
set _last=
set _this=
goto :EOF

:COMP
set _this=%~1
if defined _last (
   if not "%_last%"=="%_this%" (  
      set _last=%_this%
      echo %_this%
   )
) else (
   echo %_this%
   set _last=%_this%
)
goto :EOF

Als erster Parameter wird der Dateiname oder ein Muster erwartet (*.log). Ausserdem werden hier Pfade mit Leerzeichen richtig behandelt.

Der Vorschlag mit "dir /s" hat den Nachteil, dass keine Pfade aufgelistet werden.
Member: bastla
bastla Apr 26, 2010 at 14:07:06 (UTC)
Goto Top
@edepfau
Der Vorschlag mit "dir /s" hat den Nachteil, dass keine Pfade aufgelistet werden.
Sollte wirklich "nur Pfade" gemeint gewesen sein, dann wäre natürlich eine Schleife erforderlich - zB in der "/f"-Variante (müsste sich dann auch nur um die tatsächlichen Treffer kümmern) - konkret:
for /f "delims=" %%i in ('dir /s /b /a-d "E:\PFAD\a.txt"') do @echo %%~dpi
Abgesehen davon würde ich "Pfad" trotzdem nicht so eng auslegen und daher eher "%%~dpi" verwenden ...

... was allerdings beides letztlich nur webtrajo (BTW: Willkommen im Forum!) wirklich wissen kann.

Grüße
bastla

P.S.: "unique" je Verzeichnis sollten Dateien namens "a.txt" eigentlich ohnehin sein ...
Member: Biber
Biber Apr 26, 2010 at 14:19:45 (UTC)
Goto Top
Moin bastla und edepfau,

Zitat von @bastla:
@edepfau
Schaut auch lustig aus, wenn Du
for /R E:\PFAD %i in (ichbinnichtda.txt) do @echo %i
> 
draus machst ... face-wink
Zitat von @edepfau:
das scheint eine Eigenart der for-Schleife zu sein..kann aber sehr einfach durch
> for /R E:\PFAD %i in (a.txt) do @if exist %i echo %~pi
> 
behoben werden.
Nun macht mal nicht die jungen Nachwuchstalente nervös.
So schlimm haben es die RedmonderInnen ja auch nicht zusammenphantasiert.

Der oben von bastla angesprochene Effekt tritt natürlich nur auf, wenn man/frau es zulässt - dadurch, dass eine Datei EXAKT gesucht / Wildcards weggelassen werden.

Wird der Dateiname "ichBinNichtDa.bla" um ein Wildcard-Fragezeichen z.B am Ende ergänzt, dann kommt kein vermeintlicher Fehlalarm.
Oder nochmal zur Verdeutlichung:
>for /r "." %i in (bla.blubb) do @echo %i
....
D:\temp\test\texte\bla.blubb
D:\temp\test22\bla.blubb
D:\temp\test222\bla.blubb
D:\temp\testheute\bla.blubb
....
.....{ gibt es natürlich nirgends, aber 57 Unterverzeichnisse werden aufgelistet }

>for /r "." %i in (bla.blubb?) do @echo %i
{ keine einzige Zeile Output .... as should do...}
--
-- Gegenprobe mit EXISTIERENDEN Dateien: mit und ohne Wildcards:
--
>for /r "." %i in (feef.txt) do @echo %i
...{Existiert 1x, aber 57 Verzeichnisse werden angelistet}
>for /r "." %i in (feef.txt?) do @echo %i
D:\temp\test\feef.txt ----> genau eine Fund-Zeile as should do

Grüße
Biber

P.S.
Der Vorschlag mit "dir /s" hat den Nachteil, dass keine Pfade aufgelistet werden.
Dann könnten wir doch "Dir /s /b" nehmen...,-)
Member: edepfau
edepfau Apr 26, 2010 at 14:34:27 (UTC)
Goto Top
>for /r "." %i in (bla.blubb?) do @echo %i   

krank, aber cool; danke, wieder was gelernt.
Ich werde immer noch nicht glücklich mit "dir /s/b". Anders als der OP suche ich nämlich gleich nach einem wildcard (*.log), nach der Überlegung "kann er wildcard, kann er auch exakte Namen". Dann brauche ich aber ein uniq hinterher, um mehrfache Pfade auszusieben.
Ist doch gelungen, oder? (uniq meine ich)

Gruss,
Ede
Mitglied: 77559
77559 Apr 26, 2010 at 14:53:42 (UTC)
Goto Top
Zitat von @edepfau:
Dann brauche ich aber ein uniq hinterher, um mehrfache Pfade auszusieben.
Ist doch gelungen, oder? (uniq meine ich)
Hallo Ede,

wenn man mal vom didaktischen Nutzen der Variable "_this" absieht ließe sich das kürzer formulieren:
:COMP
if defined _last if "%_last%"=="%~1%" Goto :eof
echo.%~1
set "_last=%~1"

Gruß
LotPings
Member: edepfau
edepfau Apr 26, 2010 at 15:09:11 (UTC)
Goto Top
Hallo LotPings,

ja, viel klarer jetzt:
:UNIQ
if defined _last if "%_last%"=="%~1" goto :EOF  
echo %~1
set "_last=%~1"  
goto :EOF

In der Zeile 2 war noch ein "%" zuviel. Der Code wird jetzt auch etwas schneller laufen, weil weniger shells gestartet werden müssen.

Falls der OP noch mitliest: im Batchfile weiter oben muss jetzt natürlich CALL :UNIQ stehen.

NB: "echo.%var" und "echo %var" sind äquivalent, oder kenne ich da was noch nicht?
Mitglied: 77559
77559 Apr 26, 2010 at 15:27:10 (UTC)
Goto Top
Zitat von @edepfau:
NB: "echo.%var" und "echo %var" sind äquivalent, oder kenne ich da was noch nicht?
Alte (gute) Gewohnheit, wenn eine Variable keinen Inhalt hat, verhindert der Punkt das Echo den Satus [ON|OFF] zurückgibt.

Gruß
LotPings
Member: bastla
bastla Apr 26, 2010 at 15:45:51 (UTC)
Goto Top
... verhindert der Punkt das Echo den Satus [ON|OFF] zurückgibt.
... es darf aber zB auch ein "\", ein "," oder ein ";", oder wenn Du magst auch ein "+" sein - so, wie eben bei Bedarf auch eine Leerzeile erzeugt werden kann ...
---
So schön die "UNIQisierung" inzwischen auch umgesetzt ist face-smile - ich sehe in diesem Fall weiterhin keine Notwendigkeit dafür (es sei denn, webtrajo hätte tatsächlich mehrere "a.txt" in einem Verzeichnis versammelt face-wink) ...

Grüße
bastla
Mitglied: 77559
77559 Apr 26, 2010 at 16:00:50 (UTC)
Goto Top
Zitat von @bastla:
... es darf aber zB auch ein "\", ein "," oder ein ";", oder wenn Du magst auch ein "+" sein - so, wie eben bei Bedarf auch eine Leerzeile erzeugt werden kann ...
Wenn schon, denn schon ":" und "/" tun es auch.
Im Usenet gab es mal eine Untersuchung dazu, welche der Trenner schneller verarbeitet wurden, aber bei der Geschwindigkeit heutiger CPUs ist das marginal.

Gruß
LotPings
Member: Biber
Biber Apr 26, 2010 at 16:04:43 (UTC)
Goto Top
[OT] @bastla
Zitat von @bastla:
es sei denn, webtrajo hätte tatsächlich mehrere "a.txt" in einem Verzeichnis versammelt face-wink) ...

Ich nehme doch stark an, dass so ein 64bit-Win7-OktaCore-Bolide auch Dateien in 3 oder 4 Dimensionen stapeln kann, oder? face-wink

Sonst hätten wir doch alle immer noch mit Windows XP mailen und Solitaire spielen können...

Grüße
Biber
[/OT]
Member: bastla
bastla Apr 26, 2010 at 16:05:20 (UTC)
Goto Top
[OT]
@77559
Ja willst Du denn Biber gar nix mehr übrig lassen? face-wink

Grüße
bastla
[/OT]