hi-robbie
Goto Top

Pfad zerlegen und dann Variablen zuordnen

Hi,
ich bin der Neue und werde wahrscheinlich noch eine menge Fragen stellenface-smile
habe gerade folgendes vor und finde keine Lösung dafür, suche aber schon Fieberhaft danach!

Zuerst in etwa meine verwendete Ordner-Struktur:
F:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR1\FOLDER_VAR1\START.BAT
F:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR1\FOLDER_VAR2\START.BAT
F:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR2\FOLDER_VAR3\START.BAT
F:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR3\FOLDER_VAR4\START.BAT
usw.

Die Ordner \SUB_VAR#\ sowie der Ordner \FOLDER_VAR#\ sind immer Variable und in beinah jedem dieser Ordner-Zweige soll sich am Ende also \FOLDER_VAR#\ dann später einmal meine START.BAT befinden.

Wie kann ich nun, aus meinem Batch (START.BAT), dem ich im Ordner \FOLDER_VAR#\ starte

1. Nur die zwei übergeordneten Ordner in eine Variable setzen?
Wenn man in START.BAT den kompletten Pfad mit SET „PFAD=%CD%“ setzt. Wie kann ich dann den Bereich im Pfad mit „SUB1\SUB_VAR#\“ in eine Variable %SUB.FOLDER% bringen.
Der Wert %SUB.FOLDER% sollte also dann so aussehen „SUB1\SUB_VAR#\“

2. In der Regel (oder immer) sind es zwei Ordner-Ebenen von \MAIN\ bis \FOLDER_VAR#\. Aber Eleganter wäre es natürlich gleich eine Lösung, wenn man in dem Ordner F:\PRG_1\PRG_2\MAIN nach einem festem Programm sucht (zB: MAIN.EXE) und dann die Ordner-Struktur von da bis eine Ebene unter dem ausgeführten START.BAT Ordner ermitteln könnte. (Falls man vielleicht die Ordner-Struktur doch einmal ändert.)
Wie könnte man das den machen?

3. Da ich dem Pfad nur bis eine Ebene unter dem ausgeführten START.BAT Ordner brauche.
Brauche ich in einer anderen Variable noch den Namen des Ordners selber, in dem sich die START.BAT befindet, also %BAT.FOLDER% sollte dann „FOLDER_VAR#“ sein. Das bekomme ich auch einfach nicht hin wie das gehen soll?

4. Und weil ich jetzt schon dabei binface-smile
Das nächste wäre dann noch, das ich mir im Ordner \MAIN\ (ebenfalls mit einer BATCH) ein Start-Menue anlege. Das selbstständig in einer Auswahl-Liste alle Ordner in F:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR#\.. anzeigt in der sich eine START.BAT befindet und diese dann durch Auswahl des Ordner-Namens im Menu starten lässt.
Im Weiteren müsste ich das Menu noch getrennt in Unter-Menus für ca. 3 dieser Ordner-Strukturen ausbauen können.

also zB:
Haupt-Menu
-Unter-Menu1 für C:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR1\..
-Unter-Menu2 für C:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR2\..
-Unter-Menu3 für C:\PRG_1\PRG_2\MAIN\SUB1\SUB_VAR3\..

Einen Anhaltspunkt zum auflisten der Ordner in \SUB_VAR#\ habe ich schon
SET MAIN=%cd%
DIR /B %MAIN%\ SUB1\SUB_VAR1
Aber natürlich fehlt mir, das vorher nicht in den Ausgegebenen Ordnern nach einer START.BAT gesucht wird und das ich die Angezeigten Ordner nicht in ein Menu zum auswählen bekomme mit dem ich dann einfach die START.BAT starten kann die im jeweiligem Ordner auch vorhanden ist.

Allein komme ich da nicht weiter und meine Versuche habens nicht gebracht. Wär für alle Hilfe dankbar die mir bei meinen Problemen weiter helfen kann. Bye,

Content-Key: 126389

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

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

Member: rubberman
rubberman Oct 04, 2009 at 01:38:33 (UTC)
Goto Top
Hallo Hi-Robbie,
was die Punkte 1-3 angeht, könnte das etwa so aussehen, wenn man sich im Verzeichnis deiner start.bat befindet:
@echo off &setlocal
set exe=main.exe

set levels=0
:loop1
set /a levels+=1
if exist %exe% set "exelevel=%levels%"  
if "%cd:~,-1%"=="%~d0" goto weiter1  
cd..
goto loop1
:weiter1
cd "%~dp0"  
set /a exelevel=%levels%-%exelevel%+1

set x=0
set batpath=%~dp0
:loop2
set /a x+=1
for /f "delims=\ tokens=1*" %%i in ("%batpath%") do set "teil%x%=%%i" &set "batpath=%%j"  
if not defined batpath goto weiter2
goto loop2
:weiter2
call set "batfolder=%%teil%x%%%"  
call set "exefolder=%%teil%exelevel%%%"  

set /a ende=%exelevel%-1
for /l %%i in (1,1,%ende%) do call set "vorexe=%%vorexe%%\%%teil%%i%%"  
set "vorexe=%vorexe:~1%"  

set /a beginn=%exelevel%+1
set /a ende=%levels%-1
for /l %%i in (%beginn%,1,%ende%) do call set "subfolder=%%subfolder%%\%%teil%%i%%"  
set "subfolder=%subfolder:~1%"  

echo davor:      %vorexe%
echo exe:        %exefolder%
echo dazwischen: %subfolder%
echo bat:        %batfolder%
pause

Was du allerdings in Punkt 4 vorhast... Naja, es ist nicht so, als würde man mit dem DIR Befehl nicht die paar Batches finden und auflisten können. Aber wie willst du daraus ein Startmenü basteln?

Grüße
rubberman
Member: bastla
bastla Oct 04, 2009, updated at Oct 18, 2012 at 16:39:32 (UTC)
Goto Top
Hallo Hi-Robbie und willkommen im Forum, hallo rubberman!

Zu Punkt 4 ev etwas Ähnliches wie hier ...
Die "Sparvariante" (statisch "Großvater" und "Vater" des aktuellen Ordners) zu Punkt 1 könnte übrigens so aussehen:
@echo off & setlocal
for /f "tokens=2*" %%i in ('dir..\..^|findstr /c:"Verzeichnis von"') do set "SUB.FOLDER=%%~nxj"  
for /f "tokens=2*" %%i in ('dir..^|findstr /c:"Verzeichnis von"') do set "SUB.FOLDER=%SUB.FOLDER%\%%~nxj"  
echo %SUB.FOLDER%
Grüße
bastla
Member: Hi-Robbie
Hi-Robbie Oct 04, 2009 at 12:56:24 (UTC)
Goto Top
Hallo,
danke für euere Hilfe, ohne euch wär ich jetzt nicht weiter gekommen!

@rubberman
Hab Deine Lösung in meine Batch eingebaut, funktioniert alles bestens, Danke nochmals!

Zu 4
Habe ich mir jetzt mal Folgendes einfaches Gerüst zusammen gebastelt:
(würde mir im groben etwa so genügen, nur fehlts wieder mal an der Umsetzung)

@echo off
:Startmenue
echo.
echo  Start-Menu
echo.
echo ======================
echo.
echo  1 - Select 1
echo  2 - Select 2
echo  3 - Select 3
echo.
echo  0 - EXIT
echo.
echo ======================
echo.
Choice /C:1230 /N
If Errorlevel 4 goto Ende
If Errorlevel 3 goto Untermenue3
If Errorlevel 2 goto Untermenue2
If Errorlevel 1 goto Untermenue1

:Untermenue1
set name=1
set "Liste=%cd%\ SUB1\SUB_VAR1"  
goto Auswahl

:Untermenue2
set name=2
set "Liste=%cd%\ SUB1\SUB_VAR2"  
goto Auswahl

:Untermenue3
set name=3
set "Liste=%cd%\ SUB1\SUB_VAR3"  

:Auswahl
cls
FOR /F "delims=" %%i in ('dir /S /B /O:N "%Liste%\start.bat"') do (  
echo.
echo %name%
echo.
echo %%i
pause >NUL
cls
)
goto Startmenue

:Ende
cls; exit

Ich denke mir Folgendes:
Ich lasse mir jede verfügbare Start.bat einzeln anzeigen und wähle dann zum ausführen eine davon mit einer Taste aus.
Natürlich wäre es wieder nur zu Perfekt, wenn man die Liste auch zurück blättern könnte.
Aber mein größtes Problem ist es das ich jetzt nicht weis, wie ich die Angezeigte Datei (Start.bat) nun wieder in eine Variable bringe und diese mit ENTER dann starten könnte?


@ bastla
Danke für Deine Hilfe, denn Link werde ich mir auch gleich mal durchschauen und Deine Sparvariante, kann ich ebenfalls sehr gut gebrauchen.

Gruß
Robbie


[Edit Biber] Codetags nachgetragen.[/Edit]
Member: rubberman
rubberman Oct 04, 2009 at 14:42:25 (UTC)
Goto Top
Hallo Hi-Robbie, hallo bastla!

Habs mit den Haupt- und Untermenüs aus Zeitgründen noch nicht geschafft genauer anzusehen. Aber vielleicht hilft bastla's Link bei dem Problem.
Eine einfache Auswahlstruktur könnte etwa so aussehen:
@echo off &setlocal
:loop
cls
for /f "tokens=*" %%i in ('dir /a-d /b /on /s start.bat^|findstr /n .') do echo %%i  
set /p "nummer=Waehle eine Nummer oder [a]bbrechen: "  
if not defined nummer goto loop
if /i "%nummer:~,1%"=="a" goto :eof  
for /f "delims=: tokens=1*" %%i in ('dir /a-d /b /on /s start.bat^|findstr /n .') do (  
  if "%%i"=="%nummer%" (  
    pushd "%%~dpj"  
    cmd /c "%%j"  
    popd
  )
)
set "nummer="  
goto :loop

Grüße
rubberman
Member: Hi-Robbie
Hi-Robbie Oct 04, 2009 at 18:56:34 (UTC)
Goto Top
Hi rubberman
Nochmals Danke für Deine Hilfe,
ich habs jetzt aber so gemacht und es geht recht gut damit.
:Auswahl
cls
FOR /F "delims=" %%i in ('dir /S /B /O:N "%Liste%\start.bat"') do (  
set "startbat=%%i"  
echo ==============================
echo %name%
echo ==============================
echo %%i
echo ==============================
echo E(X)IT        (N)ext          (S)tart
echo.
Choice /C:nsx /N
If Errorlevel 3 goto Startmenue
If Errorlevel 2 goto Startbat
cls
)
goto Auswahl

:Startbat
for %%i in ("%startbat%") do set "start.root=%%~dpi"  
cd %start.root%
call start.bat
goto Startmenue

Jetzt wäre die Krönung halt nur noch, wenn man die Menue-Liste auch noch rückwärts blättern könnte, aber vielleicht komme ich ja noch mal irgendwie drauf.

Danke und Gruß
Robbie


[Edit Biber] Codetags nachgetragen.[/Edit]
Member: rubberman
rubberman Oct 04, 2009 at 20:51:52 (UTC)
Goto Top
Ah, verstehe. Eine Schleife arbeitet immer nur in eine Richtung. Das bedeutet, du kommst nicht umhin, vorher alle gefundenen Dateien in fortlaufende Variablen zu packen (im Beispiel start1, start2 ...).

Ungetestet etwa so:
:Auswahl
set /a nr=0
for /f "delims=" %%i in ('dir /a-d /b /on /s "%Liste%\start.bat"') do (  
  set /a nr+=1
  call set "start%%nr%%=%%i"  
)

set x=1
:loop
cls
if %x%==0 (echo Geht nicht!) &set /a x=1
if %x% gtr %nr% (echo Geht nicht!) &set /a x=%nr%
call set "startbat=%%start%x%%%"  
echo ==============================
echo %name%
echo ==============================
echo %startbat%
echo ==============================
echo E(X)IT (N)ext (B)efore (S)tart
echo.
Choice /C:nsbx /N

If Errorlevel 4 goto Startmenue
If Errorlevel 3 (set /a x-=1) &goto loop
If Errorlevel 2 goto Startbat
cls
set /a x+=1 &goto loop

Grüße
rubberman
Member: Hi-Robbie
Hi-Robbie Oct 05, 2009 at 20:59:34 (UTC)
Goto Top
Hallo rubberman,

Dein ungetesteter Code hat bestens funktioniert. Hab jetzt nur noch einwenig dran rum gebastelt und das ist jetzt herausgekommen.
Und jetzt komme ich auch schon mehr dahinter, wie in einem Batch die Variablen verarbeitet werden. Finds zwar noch einwenig gewöhnungsbedürftig, vor allen die FOR-NEXT-Schleifen aber es wird schon langsam. Danke nochmals dafür und für Deine Zeit.

Einen Schönheitsfehler habe ich leider jetzt noch und ich weis nicht, wie ich das anders machen könnte? Und zwar muss ich bei der Schleife die mir Bastla gepostet hat hier Extra in das Verzeichnis springen, das ich den Namen des Vorordners bekomme.

cd %start.root%
for /f "tokens=2*" %%i in ('dir..^|findstr /c:"Verzeichnis von"') do set "folder1=%%~nxj"

hab jetzt schon mit FINDSTR herum gespielt, das ich den Vor-Ordner aus %start.root% heraus bekomme ohne das aktuelle Verzeichnis zu ändern, aber ich bekomme es einfach nicht hin. Ok, ich könnte es so machen wie mit %file% wenn ich wieder eine Ordnerebene abschneide. Aber ich wär Dir echt Dankbar, wenn Du mir auch eine Lösung mit FINDSTR zeigen könntest, wenn das in dieser Zeile geht. Das fuchst mich jetzt nämlich…


:Auswahl
set /a nr=0
for /f "delims=" %%i in ('dir /a-d /b /on /s "%Liste%\start.bat"') do (
set /a nr+=1
call set "start%%nr%%=%%i"
)
set xnr=1

:loop
cls
if %xnr%==0 set /a xnr=%nr%
if %xnr% gtr %nr% set /a xnr=1
call set "startbat=%%start%xnr%%%"
for %%i in ("%startbat%") do set "start.root=%%~dpi"
set batpath=%start.root%

:loop2
set /a x+=1
for /f "delims=\ tokens=1*" %%i in ("%batpath%") do set "teil%x%=%%i" &set "batpath=%%j"
if not defined batpath goto weiter
goto loop2

:weiter
call set "file=%%teil%x%%%"

cd %start.root%
for /f "tokens=2*" %%i in ('dir..^|findstr /c:"Verzeichnis von"') do set "folder1=%%~nxj"

echo =================================
echo %nr% Files in %folder1%
echo =================================
echo Nr.%xnr% %file%
echo =================================
echo (B)efore (S)tart (N)ext E(X)IT
echo.
Choice /C:nsbx /N
If Errorlevel 4 goto Startmenue
If Errorlevel 3 (set /a xnr-=1) &goto loop
If Errorlevel 2 goto Startbat
cls
set /a xnr+=1
goto loop

:Startbat
cd %start.root%
call start.bat
set sub.root=
cd %Main%
goto loop
Member: rubberman
rubberman Oct 05, 2009 at 21:42:26 (UTC)
Goto Top
Schau dir mal PUSHD und POPD an face-wink
pushd "%start.root%"  
for /f "tokens=2*" %%i in ('dir..^|findstr /c:"Verzeichnis von"') do set "folder1=%%~nxj"  
popd

Grüße
rubberman

Edit: Das mit den Code-Tags, die Biber schon bei dir hinzugefügt hat funktioniert so:
<code>
...dein Code...
</code>
Member: bastla
bastla Oct 05, 2009 at 22:29:42 (UTC)
Goto Top
Hallo Hi-Robbie und rubberman!

Aus dem Pfad in "%start.root%" lässt sich natürlich auch per Einzeiler und ohne "cd" der Name des vorletzten Ordners extrahieren:
for /f "tokens=2*" %%i in ('dir "%start.root%\.."^|findstr /c:"Verzeichnis von"') do set "folder1=%%~nxj"
Grüße
bastla
Member: Biber
Biber Oct 06, 2009 at 06:02:50 (UTC)
Goto Top
Moin bastla,

wäre nicht dieses ausreichend?
for  %%i in ("%start.root%\..") do set "folder1=%%~nxi"
Beispiel mit %APPDATA%:
>for  %i in ("%APPDATA%\..") do @echo %~i=^>%~nxi  
C:\Dokumente und Einstellungen\Biber\Anwendungsdaten\..=>Biber

Grüße
Biber
Member: bastla
bastla Oct 06, 2009 at 08:40:45 (UTC)
Goto Top
@Biber

Spielverderber face-wink - in der Form hatten wir das doch schon ...

Grüße
bastla
Member: Hi-Robbie
Hi-Robbie Oct 06, 2009 at 18:39:24 (UTC)
Goto Top
Danke euch,

jetzt weis ich was man mit PUSHD anstellen kann. Wie man den Namen doch mit FINDSTR ausliest, ohne extra ins Verzeichnis zu wechseln zu müssen. Das wir aber
for %%i in ("%start.root%\..") do set "folder1=%%~nxi"
schon hatten, weis ich jetzt nicht? Und das man das so einfach aus der Variable mit \.. auslesen kann, also so wie man im Pfad selber eine Ebene zurück springt. Einfach toll und wenn man’s weis eigentlich logisch.

Meine Batches laufen einwandfrei und bei allem was ich gefragt habe, wurde mir super geholfen.
Gruß und Danke nochmal an euch,