Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Pfad zerlegen und dann Variablen zuordnen

Frage Entwicklung Batch & Shell

Mitglied: Hi-Robbie

Hi-Robbie (Level 1) - Jetzt verbinden

04.10.2009, aktualisiert 18.10.2012, 8304 Aufrufe, 12 Kommentare

Hi,
ich bin der Neue und werde wahrscheinlich noch eine menge Fragen stellen
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 bin
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,
Mitglied: rubberman
04.10.2009 um 03:38 Uhr
Hallo Hi-Robbie,
was die Punkte 1-3 angeht, könnte das etwa so aussehen, wenn man sich im Verzeichnis deiner start.bat befindet:
01.
@echo off &setlocal 
02.
set exe=main.exe 
03.
 
04.
set levels=0 
05.
:loop1 
06.
set /a levels+=1 
07.
if exist %exe% set "exelevel=%levels%" 
08.
if "%cd:~,-1%"=="%~d0" goto weiter1 
09.
cd.. 
10.
goto loop1 
11.
:weiter1 
12.
cd "%~dp0" 
13.
set /a exelevel=%levels%-%exelevel%+1 
14.
 
15.
set x=0 
16.
set batpath=%~dp0 
17.
:loop2 
18.
set /a x+=1 
19.
for /f "delims=\ tokens=1*" %%i in ("%batpath%") do set "teil%x%=%%i" &set "batpath=%%j" 
20.
if not defined batpath goto weiter2 
21.
goto loop2 
22.
:weiter2 
23.
call set "batfolder=%%teil%x%%%" 
24.
call set "exefolder=%%teil%exelevel%%%" 
25.
 
26.
set /a ende=%exelevel%-1 
27.
for /l %%i in (1,1,%ende%) do call set "vorexe=%%vorexe%%\%%teil%%i%%" 
28.
set "vorexe=%vorexe:~1%" 
29.
 
30.
set /a beginn=%exelevel%+1 
31.
set /a ende=%levels%-1 
32.
for /l %%i in (%beginn%,1,%ende%) do call set "subfolder=%%subfolder%%\%%teil%%i%%" 
33.
set "subfolder=%subfolder:~1%" 
34.
 
35.
echo davor:      %vorexe% 
36.
echo exe:        %exefolder% 
37.
echo dazwischen: %subfolder% 
38.
echo bat:        %batfolder% 
39.
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
Bitte warten ..
Mitglied: bastla
04.10.2009, aktualisiert 18.10.2012
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:
01.
@echo off & setlocal 
02.
for /f "tokens=2*" %%i in ('dir..\..^|findstr /c:"Verzeichnis von"') do set "SUB.FOLDER=%%~nxj" 
03.
for /f "tokens=2*" %%i in ('dir..^|findstr /c:"Verzeichnis von"') do set "SUB.FOLDER=%SUB.FOLDER%\%%~nxj" 
04.
echo %SUB.FOLDER%
Grüße
bastla
Bitte warten ..
Mitglied: Hi-Robbie
04.10.2009 um 14:56 Uhr
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)

01.
@echo off 
02.
:Startmenue 
03.
echo. 
04.
echo  Start-Menu 
05.
echo. 
06.
echo ====================== 
07.
echo. 
08.
echo  1 - Select 1 
09.
echo  2 - Select 2 
10.
echo  3 - Select 3 
11.
echo. 
12.
echo  0 - EXIT 
13.
echo. 
14.
echo ====================== 
15.
echo. 
16.
Choice /C:1230 /N 
17.
If Errorlevel 4 goto Ende 
18.
If Errorlevel 3 goto Untermenue3 
19.
If Errorlevel 2 goto Untermenue2 
20.
If Errorlevel 1 goto Untermenue1 
21.
 
22.
:Untermenue1 
23.
set name=1 
24.
set "Liste=%cd%\ SUB1\SUB_VAR1" 
25.
goto Auswahl 
26.
 
27.
:Untermenue2 
28.
set name=2 
29.
set "Liste=%cd%\ SUB1\SUB_VAR2" 
30.
goto Auswahl 
31.
 
32.
:Untermenue3 
33.
set name=3 
34.
set "Liste=%cd%\ SUB1\SUB_VAR3" 
35.
 
36.
:Auswahl 
37.
cls 
38.
FOR /F "delims=" %%i in ('dir /S /B /O:N "%Liste%\start.bat"') do ( 
39.
echo. 
40.
echo %name% 
41.
echo. 
42.
echo %%i 
43.
pause >NUL 
44.
cls 
45.
46.
goto Startmenue 
47.
 
48.
:Ende 
49.
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]
Bitte warten ..
Mitglied: rubberman
04.10.2009 um 16:42 Uhr
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:
01.
@echo off &setlocal 
02.
:loop 
03.
cls 
04.
for /f "tokens=*" %%i in ('dir /a-d /b /on /s start.bat^|findstr /n .') do echo %%i 
05.
set /p "nummer=Waehle eine Nummer oder [a]bbrechen: " 
06.
if not defined nummer goto loop 
07.
if /i "%nummer:~,1%"=="a" goto :eof 
08.
for /f "delims=: tokens=1*" %%i in ('dir /a-d /b /on /s start.bat^|findstr /n .') do ( 
09.
  if "%%i"=="%nummer%" ( 
10.
    pushd "%%~dpj" 
11.
    cmd /c "%%j" 
12.
    popd 
13.
14.
15.
set "nummer=" 
16.
goto :loop
Grüße
rubberman
Bitte warten ..
Mitglied: Hi-Robbie
04.10.2009 um 20:56 Uhr
Hi rubberman
Nochmals Danke für Deine Hilfe,
ich habs jetzt aber so gemacht und es geht recht gut damit.
01.
:Auswahl 
02.
cls 
03.
FOR /F "delims=" %%i in ('dir /S /B /O:N "%Liste%\start.bat"') do ( 
04.
set "startbat=%%i" 
05.
echo ============================== 
06.
echo %name% 
07.
echo ============================== 
08.
echo %%i 
09.
echo ============================== 
10.
echo E(X)IT        (N)ext          (S)tart 
11.
echo. 
12.
Choice /C:nsx /N 
13.
If Errorlevel 3 goto Startmenue 
14.
If Errorlevel 2 goto Startbat 
15.
cls 
16.
17.
goto Auswahl 
18.
 
19.
:Startbat 
20.
for %%i in ("%startbat%") do set "start.root=%%~dpi" 
21.
cd %start.root% 
22.
call start.bat 
23.
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]
Bitte warten ..
Mitglied: rubberman
04.10.2009 um 22:51 Uhr
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:
01.
:Auswahl 
02.
set /a nr=0 
03.
for /f "delims=" %%i in ('dir /a-d /b /on /s "%Liste%\start.bat"') do ( 
04.
  set /a nr+=1 
05.
  call set "start%%nr%%=%%i" 
06.
07.
 
08.
set x=1 
09.
:loop 
10.
cls 
11.
if %x%==0 (echo Geht nicht!) &set /a x=1 
12.
if %x% gtr %nr% (echo Geht nicht!) &set /a x=%nr% 
13.
call set "startbat=%%start%x%%%" 
14.
echo ============================== 
15.
echo %name% 
16.
echo ============================== 
17.
echo %startbat% 
18.
echo ============================== 
19.
echo E(X)IT (N)ext (B)efore (S)tart 
20.
echo. 
21.
Choice /C:nsbx /N 
22.
 
23.
If Errorlevel 4 goto Startmenue 
24.
If Errorlevel 3 (set /a x-=1) &goto loop 
25.
If Errorlevel 2 goto Startbat 
26.
cls 
27.
set /a x+=1 &goto loop
Grüße
rubberman
Bitte warten ..
Mitglied: Hi-Robbie
05.10.2009 um 22:59 Uhr
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
Bitte warten ..
Mitglied: rubberman
05.10.2009 um 23:42 Uhr
Schau dir mal PUSHD und POPD an
01.
pushd "%start.root%" 
02.
for /f "tokens=2*" %%i in ('dir..^|findstr /c:"Verzeichnis von"') do set "folder1=%%~nxj" 
03.
popd
Grüße
rubberman

Edit: Das mit den Code-Tags, die Biber schon bei dir hinzugefügt hat funktioniert so:
<code>
...dein Code...
</code>
Bitte warten ..
Mitglied: bastla
06.10.2009 um 00:29 Uhr
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
Bitte warten ..
Mitglied: Biber
06.10.2009 um 08:02 Uhr
Moin bastla,

wäre nicht dieses ausreichend?
for  %%i in ("%start.root%\..") do set "folder1=%%~nxi"
Beispiel mit %APPDATA%:
01.
>for  %i in ("%APPDATA%\..") do @echo %~i=^>%~nxi 
02.
C:\Dokumente und Einstellungen\Biber\Anwendungsdaten\..=>Biber
Grüße
Biber
Bitte warten ..
Mitglied: bastla
06.10.2009 um 10:40 Uhr
@Biber

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

Grüße
bastla
Bitte warten ..
Mitglied: Hi-Robbie
06.10.2009 um 20:39 Uhr
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,
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Userverwaltung
Servergespeichertes Profil - Pfad ausfindig machen (6)

Frage von staybb zum Thema Windows Userverwaltung ...

Batch & Shell
gelöst Variablen Zusammenbauen 2.0 ( Batch ) (6)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
Leerzeichen im Pfad (4)

Frage von Jallio zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...