o0julia0o
Goto Top

Nach Datei in Ordner samt Unterordner suchen

hi, ich möchte nach einer Datei in einem Ordner und allen Unterordnern suchen.
Die Batch-Datei selbst befindet sich dabei einen Ordnerbaum höher als der Ordner, welcher durchsucht werden soll.

Wenn die Datei gefunden wird möchte ich den Pfad ausgegeben haben in einer Variablen.
Ist es auch möglich weitere Pfade auszugeben, wenn die Datei an meheren Orten ist?

set gesuchtedatei=info.txt
set fundort1
set fundort2
set fundort3

Content-ID: 5539875887

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

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

DarkZoneSD
DarkZoneSD 30.11.2023 aktualisiert um 07:31:31 Uhr
Goto Top
Moin,

ich habe hier einmal eine Lösung in Powershell, falls es wirklich Batch seien muss bin ich leider überfragt face-sad

[String] $zieldatei = "test.txt"  
$items = Get-ChildItem -Path $PSScriptRoot -Recurse -Filter $zieldatei
$itemArray = @()
foreach ($item in $items) {
    $itemArray += $item.FullName
}
$itemArray

Statt einzelne Variablen für die Dateien anzugeben, werden sie fortlaufen in einem Array gespeichert.

Grüße

Florian
8030021182
8030021182 30.11.2023 aktualisiert um 07:58:15 Uhr
Goto Top
Batch
@echo off &setlocal enabledelayedexpansion 
set "gesuchtedatei=info.txt"  
for /f "delims=" %%a in ('dir /b /s /a-d "%~dp0%gesuchtedatei%"') do (  
    set "folder=%%~dpa"  
    echo Gefunden in : !folder!
)
PowerShell
$files = Get-ChildItem $psscriptroot -File -Recurse -Filter "info.txt"  
$files
G. Katrin
TK1987
TK1987 30.11.2023 um 08:27:40 Uhr
Goto Top
Moin,

Zitat von @8030021182:
Batch
@echo off &setlocal enabledelayedexpansion 
set "gesuchtedatei=info.txt"  
for /f "delims=" %%a in ('dir /b /s /a-d "%~dp0%gesuchtedatei%"') do (  
    set "folder=%%~dpa"  
    echo Gefunden in : !folder!
)
da fehlt aber noch der letzte Part:
Zitat von @o0Julia0o:
Ist es auch möglich weitere Pfade auszugeben, wenn die Datei an meheren Orten ist?

set gesuchtedatei=info.txt
set fundort1
set fundort2
set fundort3
@echo off

set gesuchtedatei=info.txt
set zaehler=0

for /F "Delims=" %%A in ('dir /s /b /a-d "%gesuchtedatei%"') do call :Fund "%%~A"  

if %zaehler% gtr 0 echo]Die Datei wurde %zaehler% mal gefunden.
pause
exit /b 0

:Fund
  set /a zaehler+=1
  set fundort%zaehler%=%~dp1
  echo]Gefunden in: %~dp1

Gruß Thomas
8030021182
8030021182 30.11.2023 aktualisiert um 09:06:18 Uhr
Goto Top
Den Part hatte ich mir gespart, da man den Ordner ja eh schon in der Schleife als Variable im Zugriff hat und direkt verarbeiten kann.
Die Denke mit den separaten Variablen ist IMHO noch aus dem letzten Jahrhundert, oder macht derjenige der FOR-Loops noch nie gesehen hat. 🤪
TK1987
TK1987 30.11.2023 um 09:23:57 Uhr
Goto Top
Zitat von @8030021182:
Den Part hatte ich mir gespart, da man den Ordner ja eh schon in der Schleife als Variable im Zugriff hat und direkt verarbeiten kann.
Na dann hätte aber auch ein simples echo gereicht und man hätte sich das Zwischenspeichern in einer Variable komplett sparen können 😜

Die Denke mit den separaten Variablen ist IMHO noch aus dem letzten Jahrhundert, oder macht derjenige der FOR-Loops noch nie gesehen hat. 🤪
Stimmt zwar, manchmal kommt es aber auch vor, das man die Orte irgendwann später im Skript erneut abarbeiten muss. So könnte man diese dann später mit "for /L" erneut abfrühstücken.
Oder man startet das Skript mit "cmd /k" und hat dann später in der Kommandozeile Zugriff auf die Variablen.
8030021182
8030021182 30.11.2023 aktualisiert um 09:31:54 Uhr
Goto Top
Zitat von @TK1987:
Na dann hätte aber auch ein simples echo gereicht und man hätte sich das Zwischenspeichern in einer Variable komplett sparen können 😜
Ja klar, vermutlich hätts der TO dann aber wohl nicht ganz verstanden , das war quasi nur eine kleine "Gehhilfe" um zu verdeutlichen was was ist 🤗.
o0Julia0o
o0Julia0o 01.12.2023 aktualisiert um 01:03:35 Uhr
Goto Top
Danke face-smile

"Delims="   
ist überflüssig, da hier ja nur einer Zeile gerarbeitet wird. Es ist ja nicht einmal ein Trennzeichen definiert. Oder?


Die Datei wird jedoch nicht im Ordnerbaum höher gesucht.

Also Such.bat liegt hier:
D:\Ordner1\Ordner2\Such.bat

Gesucht werden soll in allen Ordnern und Unterordnern von:
D:\Ordner1\

Wobei das aber relativ zur Such.bat ist. Ordner1 könnte auch OrdnerX heissen. Dann soll die Batch ohne absolute Pfadangabe trotzdem noch funktionieren.

Geht das, dass in "D:\Ordner1\Ordner2\" und dessen Unterordner nicht gesucht wird? Also da wo die Batch im Ordner liegt soll nicht gesucht werden. Auch nich in Unterordnern davon.

Ich habe es bereits mit einem einleitemdem "cd.." versucht, was aber nicht funktioniert. Dann mit:
set "Ordner=%~dp0"  
set "Ordner=%Ordner:~0,-1%"  

for /F "Delims=" %%A in ('dir %Ordner% /s /b /a-d "%gesuchtedatei%"') do call :Fund "%%~A"  
Was aber auch nicht so recht funktionieren möchte.


Kann ich den Fundort der Dateien in Variablen schreiben lassen?
Also es gibt ja maximal 3 Orte, die ich ja definieren kann:
set Ort1=
set Ort2=
set Ort3=
set fundort%zaehler%=%~dp1
...das müsste man in eine Variable schreiben lassen. So dass jede der 3 Ort-Variablen dann einen anderen Pfad enthält, welcher auch leer sein kann.
TK1987
TK1987 01.12.2023 um 01:30:28 Uhr
Goto Top
Zitat von @o0Julia0o:
"Delims="   
ist überflüssig, da hier ja nur einer Zeile gerarbeitet wird. Es ist ja nicht einmal ein Trennzeichen definiert. Oder?
Standardmäßig sind Leerzeichen als Trennzeichen definiert. Falls der Pfad Leerzeichen enthält, wird nur alles bis zum ersten Leerzeichen verarbeitet, der Rest wird abgeschnitten. "Delims=" sorgt hier eben dafür, das kein Trennzeichen mehr definiert ist und somit der komplette Pfad inklusive Leerzeichen in der Schleifenvariable landet.

Die Datei wird jedoch nicht im Ordnerbaum höher gesucht.
Du hattest ja auch gesagt...
Die Batch-Datei selbst befindet sich dabei einen Ordnerbaum höher als der Ordner, welcher durchsucht werden soll.
du meintest also, die Batchdatei liegt eine Ebene tiefer.

Geht das, dass in "D:\Ordner1\Ordner2\" und dessen Unterordner nicht gesucht wird? Also da wo die Batch im Ordner liegt soll nicht gesucht werden. Auch nich in Unterordnern davon.
Sicher geht das:
@echo off

set gesuchtedatei=info.txt
set zaehler=0
call :Elternpfad "%CD%"  

for /F "Delims=" %%A in ('dir /b /ad "%pfad%*" ^| find /v "%ordner%"') do (  
  for /F "Delims=" %%B in ('dir /s /b /a-d "%pfad%%%~A\%gesuchtedatei%"') do call :Fund "%%~B"   
)
if %zaehler% gtr 0 echo]Die Datei wurde %zaehler% mal gefunden.

pause
exit /b 0

:Elternpfad
  set ordner=%~nx1
  set pfad=%~dp1
  exit /b 0
  
:Fund
  set /a zaehler+=1
  set fundort%zaehler%=%~dp1
  echo]Gefunden in: %~dp1

Gruß Thomas