christian001
Goto Top

Batch Schleife in Schleife mit Variable

Hallo liebe Community,

ich möchte über ein Batch Ordner auf dem Server öffnen.
Der Aufbau auf dem Server sieht wie folgt aus:

Direct - Directsub - AufD
Y:\Kd001\Pr001\00123345
Y:\Kd001\Pr001\00123346
Y:\Kd002\Pr002\00223345
Y:\Kd002\Pr002\00223346
Y:\Kd003\Pr004\00323346
Y:\Kd003\Pr004\00323347
Y:\Kd003\Pr004\00323348

Jeder dieser Ordner hat nochmals min 8 Unterordnen und diese können auch nochmals Unterordnen haben.

Irgendwie funktioniert dieses verschachtelte Schleife nicht bzw. habe einen Knoten im Kopf face-wink.
Vielleicht könnt ihr mir weiterhelfen.

@echo off & SETLOCAL ENABLEDELAYEDEXPANSION
title Oeffnen vom Ordner

:Start1
echo.
set /p AufD=Nummer eingeben:

set Direct=Y:\
for /f %%n in ('dir %Direct% /A:D /B ') do (  
   set Directsub=%Direct%\%%n
    for /f %%n in ('dir %Directsub% /A:D /B ') do (  
    IF exist "%Directsub%\%AufD%" goto :AuftrVorh  
    )
)

:NVorhan
REM cls
echo.
echo Nummer nicht vorhanden/gefunden
echo.
echo ******************  Bitte erneuerte Eingabe  *******************
echo.
echo.
goto Start1

:AuftrVorh
set PFAD="%Directsub%\%AufD%"  
explorer.exe %PFAD%
exit

Danke

Content-ID: 597452

Url: https://administrator.de/forum/batch-schleife-in-schleife-mit-variable-597452.html

Ausgedruckt am: 11.04.2025 um 14:04 Uhr

TK1987
TK1987 19.08.2020 aktualisiert um 16:10:36 Uhr
Goto Top
Moin,

Zitat von @Christian001:
Direct - Directsub - AufD
Y:\Kd001\Pr001\00123345
Y:\Kd001\Pr001\00123346
Y:\Kd002\Pr002\00223345
Y:\Kd002\Pr002\00223346
Y:\Kd003\Pr004\00323346
Y:\Kd003\Pr004\00323347
Y:\Kd003\Pr004\00323348
Du machst quasi foldgendes:
set Direct=Y:\
set Directsub=Y:\Kd001
set AufD=Pr001
Ergo: Du bist eine Ebene zu hoch unterwegs.

Warum arbeitest du nicht einfach mit dir /s?
@echo off
title Oeffnen vom Ordner

:Start1
echo.
set /p AufD=Nummer eingeben:

set Direct=Y:
(For /f "Delims=" %%A in ('dir /s/b/ad "%Direct%\%AufD%"') do (  
  explorer "%%A"  
  goto :EoF
  )) >Nul 2>&1

echo.
echo Nummer nicht vorhanden/gefunden
echo.
echo ******************  Bitte erneuerte Eingabe  *******************
echo.
echo.
goto Start1

Gruß Thomas
Christian001
Christian001 19.08.2020 um 17:44:56 Uhr
Goto Top
Hallo Thomas,

Die Ordner haben mehrere Unterordnen und diese können auch nochmals Unterordnen haben.
Deshalb habe ich an die verschachtelte Schleife gedacht.
Oder gibt es eine andere Möglichkeit.
TK1987
TK1987 19.08.2020 um 17:50:21 Uhr
Goto Top
Zitat von @Christian001:

Hallo Thomas,

Die Ordner haben mehrere Unterordnen und diese können auch nochmals Unterordnen haben.
Deswegen ja auch /s - so wird in allen Unterordern nach einem Ordner gesucht, der wie die eingegebene Nummer heisst.
Oder gibt es eine andere Möglichkeit.
Ja, siehe oben.
rubberman
Lösung rubberman 19.08.2020 um 18:05:15 Uhr
Goto Top
@echo off & SETLOCAL ENABLEDELAYEDEXPANSION
...
   set Directsub=%Direct%\%%n
    for /f %%n in ('dir %Directsub% /A:D /B ') do (  
...
Umgebungsvariablen werden in einer Kommandozeile oder in einem in Klammern gefassten Block von Kommandozeilen (und der Rumpf deiner FOR Schleife ist so ein Block) nur einmal zu ihrem Wert aufgelöst. Und zwar beim Parsen des Codes, noch bevor der Block überhaupt ausgeführt wird. Um dieses "frühe" Variablenerweiterung zu vermeiden, ist die "verzögerte" Variablenerweiterung einzustellen (was du mit SETLOCAL ENABLEDELAYEDEXPANSION auch getan hast) und die Variablen für die Erweiterung in !! statt %% einzuschließen (was du nicht getan hast).

Steffen
Christian001
Christian001 20.08.2020 um 06:15:42 Uhr
Goto Top
Hallo Steffen,

danke für keinen Lösungansatz. Aber irgenwie stehe ich auf der Leitung bzw. bei mir funktioniert es irgendwie nicht.

Könntest du die Codezeile so anpassen, dass es funktioniert sollte.

Danke
rubberman
Lösung rubberman 20.08.2020 aktualisiert um 15:57:32 Uhr
Goto Top
danke für keinen Lösungansatz
Freudscher Versprecher nehme ich an face-wink

Mindestens die Variablen deren Werte im Schleifenrumpf geändert werden und dort wieder zum Wert aufgelöst werden sollen, wie oben beschrieben updaten.
Bspw. %Directsub% zu !Directsub!.
Unabhängig davon gebe ich Thomas aber Recht. Rekursiv mit Option /s zu suchen macht einfach Sinn. Zudem bekommst du so gleich den absoluten Pfad und musst den nicht noch zusammenbauen. Führe doch das DIR Kommando einfach mal in einer CMD Shell aus damit du siehst wie die Ausgabe aussieht...

Steffen

// Edit: Formatierung
Christian001
Christian001 20.08.2020 um 13:16:46 Uhr
Goto Top
Zitat von @rubberman:

danke für keinen Lösungansatz
Freudscher Versprecher nehme ich an face-wink

face-wink Stimmt - sollte eigentlich: "Danke für deinen Lösungsansatz" lauten.

Jetzt habe ich folgendes Script geschrieben und es funktioniert:

set Direct=Y:\
for /f %%a in ('dir %Direct% /A:D /B ') do (  
    for /f %%b in ('dir %Direct%\%%a /A:D /B ') do (  
        IF exist %Direct%\%%a\%%b\%AufD% (
            explorer.exe %Direct%\%%a\%%b\%AufD%
            endlocal
            goto :EOF
            )