Top-Themen

Aktuelle Themen (A bis Z)

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 Batch Grafische Oberfläche Datei auswählen

Mitglied: regedit19

regedit19 (Level 1) - Jetzt verbinden

04.08.2011, aktualisiert 18.10.2012, 6535 Aufrufe, 14 Kommentare

Hallo!

Habe folgende kurze Frage:

Ist es in Batch möglich, eine Grafisches "Datei- Auswählen" Fenster wie dieses:
http://www.google.at/imgres?q=datei+ausw%C3%A4hlen+batch&um=1&h ...

zu "erstellen" mit dem ich dann die gewünschte Datei auswählen kann, und mir dann der Pfad dorthin, in eine Variable X geschrieben wird?

lg
regedit19
Mitglied: bastla
04.08.2011, aktualisiert 18.10.2012
Hallo regedit19!

Je nach OS könnte ein Standard-Auswahldialog zB so aufgerufen werden:
01.
@echo off & setlocal
02.
set "X="
03.

04.
set "G=%temp%\GetFile.vbs"
05.
>%G% echo Set D=CreateObject("SAFRCFileDlg.FileOpen"):R=D.OpenFileOpenDlg:If R Then WScript.Echo D.FileName
06.
for /f "delims=" %%i in ('cscript //nologo %G%') do set "X=%%i"
07.
if defined X (
08.
    echo %X%
09.
) else (
10.
    echo Keine Auswahl getroffen
11.
)
Andere Varianten hatten wir mal hier besprochen ...

Grüße
bastla

P.S.: Um Deinen Link verwenden zu können, müsste ich Javascript aktivieren - ein Bild sollte sich aber auch direkt in den Eröffnungsbeitrag einbinden lassen ...
Bitte warten ..
Mitglied: Skyemugen
04.08.2011 um 16:44 Uhr
Aloha,

kurze Antwort: Nein.

Lange Antwort: Ja mit VBS-Code-Aufruf

Wenn man den Code von der Dateiauswahl (link) auf eine Auswahl modifiziert, dann ließe sich per Batch das Ganze wie folgt aufrufen:
01.
for /f "tokens=1,2,* delims= " %%s in ('cscript //nologo Dateiauswahl.vbs') do set "Datei=%%u"
02.
echo "%Datei%"
greetz André

edit: much too late *gg* musste erst selber testen, hehe
Bitte warten ..
Mitglied: regedit19
04.08.2011 um 16:47 Uhr
Hallo bastla!

Danke für die schnelle Antwort!

Werde ich gleich einmal ausprobieren!


Danke für den Tipp der Bildeinbindung

Lg
regedit19
Bitte warten ..
Mitglied: regedit19
04.08.2011 um 17:00 Uhr
Hallo!

@bastla:

Die Datei GetFile.vbs im Ordner %temp% ergibt einen Laufzeitfehler, sowie in der Batch, als auch wenn ich sie im %temp% Ordner aufrufe.
Bitte warten ..
Mitglied: Friemler
04.08.2011 um 17:11 Uhr
Hallo regedit,

schau mal hier vorbei.

[EDIT]
Der Vorschlag aus meinem verlinkten Beitrag wird auch im Link von Skyemugen an dritter Stelle behandelt - zu spät.
[/EDIT]

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
04.08.2011 um 17:30 Uhr
... wie auch immer - hier mal die "verbatchte" (und "gequetschte" ) Version:
01.
@echo off & setlocal
02.
set "X="
03.

04.
set "G=%temp%\GetFile.vbs"
05.
 >%G% echo Set IE=CreateObject("InternetExplorer.Application")
06.
>>%G% echo With IE:.Visible=False:.Navigate("about:blank"):Do Until .ReadyState=4:Loop
07.
>>%G% echo .Document.Write "<HTML><BODY><INPUT ID=""Fil"" Type=""file""></BODY></HTML>"
08.
>>%G% echo With .Document.All.Fil:.Focus:.Click:WScript.Echo Replace(.Value,"%%20"," "):End With:.Quit:End With
09.

10.
for /f "delims=" %%i in ('cscript //nologo %G%') do set "X=%%i"
11.
if defined X (
12.
    echo %X%
13.
) else (
14.
    echo Keine Auswahl getroffen
15.
)
Grüße
bastla
Bitte warten ..
Mitglied: regedit19
04.08.2011 um 17:54 Uhr
Hallo bastla!

Danke für das Script!
Ist genau das, wonach ich gesucht habe!

Lg
regedit19
Bitte warten ..
Mitglied: regedit19
04.08.2011 um 18:05 Uhr
Danke auch den anderen!, aber bastla war einfach schneller, es hilft nichts :D

Lg
regedit19
Bitte warten ..
Mitglied: bastla
04.08.2011 um 18:05 Uhr
Hallo regedit19!

Nix zu danken - ich habe ja in diesem Fall nur die Vorlagen von Skyemugen und Friemler verarbeitet ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
04.08.2011 um 18:08 Uhr
Hi @all,

ein wenig Spielerei gefällig? In einem masochistischen Anfall habe ich schon vor längerer Zeit eine Datei-/Verzeichnisauswahlbox in (fast) native Batch geschrieben, die lediglich einen kleinen Schnipsel Inline-VBScript zur Ermittelung der vorhandenen Laufwerke enthält. Das Ziel war, auch Datei- und Ordnernamen darstellen und auswählen zu können, die alle möglichen (Batch-)Sonderzeichen und ihre Kombinationen enthalten können. Darüber ist der Code etwas schwer verständlich geworden . Die Optimierer finden sicherlich auch die eine oder andere Verbesserungsmöglichkeit, das ganze ist wie gesagt schon etwas älter. Die (einleitenden) Kommentare der beiden verwendeten Funktionen FileSelector und ShowMenu sollten für Interessierte eigentlich Dokumentation genug sein. Über den Menüpunkt Tools können auch Dateien und Verzeichnisse neu angelegt werden.

Zunächst ein Script, das die Auswahlbox verwendet. Die ausgewählte Datei/der ausgewählte Ordner kann über eine Variable oder eine Datei zurückgegeben werden. Das Script enthält Code für beide Fälle, teilweise auskommentiert:
01.
@echo off
02.

03.
setlocal disabledelayedexpansion
04.

05.

06.
set "ResultFile=%TEMP%\FselSelectedObject.txt"
07.

08.

09.
::FileSelector aufrufen
10.
::Wenn keine Datei ausgewählt wurde, Ende
11.
::NICHT if defined selectedFile (...) verwenden, da man sonst
12.
::ENABLEDELAYEDEXPANSION benoetigt, was Probleme mit in selectedFile
13.
::enthaltenen Ausrufezeichen macht.
14.
rem call FSel E:\ /m *.* /fdn
15.
rem if not defined selectedObject goto :ScriptExit
16.

17.
call FSel E:\ /m *.* /fdn /r "%ResultFile%"
18.
if not exist "%ResultFile%" goto :ScriptExit
19.
<"%ResultFile%" set /p "selectedObject="
20.

21.

22.
::Um den Datei-/Verzeichnisnamen als Parameter für ein Programm zu
23.
::verwenden, einfach so uebernehmen.
24.
set "selectedObjectParam=%selectedObject%"
25.

26.
::Zum Ausgeben des Datei-/Verzeichnisnamens kritische Zeichen escapen.
27.
::Die Reihenfolge ist wichtig!
28.
set "selectedObject=%selectedObject:^=^^%"
29.
set "selectedObject=%selectedObject:&=^&%"
30.

31.

32.
::Datei-/Verzeichnisnamen nur ausgeben
33.
cls
34.
echo.
35.
echo Ausgewähltes Objekt: %selectedObject%
36.

37.
::Handelt es sich um eine Datei?
38.
>NUL 2>&1 dir /b "%selectedObjectParam%\*.*"
39.

40.
::Wenn es eine Datei ist, Namen als Parameter verwenden
41.
if %errorlevel% neq 0 (
42.
  "%selectedObjectParam%"
43.
) else (
44.
  echo. & pause
45.
)
46.

47.

48.
:ScriptEnd
49.
del "%ResultFile%" 2>NUL
50.

51.
:ScriptExit
52.
endlocal
53.
exit /b

Und jetzt der eigentliche Code der Auswahlbox (Vorsicht, es wird etwas länger ). Damit er mit dem obigen Script zusammenarbeitet, bitte als FSel.cmd speichern.
01.
@echo off
02.

03.

04.
::Funktion FileSelector
05.
::
06.
::Funktion um eine Dateiauswahlbox darzustellen. Zur Darstellung wird die
07.
::Funktion ShowMenu verwendet. Der Pfad und der Inhalt des gerade bearbeiteten
08.
::Verzeichnisses wird in eine Datei geschrieben, die von ShowMenu ausgelesen
09.
::und dargestellt wird. Ein Verzeichnis oder eine Datei kann anhand der
10.
::Zeilennummer ausgewaehlt werden. Verzeichnisse werden durch das Zeichen 
11.
::markiert. Um in ein angezeigtes Verzeichnis zu wechseln, nur zugehoerige
12.
::Nummer eingeben. Um das Verzeichnis selbst auszuwaehlen, CX (X=Nummer des
13.
::Eintrags) eingeben. Das Wechseln des uebergebenen Verzeichnisses kann durch
14.
::den Parameter /s unterbunden werden. Der Text der anzuzeigenden Eingabe-
15.
::aufforderung kann optional mit dem Parameter /i uebergeben werden. Durch die
16.
::Uebergabe eines Modus-Parameters kann festgelegt werden, ob nur Dateien, nur
17.
::Verzeichnisse oder beides ausgewaehlt werden koennen und ob diese bereits
18.
::existieren muessen oder auch neu angelegt werden koennen. Neue Verzeichnisse
19.
::und Dateien koennen ueber einen Dialog angelegt werden, der ueber die Taste
20.
::T (Tools) erreichbar ist. Dort koennen auch Dateien und Verzeichnisse
21.
::geloescht werden.
22.
::
23.
::
24.
::Aufruf   : call :FileSelector Pfad /m Maske [/i Eingabeaufforderung]
25.
::                              [/f | /fd | /fn | /fdn | /d | /dn]
26.
::                              [/r Ergebnisdatei] [/s]
27.
::
28.
::Parameter: Pfad
29.
::             Der Pfad zum Verzeichnis, das angezeigt werden soll. Wenn als
30.
::             leerer Parameter uebergeben, wird der Arbeitsplatz angezeigt.
31.
::
32.
::           Maske
33.
::             Die Maske fuer die anzuzeigenden Dateien. Verwendung von
34.
::             Wildcards ist moeglich.
35.
::
36.
::           Eingabeaufforderung
37.
::             Die Eingabeaufforderung, die angezeigt werden soll. Standard
38.
::             ist "Welches Verzeichnis/Welche Datei möchten Sie öffnen? "
39.
::
40.
::           Modus
41.
::             /f   - Nur bereits existierende Dateien koennen ausgewaehlt
42.
::                    werden. Das ist der Standardmodus.
43.
::             /fd  - Nur bereits existierende Dateien und Verzeichnisse
44.
::                    koennen ausgewaehlt werden.
45.
::             /fn  - Nur Dateien koennen ausgewaehlt werden. Zum Anlegen von
46.
::                    neuen Dateien steht der Steuerbefehl T (Tools) zur
47.
::                    Verfuegung. In diesem Sub-Menue koennen neue leere
48.
::                    Dateien angelegt und danach ausgewaehlt werden. Neue
49.
::                    leere Verzeichnisse koennen auch angelegt, aber danach
50.
::                    nicht ausgewaehlt werden.
51.
::             /fdn - Es koennen Dateien und Verzeichnisse ausgewaehlt werden.
52.
::                    Zum Anlegen von neuen leeren Dateien und Verzeichnissen
53.
::                    steht der Steuerbefehl T (Tools) zur Verfuegung. Die
54.
::                    ueber dieses Sub-Menue angelegten leeren Dateien und
55.
::                    Verzeichnisse koennen nach dem Schliessen des Submenues
56.
::                    ausgewaehlt werden.
57.
::             /d   - Es koennen nur bereits existierende Verzeichnisse aus-
58.
::                    gewaehlt werden.
59.
::             /dn  - Es koennen nur Verzeichnisse ausgewaehlt werden. Zum
60.
::                    Anlegen von neuen Verzeichnissen steht der Steuerbefehl
61.
::                    T (Tools) zur Verfuegung. In diesem Sub-Menue koennen
62.
::                    neue leere Verzeichnisse angelegt und danach ausgewaehlt
63.
::                    werden. Neue leere Dateien koennen auch angelegt, aber
64.
::                    danach nicht ausgewaehlt werden.
65.
::
66.
::           Ergebnisdatei
67.
::             Optional kann Name und Pfad zu einer Datei uebergeben werden,
68.
::             in die das Ergebnis der Auswahl geschrieben werden soll.
69.
::
70.
::           Statischer Pfad
71.
::             Durch Uebergabe des Parameters /s kann das Wechseln des
72.
::             Verzeichnisses verboten werden.
73.
::
74.
::Rueckgabe: In der Variablen selectedObject wird der Name inkl. Pfad der
75.
::           ausgewaehlten Datei/des ausgewaehlten Verzeichnisses zurueck-
76.
::           gegeben. Wurde der Dialog abgebrochen, kein Pfad oder keine
77.
::           Maske angegeben, ist selectedFile nicht definiert. Falls mit
78.
::           dem Parameter /r eine Ergebnisdatei uebergeben wurde, enthaelt
79.
::           diese ebenfalls die ausgewaehlte Datei/das ausgewaehlte
80.
::           Verzeichnis. Wurde der Dialog abgebrochen, existiert die Datei
81.
::           nicht.
82.

83.

84.
:FileSelector
85.
setlocal disabledelayedexpansion
86.

87.
cls
88.

89.

90.
set "objectPath="
91.
set "objectMask="
92.
set "inputStr=Welches Verzeichnis/Welche Datei möchten Sie öffnen? "
93.
set "keepDir=0"
94.

95.
set "showTools="
96.
set "allowFiles=1"
97.
set "allowFilesDirs=0"
98.
set "allowNewFiles=0"
99.
set "allowNewFilesDirs=0"
100.
set "allowOnlyExistingDirs=0"
101.
set "allowOnlyDirs=0"
102.

103.
set "selectedObject="
104.
set "outputFile="
105.

106.

107.
::Parameter uebernehmen
108.
:FileSelectorGetParamsLoop
109.
  set "param=%~1"
110.

111.
  if /i "%param%" equ "/m" (
112.
    set "objectMask=%~2" & shift
113.
  ) else if /i "%param%" equ "/i" (
114.
    set "inputStr=%~2" & shift
115.
  ) else if /i "%param%" equ "/s" (
116.
    set "keepDir=1"
117.
  ) else if "%param%" equ "/f" (
118.
    set "allowFiles=1" & set "allowFilesDirs=0" & set "allowNewFiles=0" & set "allowNewFilesDirs=0" & set "allowOnlyDirs=0" & set "allowOnlyExistingDirs=0"
119.
  ) else if "%param%" equ "/fd" (
120.
    set "allowFilesDirs=1" & set "allowFiles=0" & set "allowNewFiles=0" & set "allowNewFilesDirs=0" & set "allowOnlyDirs=0" & set "allowOnlyExistingDirs=0"
121.
  ) else if "%param%" equ "/fn" (
122.
    set "allowNewFiles=1" & set "allowFiles=0" & set "allowFilesDirs=0" & set "allowNewFilesDirs=0" & set "allowOnlyDirs=0" & set "allowOnlyExistingDirs=0"
123.
  ) else if "%param%" equ "/fdn" (
124.
    set "allowNewFilesDirs=1" & set "allowFiles=0" & set "allowFilesDirs=0" & set "allowNewFiles=0" & set "allowOnlyDirs=0" & set "allowOnlyExistingDirs=0"
125.
  ) else if "%param%" equ "/d" (
126.
    set "allowOnlyExistingDirs=1" & set "allowFiles=0" & set "allowFilesDirs=0" & set "allowNewFiles=0" & set "allowNewFilesDirs=0" & set "allowOnlyDirs=0"
127.
  ) else if "%param%" equ "/dn" (
128.
    set "allowOnlyDirs=1" & set "allowFiles=0" & set "allowFilesDirs=0" & set "allowNewFiles=0" & set "allowNewFilesDirs=0" & set "allowOnlyExistingDirs=0"
129.
  ) else if /i "%param%" equ "/r" (
130.
    set "outputFile=%~2" & shift
131.
  ) else if "%param:~0,1%" neq "/" if not defined objectPath (
132.
    set "objectPath=%~f1"
133.
  )
134.

135.
  shift
136.
if "%~1" neq "" goto :FileSelectorGetParamsLoop
137.

138.

139.
::Bei fehlendem Parameter objectMask Ruecksprung.
140.
::Bei leerem Parameter objectPath wird der Arbeitsplatz angezeigt.
141.
::Falls die Parameter Carret-Zeichen (^) enthalten, wurden sie bei der
142.
::Uebergabe aus einem Batch-Skript vom Kommando-Interpreter verdoppelt.
143.
::Das muss wieder rueckgaengig gemacht werden.
144.
if not defined objectMask goto :FileSelectorExit
145.
set "objectMask=%objectMask:^^=^%"
146.

147.
if not defined objectPath goto :FileSelectorChkOutputFile
148.
set "objectPath=%objectPath:^^=^%"
149.

150.
:FileSelectorChkOutputFile
151.
if not defined outputFile goto :FileSelectorSetMenuFile
152.
set "outputFile=%outputFile:^^=^%"
153.

154.

155.
:FileSelectorSetMenuFile
156.
::Menue-Datei festlegen. Durch Anhaengen einer Zufallszahl koennen mehrere
157.
::Instanzen von FileSelector nacheinander gestartet werden.
158.
set "menuFile=%TEMP%\FileSelectorMenu_%random%.txt"
159.

160.

161.
::Maximale Laenge der Titelzeile (und damit auch der Breite der
162.
::Fileselectorbox) festlegen
163.
set "maxTitleLen=72
164.

165.

166.
::Parameter fuer ShowMenu, um den Zugang zum Tools-Menue freizuschalten
167.
set "toolsStr=/u T "T=Tools" FileSelectorTools"
168.

169.

170.
::Vorhandene Laufwerke ermitteln
171.
::Dazu ein temporaeres VBS-Skript benutzen
172.
set "vbsCode=%TEMP%\GetDrives.vbs"
173.

174.
> "%vbsCode%" echo Dim fso, dc, d, s
175.
>>"%vbsCode%" echo Set fso = CreateObject("Scripting.FileSystemObject")
176.
>>"%vbsCode%" echo Set dc = fso.Drives
177.
>>"%vbsCode%" echo For Each d in dc
178.
>>"%vbsCode%" echo   s = s ^& d.DriveLetter ^& ": "
179.
>>"%vbsCode%" echo Next
180.
>>"%vbsCode%" echo WScript.Echo s
181.

182.
::Skript ausfuehren, um die Laufwerksbuchstaben zu ermitteln
183.
for /f "delims=" %%d in ('cscript /nologo "%vbsCode%"') do (
184.
  set "availDrives=%%d"
185.
)
186.

187.
::Skript loeschen
188.
del "%vbsCode%" 2>NUL
189.

190.

191.
::Die Hauptschleife von FileSelector
192.
::Wird solange ausgefuehrt, bis eine Datei/ein Verzeichnis ausgewaehlt
193.
::oder der Dialog abgebrochen wurde.
194.

195.
:FileSelectorSelectLoop
196.
  ::Rueckgabevariable löschen
197.
  set "selectedObject="
198.

199.
  ::Marker fuer spzielle Auswahl loeschen, falls die spezielle Auswahl mit
200.
  ::einem Dateinamen ausgefuehrt wurde.
201.
  set "dirSelected=0"
202.

203.

204.
  ::Wenn objectPath definiert ist, ist ein Pfad darin enthalten.
205.
  ::Falls es nicht definiert ist, wurde zum Arbeitsplatz (der Laufwerksauswahl)
206.
  ::gewechselt und die Liste der vorhandenen Laufwerke muss angezeigt werden.
207.
  if defined objectPath goto :FileSelectorProcessDir
208.

209.

210.
  ::Statusmeldung ausgeben
211.
  <NUL set /p "=Lese Laufwerksliste ein..."
212.

213.

214.
  ::Menue mit dem Arbeitsplatz (der Laufwerksauswahl) generieren.
215.
  ::Titelzeile schreiben
216.
  > "%menuFile%" (<NUL set /p "=:::Arbeitsplatz" & echo.)
217.

218.
  ::Menueeintraege schreiben
219.
  >>"%menuFile%" (for %%d in (%availDrives%) do (<NUL set /p "=::: %%d" & echo.))
220.

221.
  ::Eine Leerzeile an die Menue-Datei anhaengen, damit die Liste der
222.
  ::Menueeintraege vollstaendig dargestellt wird.
223.
  >>"%menuFile%" echo :::
224.

225.

226.
  ::Bei der Laufwerksauswahl kein Tools-Menue anzeigen
227.
  set "showTools="
228.

229.

230.
  ::Menue anzeigen
231.
  goto :FileSelectorShowMenu
232.

233.

234.
  :FileSelectorProcessDir
235.
  ::Statusmeldung ausgeben
236.
  <NUL set /p "=Lese Verzeichnis ein..."
237.

238.

239.
  ::Wenn vom Arbeitsplatz (der Laufwerksauswahl) auf ein Laufwerk gewechselt
240.
  ::wurde, enthaelt objectPath als erstes Zeichen einen Backslash, dann den
241.
  ::Laufwerksbuchstaben und dann den Doppelpunkt. Der fuehrende Backslash
242.
  ::muss beseitigt werden.
243.
  if "%objectPath:~0,1%" equ "\" (
244.
    set "objectPath=%objectPath:~1%"
245.
  )
246.

247.

248.
  ::Falls das letzte Zeichen von objectPath ein Backslash ist, diesen entfernen.
249.
  ::Das ist wichtig, falls aus einem Unterverzeichnis eine Ebene nach oben
250.
  ::gewechselt wurde, dann ist das letzte Zeichen von objectPath ein Backslash.
251.
  ::Falls objectPath ein Wurzelverzeichnis ist, wird spaeter beim Verzeichnislisting
252.
  ::eine Hilfsvariable verwendet, an die dann wieder ein Backslash angehaengt wird.
253.
  if "%objectPath:~-1%" equ "\" (
254.
    set "objectPath=%objectPath:~0,-1%"
255.
  )
256.

257.

258.
  ::Suchmaske und Titelzeile initialisieren
259.
  set "searchMask=%objectPath%\%objectMask%"
260.
  set "fselTitle=%searchMask%"
261.

262.

263.
  ::Evtl. die Laenge der Titelzeile kuerzen
264.
  ::Beim Wurzelverzeichnis auf keinen Fall noetig
265.
  set "fselTitleDrv=%fselTitle:~0,3%"
266.
  set "fselTitlePath=%fselTitle:~3%"
267.
  if not defined fselTitlePath goto :FileSelectorWriteMenu
268.

269.
  ::Korrekturfaktor auf Startwert setzen => es wurde noch nicht gekuerzt
270.
  set "correction=0"
271.

272.
  :FileSelectorTrimTitleLoop
273.
    ::Laenge von fselTitlePath ermitteln
274.
    >"%TEMP%\strlen.txt" <NUL (set /p "=<%fselTitlePath%"&echo.&set /p "=<"&echo.)
275.
    for /f "delims=:" %%l in ('findstr /o /b "<" "%TEMP%\strlen.txt"') do set /a "titleLen=%%l+correction"
276.

277.
    ::Wenn die Laenge jetzt stimmt, aber vorher schon einmal gekuerzt wurde,
278.
    ::die gekuerzte Titelzeile zusammenbauen. Wenn die Zeile noch nicht
279.
    ::gekuertzt werden musste, normal weitermachen.
280.
    if %titleLen% leq %maxTitleLen% (
281.
      del "%TEMP%\strlen.txt" 2>NUL
282.
      if %correction% neq 0 goto :FileSelectorTrimTitleLoopEnd
283.
      goto :FileSelectorWriteMenu
284.
    )
285.

286.
    ::Alles vor dem ersten Backslash, inkl. dem Backslash selbst, loeschen
287.
    set "fselTitlePath=%fselTitlePath:*\=%"
288.

289.
    ::Korrekturfaktor aendern => es wurde gekuerzt
290.
    ::und neuer Schleifendurchlauf
291.
    set "correction=4"
292.
    goto :FileSelectorTrimTitleLoop
293.
  :FileSelectorTrimTitleLoopEnd
294.

295.
  ::Die gekuerzte Titelzeile zusammenbauen
296.
  set "fselTitle=%fselTitleDrv%...\%fselTitlePath%"
297.

298.

299.
  :FileSelectorWriteMenu
300.
  ::Menue generieren
301.
  ::Titelzeile schreiben
302.
  >"%menuFile%" (<NUL set /p "=:::%fselTitle%" & echo.)
303.

304.
  ::Standardeintrag zum Wechsel ins Elternverzeichnis erzeugen.
305.
  >>"%menuFile%" echo ::: ..
306.

307.
  ::Verzeichnis auslesen und Menueeintraege in Datei schreiben.
308.
  ::Eintraege fuer Unterverzeichnisse erzeugen.
309.
  ::Wenn ein Wurzelverzeichnis gelistet werden soll,
310.
  ::objectPath um einen Backslash verlaengert als Pfad verwenden.
311.
  ::DAS WAR NACH VIELEN EXPERIMENTEN DIE EINFACHSTE LOESUNG!!!
312.
  set "objectPath2=%objectPath%"
313.
  if "%objectPath2:~-1%" equ ":" set "objectPath2=%objectPath2%\"
314.
  >>"%menuFile%" (for /f "delims=" %%d in ('dir /b /o:ne /a:-s-hd "%objectPath2%" 2^>NUL') do (<NUL set /p "=::: %%d" & echo.))
315.

316.
  ::Eintraege fuer Dateien erzeugen.
317.
  >>"%menuFile%" (for /f "delims=" %%f in ('dir /b /o:ne /a:-s-h-d "%searchMask%" 2^>NUL') do (<NUL set /p "=:::  %%f" & echo.))
318.

319.
  ::Eine Leerzeile an die Menue-Datei anhaengen, damit die Liste der
320.
  ::Menueeintraege vollstaendig dargestellt wird.
321.
  >>"%menuFile%" echo :::
322.

323.

324.
  ::Wenn erlaubt, Zugang zum Tools-Menue anzeigen
325.
  if %allowNewFiles% equ 1 set "showTools=%toolsStr%"
326.
  if %allowNewFilesDirs% equ 1 set "showTools=%toolsStr%"
327.
  if %allowOnlyDirs% equ 1 set "showTools=%toolsStr%"
328.

329.

330.
  :FileSelectorShowMenu
331.
  ::Menue und Eingabeaufforderung anzeigen
332.
  call :ShowMenu "%menuFile%" /i "%inputStr%" /t /c /h 12 /w %maxTitleLen% %showTools%
333.
  set /a "selected=%errorlevel%"
334.

335.
  ::Bei Dialog-Abbruch Ruecksprung
336.
  ::Wenn der Arbeitsplatz angezeigt wird, ist keine Auswahl eines Laufwerks
337.
  ::mit der speziellen Auswahl moeglich.
338.
  if %selected% equ 0 goto :FileSelectorEnd
339.
  if %selected% lss 0 if not defined objectPath goto :FileSelectorSelectLoop
340.
  if %selected% lss 0 set /a "selected=-selected" & set "dirSelected=1"
341.
  if %selected% equ 2147483647 goto :FileSelectorSelectLoop
342.

343.

344.
  ::Wenn objectPath NICHT definiert ist, ist das aktuelle Verzeichnis der
345.
  ::Arbeitsplatz (die Laufwerksauswahl). Dann weitermachen.
346.
  ::Wenn das aktuelle Verzeichnis ein Wurzelverzeichnis ist und auf den
347.
  ::Arbeitsplatz gewechselt werden soll, einen Backslash an objectPath
348.
  ::anhaengen, da sonst der Ausdruck %%~dpp in der FOR-Schleife
349.
  ::das Elternverzeichnis des aktuellen Verzeichnisses des Laufwerks liefern
350.
  ::wuerde. Dadurch wuerde objectPath nicht geloescht und der Wechsel zum
351.
  ::Arbeitsplatz wuerde nicht funktionieren.
352.
  if not defined objectPath goto :FileSelectorSelectLoopEnd
353.
  if %selected% equ 2 if "%objectPath:~-1%" equ ":" set "objectPath=%objectPath%\"
354.

355.
:FileSelectorSelectLoopEnd
356.

357.

358.
::Ausrufezeichen im Namen der Menue-Datei escapen, da jetzt ein Bereich
359.
::mit ENABLEDELAYEDEXPANSION betreten wird
360.
set "menuFile=%menuFile:!=^!%"
361.

362.

363.
::Ausgewaehltes Element verarbeiten
364.
setlocal enabledelayedexpansion
365.

366.
set "indexCnt=0"
367.

368.
for /f "usebackq tokens=1* delims=: " %%f in ("%menuFile%") do (
369.
  set /a "indexCnt=!indexCnt!+1"
370.

371.
  if !indexCnt! equ %selected% (
372.
    endlocal & set "menuFile=%menuFile:^!=!%"
373.

374.
    if "%%f" equ "" (
375.
      if "%%g" equ ".." (
376.
        if %keepDir% equ 1 goto :FileSelectorSelectLoop
377.

378.
        for /f "delims=" %%p in ("%objectPath%") do (
379.
          if /i "%objectPath%" neq "%%~dpp" (
380.
            set "objectPath=%%~dpp"
381.
          ) else (
382.
            set "objectPath="
383.
          )
384.

385.
          goto :FileSelectorSelectLoop
386.
        )
387.
      )
388.

389.
      if %keepDir% equ 1 if %dirSelected% equ 0 goto :FileSelectorSelectLoop
390.

391.
      set "objectPath=%objectPath%\%%g"
392.

393.
      if %allowFilesDirs% equ 0 if %allowNewFilesDirs% equ 0 if %allowOnlyExistingDirs% equ 0 if %allowOnlyDirs% equ 0 goto :FileSelectorSelectLoop
394.
      if %dirSelected% equ 0 goto :FileSelectorSelectLoop
395.

396.
      set "selectedObject=%objectPath%\%%g"
397.
      goto :FileSelectorEnd
398.
    )
399.

400.
    if %allowOnlyExistingDirs% equ 1 goto :FileSelectorSelectLoop
401.
    if %allowOnlyDirs% equ 1 goto :FileSelectorSelectLoop
402.

403.
    if "%%g%" equ "" (
404.
      set "selectedObject=%objectPath%\%%f"
405.
      goto :FileSelectorEnd
406.
    )
407.

408.
    set "selectedObject=%objectPath%\%%f %%g"
409.
    goto :FileSelectorEnd
410.
  )
411.
)
412.

413.

414.
:: Menue-Datei loeschen
415.
:FileSelectorEnd
416.
del "%menuFile%" 2>NUL
417.

418.
if not defined outputFile goto :FileSelectorExit
419.
if not defined selectedObject goto :FileSelectorExit
420.
>"%outputFile%" (<NUL set /p "=%selectedObject%" & echo.)
421.

422.

423.
:FileSelectorExit
424.
::Funktionsergebnis zurueckgeben
425.
::und Ruecksprung
426.
endlocal & set "selectedObject=%selectedObject%"
427.
exit /b
428.

429.

430.

431.

432.
::Funktion FileSelectorTools
433.
::Wird aufgerufen, wenn der Benutzers T fuer Tools aus der Zeile
434.
::mit den Steuerbefehlen der Dateiauswahlbox eingibt.
435.
:FileSelectorTools
436.
setlocal disabledelayedexpansion
437.

438.
set "toolsMenuFile=%TEMP%\FileSelectorToolsMenu.txt"
439.
set "reloadFileSelector=0"
440.

441.

442.
:FileSelectorToolsSelectLoop
443.
  cls
444.

445.
  ::Auswahlmenue generieren.
446.
  > "%toolsMenuFile%" echo :::Tools
447.
  >>"%toolsMenuFile%" echo :::Neue Datei
448.
  >>"%toolsMenuFile%" echo :::Neues Verzeichnis
449.
  >>"%toolsMenuFile%" echo :::Datei löschen
450.
  >>"%toolsMenuFile%" echo :::Verzeichnis löschen
451.
  >>"%toolsMenuFile%" echo :::
452.

453.
  call :ShowMenu "%toolsMenuFile%" /i "Was möchten Sie tun? " /t /c /w 30
454.
  set /a "selected=%errorlevel%"
455.

456.
  ::Bei Dialog-Abbruch Ruecksprung
457.
  if %selected% equ 0 goto :FileSelectorToolsEnd
458.

459.
  ::Spezielle Auswahl wird nicht gebraucht
460.
  if %selected% lss 0 set /a "selected=-selected"
461.

462.
  if %selected% equ 2 goto :FileSelectorToolsCreateFile
463.
  if %selected% equ 3 goto :FileSelectorToolsCreateDirectory
464.
  if %selected% equ 4 goto :FileSelectorToolsDeleteFile
465.
  if %selected% equ 5 goto :FileSelectorToolsDeleteDirectory
466.
goto :FileSelectorToolsSelectLoop
467.

468.

469.
:FileSelectorToolsCreateFile
470.
::Eingabeaufforderung anzeigen
471.
echo. & set /p "fileName=Geben Sie den Namen der Datei ein: "
472.
if not defined fileName goto :FileSelectorToolsSelectLoop
473.

474.
::Dateinamen auf ungueltige Zeichen pruefen
475.
::Wenn ungueltige Zeichen enthalten sind, Fehlermeldung ausgeben,
476.
::auf Tastendruck warten und dann Tools-Menue nochmal anzeigen
477.
set "fileName=%fileName:"=*%"
478.

479.
for /f %%i in ('set /p "=%fileName%" ^<NUL ^| findstr "[\*?:<>|\\/]"') do (
480.
  echo. & echo Ein Dateiname darf keines der Zeichen *?^<^>^|\/:^" enthalten! & pause>NUL
481.
  goto :FileSelectorToolsSelectLoop
482.
)
483.

484.
::Wenn die Datei noch nicht existiert, ist alles OK
485.
if not exist "%objectPath%\%fileName%" goto :FileSelectorToolsWriteFile
486.

487.
::Sonst Auswahlmenue generieren, was jetzt zu tun ist
488.
> "%toolsMenuFile%" echo :::Existierende Datei überschreiben?
489.
>>"%toolsMenuFile%" echo :::Ja
490.
>>"%toolsMenuFile%" echo :::Nein
491.
>>"%toolsMenuFile%" echo :::
492.

493.
::Auswahlmenue anzeigen
494.
call :ShowMenu "%toolsMenuFile%" /i "Die Datei existiert bereits. Überschreiben? " /t /c
495.
set /a "selected=%errorlevel%"
496.

497.
::Bei Auswahl von Abbruch Ende
498.
::Spezielle Auswahl wird nicht gebraucht
499.
::Bei Auswahl von Ja wird die Datei angelegt
500.
::Bei Auswahl von Nein nochmal Tools-Menue anzeigen
501.
if %selected% equ 0 goto :FileSelectorToolsEnd
502.
if %selected% lss 0 set /a "selected=-selected"
503.
if %selected% equ 2 goto :FileSelectorToolsWriteFile
504.
goto :FileSelectorToolsSelectLoop
505.

506.
:FileSelectorToolsWriteFile
507.
::Leere Datei anlegen
508.
type NUL>"%objectPath%\%fileName%" || pause>NUL
509.

510.
::Inhalt der Dateiauswahlbox muss neu geladen werden
511.
set "reloadFileSelector=1"
512.
echo.
513.
goto :FileSelectorToolsEnd
514.

515.

516.
:FileSelectorToolsCreateDirectory
517.
::Eingabeaufforderung anzeigen
518.
echo. & set /p "dirName=Geben Sie den Namen des Verzeichnisses ein: "
519.
if not defined dirName goto :FileSelectorToolsSelectLoop
520.

521.
::Verzeichnisnamen auf ungueltige Zeichen pruefen
522.
::Wenn ungueltige Zeichen enthalten sind, Fehlermeldung ausgeben,
523.
::auf Tastendruck warten und dann Tools-Menue nochmal anzeigen
524.
set "dirName=%dirName:"=*%"
525.

526.
for /f %%i in ('set /p "=%dirName%" ^<NUL ^| findstr "[\*?:<>|\\/]"') do (
527.
  echo. & echo Ein Verzeichnisname darf keines der Zeichen *?^<^>^|\/:^" enthalten! & pause > NUL
528.
  goto :FileSelectorToolsSelectLoop
529.
)
530.

531.
::Wenn das Verzeichnis noch nicht existiert ist alles OK
532.
if not exist "%objectPath%\%dirName%" goto :FileSelectorToolsWriteDir
533.

534.
::Sonst Fehlermeldung ausgeben und auf Tastendruck warten,
535.
::dann Tools-Menue nochmal anzeigen
536.
echo. & echo Dieses Verzeichnis existiert bereits! & pause>NUL
537.
goto :FileSelectorToolsSelectLoop
538.

539.
:FileSelectorToolsWriteDir
540.
::Verzeichnis anlegen
541.
md "%objectPath%\%dirName%" || pause>NUL
542.

543.
::Inhalt der Dateiauswahlbox muss neu geladen werden
544.
set "reloadFileSelector=1"
545.
echo.
546.
goto :FileSelectorToolsEnd
547.

548.

549.
:FileSelectorToolsDeleteFile
550.
::Dateiauswahlbox anzeigen. Durch Parameter /f koennen nur existierende
551.
::Dateien ausgewaehlt werden und durch /s kann das Verzeichnis nicht
552.
::gewechselt werden. Bei Abbruch Ende
553.
call :FileSelector "%objectPath%" /m *.* /i "Wählen Sie die Datei aus: " /f /s
554.
if not defined selectedObject goto :FileSelectorToolsEnd
555.

556.
::Dialogbox zum bestaetigen des Loeschvorgangs anzeigen
557.
call :FileSelectorToolsWriteConfirmationMenu
558.
call :ShowMenu "%toolsMenuFile%" /i "Diese Datei löschen? " /t /c /w 72
559.
set /a "selected=%errorlevel%"
560.

561.
::Bei Eingabe von Abbruch oder Nein Ende
562.
if %selected% equ 0 goto :FileSelectorToolsEnd
563.
if %selected% lss 0 set /a "selected=-selected"
564.
if %selected% equ 3 goto :FileSelectorToolsEnd
565.

566.
::Datei loeschen
567.
::Falls ein Fehler aufgetreten ist, muss eine Taste gedrueckt werden,
568.
::damit man die Fehlermeldung ansehen kann.
569.
>NUL del /q "%selectedObject%" || pause>NUL
570.

571.
::Inhalt der Dateiauswahlbox muss neu geladen werden
572.
set "reloadFileSelector=1"
573.
echo.
574.
goto :FileSelectorToolsEnd
575.

576.

577.
:FileSelectorToolsDeleteDirectory
578.
::Dateiauswahlbox anzeigen. Durch Parameter /d koennen nur existierende
579.
::Verzeichnisse ausgewaehlt werden und durch /s kann das Verzeichnis nicht
580.
::gewechselt werden. Bei Abbruch Ende
581.
call :FileSelector "%objectPath%" /m *.* /i "Wählen Sie das Verzeichnis aus: " /d /s
582.
if not defined selectedObject goto :FileSelectorToolsEnd
583.

584.
::Dialogbox zum bestaetigen des Loeschvorgangs anzeigen
585.
call :FileSelectorToolsWriteConfirmationMenu
586.
call :ShowMenu "%toolsMenuFile%" /i "Dieses Verzeichnis löschen? " /t /c /w 72
587.
set /a "selected=%errorlevel%"
588.

589.
::Bei Eingabe von Abbruch oder Nein Ende
590.
if %selected% equ 0 goto :FileSelectorToolsEnd
591.
if %selected% lss 0 set /a "selected=-selected"
592.
if %selected% equ 3 goto :FileSelectorToolsEnd
593.

594.
::Verzeichnis und alle Unterverzeichnisse ohne Nachfrage loeschen.
595.
::Falls ein Fehler aufgetreten ist, muss eine Taste gedrueckt werden,
596.
::damit man die Fehlermeldungen ansehen kann.
597.
>NUL rd /s /q "%selectedObject%" || pause>NUL
598.

599.
::Inhalt der Dateiauswahlbox muss neu geladen werden
600.
set "reloadFileSelector=1"
601.
echo.
602.
goto :FileSelectorToolsEnd
603.

604.

605.
:FileSelectorToolsEnd
606.
::Menuedatei loeschen
607.
>NUL del "%toolsMenuFile%"
608.

609.
::Ruecksprung mit Rueckgabewert
610.
exit /b %reloadFileSelector%
611.

612.

613.

614.
::Stellt eine Dialogbox zum bestaetigen eines Loeschvorgangs dar.
615.
::In der Titelzeile wird die Datei/das Verzeichnis angezeigt, das geloescht
616.
::werden soll. Die Pfadlaenge wird bei Bedarf so gekuerzt, dass das Laufwerk
617.
::und das hintere Ende des Pfades auf jeden Fall angezeigt wird.
618.
:FileSelectorToolsWriteConfirmationMenu
619.
setlocal
620.

621.
set "fstConfirmTitle=%selectedObject%"
622.
set "fstConfirmTitleDrv=%selectedObject:~0,3%"
623.
set "fstConfirmTitlePath=%selectedObject:~3%"
624.
if not defined fstConfirmTitlePath goto :FileSelectorToolsWriteConfirmationFile
625.

626.
set "correction=9"
627.

628.
:FileSelectorToolsTrimTitleLoop
629.
  >"%TEMP%\strlen.txt" (set /p "=<%fstConfirmTitlePath%"&echo.&set /p "=<"&echo.) <NUL
630.
  for /f "delims=:" %%l in ('findstr /o /b "<" "%TEMP%\strlen.txt"') do set /a "fstTitleLen=%%l+correction"
631.

632.
  if %fstTitleLen% leq 72 (
633.
    del "%TEMP%\strlen.txt" 2>NUL
634.
    if %correction% neq 9 goto :FileSelectorToolsTrimTitleLoopEnd
635.
    goto :FileSelectorToolsWriteConfirmationFile
636.
  )
637.

638.
  set "fstConfirmTitlePath=%fstConfirmTitlePath:*\=%"
639.

640.
  set "correction=13"
641.
  goto :FileSelectorToolsTrimTitleLoop
642.
:FileSelectorToolsTrimTitleLoopEnd
643.

644.
::Die gekuerzte Titelzeile zusammenbauen
645.
set "fstConfirmTitle=%fstConfirmTitleDrv%...\%fstConfirmTitlePath%"
646.

647.
:FileSelectorToolsWriteConfirmationFile
648.
> "%toolsMenuFile%" (set /p "=:::%fstConfirmTitle% löschen?" <NUL & echo.)
649.
>>"%toolsMenuFile%" echo :::Ja
650.
>>"%toolsMenuFile%" echo :::Nein
651.
>>"%toolsMenuFile%" echo :::
652.

653.
exit /b
654.

655.

656.

657.

658.
::Funktion ShowMenu
659.
::
660.
::Zeigt ein umrahmtes Menue an, dessen Eintraege innerhalb des Rahmens
661.
::zentriert dargestellt werden. Die Hoehe des Rahmens passt sich der Anzahl der
662.
::Menueeintraege an, kann aber auch ueber den Parameter /h fest eingestellt
663.
::werden. Umfasst das Menue mehr Eintraege als in den Rahmen passen, kann
664.
::geblaettert werden. Die Breite des Rahmens passt sich dem laengsten Eintrag
665.
::im Menue, der Titelzeile (Parameter /t) oder der Zeile mit den Steuerbefehlen
666.
::an, je nach dem, was laenger ist. Die Rahmenbreite kann aber auch durch den
667.
::Parameter /w festgelegt werden. Der Rahmen wird aber mindestens so breit
668.
::sein, das die Zeile mit den Steuerbefehlen vollstaendig hineinpasst. Menue-
669.
::eintraege, die nicht komplett in den Rahmen passen, werden abgeschnitten,
670.
::ebenso die Titelzeile. Der Rahmen kann wahlweise zentriert auf dem Bildschirm
671.
::dargestellt werden. Ein Menueeintrag wird ueber seine Nummer ausgewaehlt.
672.
::Die Menueeintraege muessen der Funktion in einer Datei uebergeben werden. Die
673.
::Nummerierung (inkl. fuehrender Nullen) wird von ShowMenu durchgefuehrt. Ein
674.
::Doppelpunkt als erstes Zeichen eines Menueeintrags ist nicht möglich. Die
675.
::letzte Zeile der Datei muss drei Doppelpunkte (eine Leerzeile) enthalten. Nur
676.
::so kann, fuer den Fall, dass der letzte Menueeintrag der laengste ist, die
677.
::Breite des Rahmens korrekt berechnet werden und nur dann werden alle Menue-
678.
::eintraege dargestellt. Das Einfuegen von Leerzeilen ins Menue ist zwar
679.
::moeglich, diese werden aber auch nummeriert. Durch den Parameter /u kann der
680.
::Zeile mit den Stuerbefehlen EIN benutzerdefinierter Eintrag hinzugefuegt
681.
::werden. Dazu muss der Text des Eintrags, die Taste fuer seine Auswahl und
682.
::der Name der Funktion, die dadurch aufgerufen werden soll, uebergeben
683.
::werden. Die Ausloesetaste kann nicht c oder C sein, da dieser Code intern
684.
::fuer die spezielle Auswahl benutzt wird, d.h. man gibt CX ein (X steht für
685.
::die Nummer des auszuwaehlenden Menueeintrags). Anstatt der Zeilennummer des
686.
::Menueeintrags in der Menuedatei wird dann die negative Zeilennummer zurueck-
687.
::gegeben. Sinn der Sache ist folgender: Wenn ShowMenu z.B. dazu benutzt wird,
688.
::um eine Dateiauswahlbox darzustellen, kann durch Eingabe der Nummer X eines
689.
::Menueintrags, der ein Verzeichnis darstellt, in dieses Verzeichnis gewechselt
690.
::werden. Durch Eingabe von CX kann das aufrufende Skript an der dann zurueck-
691.
::gegebenen negativen Nummer X des Menueeintrags erkennen, dass nicht in das
692.
::ausgewaehlte Verzeichnis gewechselt werden soll, sondern der Verzeichnisname
693.
::selbst ausgewaehlt werden soll.
694.
::
695.
::Die Funktion gibt in ERRORLEVEL die Zeilennummer des ausgewaehlten Menue-
696.
::eintrags in der Menuedatei zurueck. Unter Verwendung der speziellen Auswahl
697.
::ist diese Nummer negativ. Wenn in der Menuedatei eine Titelzeile enthalten
698.
::ist, ist die Nummer des ersten Menueeintrags 2. Ohne Titelzeile ist die
699.
::Nummer gleich 1. Im Query-Mode (Parameter /q) wird die Laenge der laengsten
700.
::Zeile in der Menuebox (die Breite des beschreibbaren Bereichs) zurueck-
701.
::gegeben. Bei Auswahl von A oder a (fuer Abbruch) wird 0 zurueckgeliefert.
702.
::Wenn das Menue neu geladen werden muss, wird 2147483647 zurueckgegeben.
703.
::Bei einem Fehler in den Parametern wird -2147483648 zurueckgeliefert.
704.
::
705.
::Die Reihenfolge der Parameter ist beliebig.
706.
::
707.
::
708.
::Aufruf   : call :ShowMenu Datei [/i Eingabeaufforderung] [/s Startzeile]
709.
::                          [/h Zeilenanzahl] [/w Spaltenanzahl]
710.
::                          [/u Taste Eintrag Funktion]
711.
::                          [/t] [/c] [/q]
712.
::
713.
::Parameter: Datei
714.
::             Pfad zur Datei, die die Menueeintraege enthaelt.
715.
::             Pro Zeile der Datei wird eine Zeile des Menues angegeben.
716.
::             Eine Zeile muss mit drei Doppelpunkten (:::) beginnen,
717.
::             danach kommt der Text der Menuezeile. Die lezte Zeile der
718.
::             Datei muss eine Leerzeile sein.
719.
::             Beispiel: :::Eintrag 1
720.
::                       :::Eintrag 2
721.
::                       :::
722.
::
723.
::           Eingabeaufforderung
724.
::             Der Text, der als Eingabeaufforderung angezeigt werden soll.
725.
::             Standard ist Auswahl?
726.
::
727.
::           Startzeile
728.
::             Gibt die Zeile an, die als erstes im Menue erscheinen soll.
729.
::             Standard ist 1.
730.
::
731.
::           Zeilenanzahl
732.
::             Gibt die Anzahl Zeilen des beschreibbaren Bereichs in der
733.
::             Menuebox an.
734.
::             Zulaessige Werte sind 1-12 mit Titelzeile (Standard 12) und
735.
::             1-14 ohne Titelzeile (Standard 14). Selbst wenn die Menuebox
736.
::             mit allen Eintraegen auf den Schirm passen wuerde, kann
737.
::             hiermit eine Maximalhoehe vorgegeben werden.
738.
::
739.
::           Spaltenanzahl
740.
::             Gibt die Anzahl Spalten des beschreibbaren Bereichs in der
741.
::             Menuebox an.
742.
::             Zulaessige Werte sind 58-74 (58 ist die Breite der Zeile mit
743.
::             den Steuerbefehlen). Ohne diesen Parameter passt sich die Breite
744.
::             der Menuebox an die Laenge des laengsten Menueeintrags bzw. der
745.
::             Titelzeile an.
746.
::
747.
::           Benutzerdefinierter Steuerbefehl
748.
::             Durch Uebergabe des Parameter /u ist es moeglich, EINEN
749.
::             benutzerdefinierten Eintrag in der Zeile mit den Steuerbefehlen
750.
::             anzuzeigen. Taste ist der Buchstabe, um die benutzerdefinierte
751.
::             Funktion, deren Namen durch Funktion festgelegt wird,
752.
::             aufzurufen. Eintrag ist der Text, der in der Zeile mit den
753.
::             Steuerbefehlen angezeigt wird. Taste darf nicht den Wert c oder
754.
::             C haben, da dieser Code intern fuer die spezielle Auswahl
755.
::             benutzt wird. Die aufzurufende Funktion muss einen von 0
756.
::             verschiedenen Wert zurueckliefern, wenn das Menu neu geladen
757.
::             werden muss (ShowMenu gibt dann 2147483647 an seinen Aufrufer
758.
::             zurueck), sonst 0.
759.
::
760.
::           Titelzeile
761.
::             Wenn der Parameter /t angegeben wird, wird die erste Zeile der
762.
::             Menue-Datei als Titelzeile in der Menuebox angezeigt. Dadurch
763.
::             wird bei Auswahl des ersten Menueeintrags 2 zurueckgegeben,
764.
::             bei Auswahl des zweiten 3 usw.
765.
::
766.
::           Center
767.
::             Wenn der Parameter /c angegeben wird, wird die Menuebox auf dem
768.
::             Bildschirm zentriert. Standard ist linksbuendige Darstellung.
769.
::
770.
::           Query-Mode
771.
::             Durch die Angabe des Parameters /q kann die Breite des
772.
::             beschreibbaren Bereichs der Menuebox erfragt werden. Das kann
773.
::             z.B. dazu benutzt werden, um die Titelzeile zu formatieren.
774.
::
775.
::Rueckgabe: In ERRORLEVEL wird die Zeilennummer innerhalb der Menuedatei des
776.
::           ausgewaehlten Menueeintrags zurueckgegeben. Diese Zeilenummer ist
777.
::           negativ, wenn ein Eintrag mit der speziellen Auswahl (CX, X ist
778.
::           die Eintragsnummer) ausgewaehlt wurde. Wenn eine Titelzeile
779.
::           angezeigt wird, ist die Zeilennummer des ersten Menueeintrags 2
780.
::           (bzw. -2), ohne Titelzeile ist sie 1 (bzw. -1). Bei Auswahl von
781.
::           a oder A fuer Abbruch wird 0 zurueckgegeben. Wenn das Menue neu
782.
::           geladen werden muss, wird 2147483647 zurueckgeliefert und bei
783.
::           Fehlern in den Parametern der Wert -2147483648.
784.
::
785.
::Bedienung: a oder A - bricht die Funktion ab.
786.
::           u        - blaettert eine Zeile nach unten
787.
::           o        - blaettert eine Zeile nach oben
788.
::           U        - blaettert eine Seite nach unten
789.
::           O        - blaettert eine Seite nach oben
790.
::           b oder B - blaettert zum Anfang der Liste
791.
::           e oder E - blaettert zum Ende der Liste
792.

793.

794.
:ShowMenu
795.
setlocal disabledelayedexpansion
796.

797.
::Die Rahmenelemente definieren
798.
set "ulCorner=╔"
799.
set "urCorner=╗"
800.
set "llCorner=╚"
801.
set "lrCorner=╝"
802.
set "hBar=═"
803.
set "vBar=║"
804.

805.

806.
::Die Zeile mit den Steuerbefehlen definieren
807.
set "ctrlLine=A=Abbruch"
808.
set "ctrlLineLen=9
809.
set "scrollCtrls=  o/O=nach oben  u/U=nach unten  B=Beginn  E=Ende"
810.

811.

812.
::Zur Sicherheit Variabeln loeschen
813.
set "inputStr=Auswahl? "
814.
set "center=0"
815.
set "specialChoice=0"
816.

817.
set "startLine="
818.
set "contentLines="
819.
set "contentCols="
820.
set "readTitleStr="
821.
set "titleStr="
822.
set "titleLine="
823.
set "queryMode="
824.
set "menuFile="
825.
set "userKey="
826.
set "userOption="
827.
set "userHandler="
828.

829.

830.
::Parameter ermitteln
831.
:ShowMenuChkParamsLoop
832.
  set "param=%~1"
833.

834.
  if /i "%param%" equ "/u" (
835.
    set "userKey=%~2" & set "userOption=%~3" & set "userHandler=%~4" & shift & shift & shift
836.
  ) else if /i "%param%" equ "/h" (
837.
    set /a "contentLines=%~2" & shift
838.
  ) else if /i "%param%" equ "/w" (
839.
    set /a "contentCols=%~2" & shift
840.
  ) else if /i "%param%" equ "/s" (
841.
    set /a "startLine=%~2"& shift
842.
  ) else if /i "%param%" equ "/i" (
843.
    set "inputStr=%~2" & shift
844.
  ) else if /i "%param%" equ "/t" (
845.
    set "readTitleStr=1"
846.
  ) else if /i "%param%" equ "/q" (
847.
    set "queryMode=1"
848.
  ) else if /i "%param%" equ "/c" (
849.
    set /a "center=1"
850.
  ) else if "%param:~0,1%" neq "/" if not defined menuFile (
851.
    set "menuFile=%~f1%"
852.
  )
853.

854.
  shift
855.
if "%~1" neq "" goto :ShowMenuChkParamsLoop
856.

857.

858.
::Wenn der Name der Menue-Datei ein ^ enthaelt, wurde es vom Kommando-
859.
::Interpreter beim Aufruf von ShowMenu aus einem Batch-Skript durch ^^
860.
::ersetzt. Das muss wieder rueckgaengig gemacht werden.
861.
set "menuFile=%menuFile:^^=^%"
862.

863.

864.
::Bei falschen Parametern Rücksprung
865.
if not defined menuFile exit /b -2147483648
866.
if not exist "%menuFile%" exit /b -2147483648
867.

868.

869.
::Wenn eine Titelzeile ausgegeben werden soll, die maximale Anzahl von
870.
::Menueeintraegen um 2 niedriger festsetzen und Titelzeile einlesen.
871.
if defined readTitleStr (
872.
  set /p "titleStr=" <"%menuFile%"
873.
  set "maxContentLines=12"
874.
) else (
875.
  set "maxContentLines=14"
876.
)
877.

878.

879.
::Ausrufezeichen im Namen der Menue-Datei escapen, da im weiteren Verlauf
880.
::des Skripts die Variable nur noch in Bereichen mit ENABLEDELAYEDEXPANSION
881.
::benutzt wird, in denen Ausrufezeichen im Variableninhalt Probleme machen.
882.
set "menuFile=%menuFile:!=^!%"
883.

884.

885.
::Breite des laengsten Menueeintrags und der Titelzeile ermitteln.
886.
::Dabei auch gleich die Anzahl der Menueeintraege zaehlen.
887.
setlocal enabledelayedexpansion
888.

889.
set "longestLine=0"
890.
set "chrOffset=0"
891.
set "numItems=0"
892.
set "titleLineLen=0"
893.

894.
for /f "delims=:" %%i in ('findstr /o /b ":::" "%menuFile%"') do (
895.
  set /a "numItems+=1"
896.

897.
  set /a "lineLen=%%i-chrOffset-5"
898.
  set /a "chrOffset=%%i"
899.

900.
  if !longestLine! lss !lineLen! (
901.
    if not defined titleStr (
902.
      set /a "longestLine=lineLen"
903.
    ) else (
904.
      if !numItems! equ 2 (
905.
        set /a "titleLineLen=lineLen"
906.
      ) else (
907.
        set /a "longestLine=lineLen"
908.
      )
909.
    )
910.
  )
911.
)
912.

913.
endlocal & set "longestLine=%longestLine%" & set "numItems=%numItems%" & set "titleLineLen=%titleLineLen%"
914.

915.

916.
::Durch die zusätzliche Leerzeile in der Menue-Datei muss numItems korrigiert
917.
::werden. Die Hoehe der Korrektur haengt davon ab, ob in der Menue-Datei eine
918.
::Titelzeile enthalten ist.
919.
if defined titleStr (
920.
  set /a "numItems-=2"
921.
) else (
922.
  set /a "numItems-=1"
923.
)
924.

925.

926.
::Hoehe der Menuebox ermitteln
927.
if defined contentLines goto :ShowMenuCheckContentLinesBounds
928.

929.
::Hoehe der Menuebox abhaengig von der Anzahl der Menueeintraege setzen.
930.
if %numItems% leq %maxContentLines% (
931.
  set /a "contentLines=numItems"
932.
) else (
933.
  set /a "contentLines=maxContentLines"
934.
)
935.

936.
::Keine Leerzeilen nach den Menueeintraegen ausgeben
937.
set "trailingBlankLines=0"
938.
goto :ShowMenuSetCtrlLine
939.

940.
:ShowMenuCheckContentLinesBounds
941.
::Obere und untere Grenze der uebergebenen contentLines pruefen.
942.
if %contentLines% lss 1 set "contentLines=1"
943.
if %contentLines% gtr %maxContentLines% set /a "contentLines=maxContentLines"
944.

945.
::Anzahl Leerzeilen ausrechnen, die nach den Menueeintraegen ausgegeben werden
946.
::muessen, um eine konstante Hoehe der Menuebox zu erreichen, wenn weniger
947.
::Menueeintraege als Zeilen vorhanden sind.
948.
set /a "trailingBlankLines=contentLines-numItems"
949.

950.

951.
:ShowMenuSetCtrlLine
952.
::Falls nicht alle Menueeintraege in die Menuebox passen, die Zeile mit den
953.
::Steuerbefehlen um die Scroll-Steuerung verlaengern und Laenge anpassen
954.
if %numItems% gtr %contentLines% (
955.
  set "ctrlLine=%ctrlLine%%scrollCtrls%"
956.
  set "ctrlLineLen=58"
957.
)
958.

959.

960.
::Falls eine benutzerdefinierte Steuerfunktion uebergeben wurde, die Zeile mit
961.
::den Steuerbefehlen und deren Laenge anpassen. Die benutzerdefinierte Taste
962.
::darf nicht c oder C sein, weil dieser Code die für die spezielle Auswahl
963.
::reserviert ist.
964.
if not defined userKey goto :ShowMenuCountNumItemsDigits
965.
if not defined userOption exit /b -2147483648
966.
if not defined userHandler exit /b -2147483648
967.

968.
set "userKey=%userKey:~0,1%"
969.
if /i "%userKey%" equ "C" exit /b -2147483648
970.

971.
set "ctrlLine=%ctrlLine%  %userOption%"
972.
>"%TEMP%\strlen.txt" (set /p "=<%ctrlLine%"&echo.&set /p "=<"&echo.) <NUL
973.
for /f "delims=:" %%l in ('findstr /o /b "<" "%TEMP%\strlen.txt"') do set /a "ctrlLineLen=%%l-3"
974.
del "%TEMP%\strlen.txt" > NUL
975.

976.
if %ctrlLineLen% gtr 74 (
977.
  set "ctrlLine=%ctrlLine:~0,74%"
978.
  set "ctrlLineLen=74"
979.
)
980.

981.

982.
:ShowMenuCountNumItemsDigits
983.
::Bestimmen, wie viele Stellen numItems hat und fuer die Nummerierung
984.
::String fuer fuehrende Nullen generieren.
985.
set "numItems2=%numItems%"
986.
set "numDigits=1"
987.
set "zeros="
988.

989.
:ShowMenuCountDigitsLoop
990.
  set /a "numItems2/=10"
991.
if %numItems2% gtr 0 (set /a "numDigits+=1" & set "zeros=%zeros%0" & goto :ShowMenuCountDigitsLoop)
992.

993.

994.
::longestLine um die Anzahl Zeichen fuer die Nummerierung und den Zwischenraum
995.
::zwischen Nummern und Menueeintraegen erhoehen
996.
set /a "longestLine+=numDigits+2"
997.

998.

999.
::Wenn die breiteste Zeile oder die Titelzeile breiter als zulaessig,
1000.
::auf Maximalwert setzen
1001.
if %longestLine% gtr 74 set "longestLine=74"
1002.
if %titleLineLen% gtr 74 set "titleLineLen=74"
1003.

1004.

1005.
::Innere Breite der Menuebox ermitteln.
1006.
if defined contentCols goto :ShowMenuCheckContentColsBounds
1007.

1008.
::Breite der Menuebox auf das Maximum aus longestLine, ctrlLineLen und,
1009.
::falls eine Titelzeile ausgegeben werden soll, titleLineLen setzen
1010.
if %longestLine% gtr %ctrlLineLen% (
1011.
  set /a "innerBoxWidth=longestLine"
1012.
) else (
1013.
  set /a "innerBoxWidth=ctrlLineLen"
1014.
)
1015.

1016.
if %titleLineLen% gtr %innerBoxWidth% (
1017.
  set /a "innerBoxWidth=titleLineLen"
1018.
)
1019.

1020.
goto :ShowMenuCheckQueryMode
1021.

1022.
:ShowMenuCheckContentColsBounds
1023.
::Ober- und Untergrenze von contentCols pruefen
1024.
if %contentCols% lss %ctrlLineLen% set /a "contentCols=ctrlLineLen"
1025.
if %contentCols% gtr 74 set "contentCols=74"
1026.

1027.
set /a "innerBoxWidth=contentCols"
1028.

1029.
::longestLine und titleLineLen an die vorgegebene Breite der Menuebox anpassen
1030.
if %longestLine% gtr %innerBoxWidth% set /a "longestLine=innerBoxWidth"
1031.
if %titleLineLen% gtr %innerBoxWidth% set /a "titleLineLen=innerBoxWidth"
1032.

1033.

1034.
:ShowMenuCheckQueryMode
1035.
::Wenn nur die Laenge der laengsten Zeile abgefragt werden soll, Ruecksprung
1036.
if defined queryMode exit /b %innerBoxWidth%
1037.

1038.

1039.
::innerBoxWidth um das minimale Padding erhoehen
1040.
set /a "innerBoxWidth+=4"
1041.

1042.

1043.
::Die maximal moegliche startLine ermitteln.
1044.
if defined titleStr goto :ShowMenuCalcMaxStartLineWithTitleLine
1045.

1046.
::Ohne Titelzeile
1047.
set /a "maxStartLine=numItems-contentLines+1"
1048.
if %maxStartLine% lss 1 set "maxStartLine=1"
1049.
goto :ShowMenuSetStartLine
1050.

1051.
::Mit Titelzeile
1052.
:ShowMenuCalcMaxStartLineWithTitleLine
1053.
set /a "maxStartLine=numItems-contentLines+2"
1054.
if %maxStartLine% lss 2 set "maxStartLine=2"
1055.

1056.

1057.
::Den ersten anzuzeigenden Menueeintrag ermitteln
1058.
:ShowMenuSetStartLine
1059.
if defined startLine goto :ShowMenuCheckStartLineBounds
1060.

1061.
::Keine startLine uebergeben => startLine auf Standardwert setzen
1062.
::Dabei beruecksichtigen, ob eine Titelzeile angezeigt werden soll oder nicht.
1063.
if not defined titleStr (
1064.
  set "startLine=1"
1065.
) else (
1066.
  set "startLine=2"
1067.
)
1068.

1069.
goto :ShowMenuCalcPaddings
1070.

1071.
::Obere und untere Grenze von uebergebener startLine pruefen
1072.
:ShowMenuCheckStartLineBounds
1073.
if not defined titleStr (
1074.
  if %startLine% lss 1 set "startLine=1"
1075.
) else (
1076.
  if %startLine% lss 2 set "startLine=2"
1077.
)
1078.

1079.
::Bei zu grossem Wert auf den Maximalwert setzen
1080.
if %startLine% gtr %maxStartLine% set /a "startLine=maxStartLine"
1081.

1082.

1083.
:ShowMenuCalcPaddings
1084.
::Paddings errechnen
1085.
set /a "itemLinePadding=(innerBoxWidth-longestLine)/2"
1086.
set /a "ctrlLinePadding=(innerBoxWidth-ctrlLineLen)/2"
1087.

1088.

1089.
::DELAYEDEXPANSION einschalten, damit man im folgenden Bereich FOR-Schleifen
1090.
::statt GOTO-Schleifen benutzen kann
1091.
setlocal enabledelayedexpansion
1092.

1093.
::Zeile fuer vertikalen Rand der Menuebox und die Leerzeilen erzeugen
1094.
set "vertBorder="
1095.
set "blankLine="
1096.

1097.
for /l %%i in (1,1,%innerBoxWidth%) do (
1098.
  set "vertBorder=!vertBorder!%hBar%"
1099.
  set "blankLine=!blankLine! "
1100.
)
1101.

1102.

1103.
::Die Leerzeichen fuer Padding von den Zeilen mit den Menuepunkten erzeugen
1104.
set "itemLinePaddingBlanks="
1105.

1106.
for /l %%i in (1,1,%itemLinePadding%) do (
1107.
  set "itemLinePaddingBlanks=!itemLinePaddingBlanks! "
1108.
)
1109.

1110.

1111.
::Die Leerzeichen fuer Padding von der Zeile mit den Steuerbefehlen erzeugen
1112.
set "ctrlLinePaddingBlanks="
1113.

1114.
for /l %%i in (1,1,%ctrlLinePadding%) do (
1115.
  set "ctrlLinePaddingBlanks=!ctrlLinePaddingBlanks! "
1116.
)
1117.

1118.

1119.
::Die Leerzeichen fuer die Zentrierung der Menuebox erzeugen
1120.
set "screenPadding=0"
1121.
set "screenPaddingBlanks="
1122.

1123.
if %center% neq 0 (
1124.
  set /a "screenPadding=(80-(innerBoxWidth+2))/2"
1125.

1126.
  for /l %%i in (1,1,!screenPadding!) do (
1127.
    set "screenPaddingBlanks=!screenPaddingBlanks! "
1128.
  )
1129.
)
1130.

1131.
::DELAYEDEXPANSION ausschalten, damit man die Titelzeile und die Zeile mit
1132.
::den Steuerbefehlen, die evtl. Ausrufezeichen enthalten koennten, problemlos
1133.
::zusammensetzen kann.
1134.
endlocal & set "vertBorder=%vertBorder%" & set "blankLine=%blankLine%" & set "itemLinePaddingBlanks=%itemLinePaddingBlanks%" & set "ctrlLinePaddingBlanks=%ctrlLinePaddingBlanks%" & set "screenPaddingBlanks=%screenPaddingBlanks%"
1135.

1136.

1137.
::Zeile mit den Steuerbefehlen inkl. Padding erzeugen
1138.
set "ctrlLine=%ctrlLinePaddingBlanks%%ctrlLine%%blankLine%"
1139.
call set "ctrlLine=%%ctrlLine:~0,%innerBoxWidth%%%"
1140.

1141.

1142.
::Evtl. Titelzeile inkl. Padding erzeugen. Die drei fuehrenden Doppelpunkte
1143.
::abschneiden. Sonderzeichen escapen. Klammern muessen escaped werden, weil
1144.
::die Ausgabebefehle fuer die Titelzeile in einem geklammerten IF-ELSE-Block
1145.
::stehen.
1146.
if not defined titleStr goto :ShowMenuWithoutTitleLine
1147.

1148.
set /a "titleLineWidth=innerBoxWidth-4"
1149.

1150.
set "titleLine=%titleStr:~3%%blankLine%"
1151.
call set "titleLine=  %%titleLine:~0,%titleLineWidth%%%  "
1152.
set "titleLine=%titleLine:^=^^%"
1153.
set "titleLine=%titleLine:&=^&%"
1154.
set "titleLine=%titleLine:(=^(%"
1155.
set "titleLine=%titleLine:)=^)%"
1156.

1157.

1158.
::Die Hauptschleife von ShowMenu muss mit DELAYEDEXPANSION laufen. Dort wird
1159.
::zwar zweimal DELAYEDEXPANSION ausgeschaltet, aber ohne die jetzt folgende
1160.
::ENABLEDELAYEDEXPANSION-Zeile muesste dreimal umgeschaltet werden.
1161.
:ShowMenuWithoutTitleLine
1162.
setlocal enabledelayedexpansion
1163.

1164.

1165.
::Hauptschleife von ShowMenu, in der die Menuebox dargestellt wird
1166.
::Falls die Menuebox bildschirmfuellend wird, andere Ausgabebefehle benutzen
1167.
:ShowMenuSelectLoop
1168.
  cls
1169.

1170.
  ::DELAYEDEXPANSION ausschalten, damit Ausrufezeichen in der Titelzeile
1171.
  ::keine Probleme machen.
1172.
  setlocal disabledelayedexpansion
1173.

1174.
  ::Oberen Rand, eine Leerzeile und evtl. Titelzeile und
1175.
  ::noch eine Leerzeile ausgeben
1176.
  if %innerBoxWidth% equ 78 (
1177.
    <NUL set /p =%ulCorner%%vertBorder%%urCorner%
1178.
    <NUL set /p =%vBar%%blankLine%%vBar%
1179.
    if defined titleLine <NUL set /p =%vBar%%titleLine%%vBar%
1180.
    if defined titleLine <NUL set /p =%vBar%%blankLine%%vBar%
1181.
  ) else (
1182.
    echo %screenPaddingBlanks%%ulCorner%%vertBorder%%urCorner%
1183.
    echo %screenPaddingBlanks%%vBar%%blankLine%%vBar%
1184.
    if defined titleLine echo %screenPaddingBlanks%%vBar%%titleLine%%vBar%
1185.
    if defined titleLine echo %screenPaddingBlanks%%vBar%%blankLine%%vBar%
1186.
  )
1187.

1188.
  endlocal
1189.

1190.

1191.
  ::Inhalt der Menuebox ausgeben.
1192.
  ::Prozedur zum Ausgeben der Menueeintraege nur fuer die Zeilen aufrufen,
1193.
  ::die ausgegeben werden muessen (wird schneller ausgefuehrt). Bei der
1194.
  ::Ausgabe DELAYEDEXPANSION ausschalten, damit Ausrufezeichen in den
1195.
  ::Menueeintraegen keine Probleme machen. Durch die zwei verschiedenen
1196.
  ::Methoden, um itemLine zusammenzusetzen, wird sichergestellt, das die
1197.
  ::Menueeintraege auch Doppelpunkte enthalten koennen (ausser als erstes
1198.
  ::Zeichen, da Doppelpunkte von der FOR-Schleife als Trennzeichen behandelt
1199.
  ::werden).
1200.
  set "itemCntr=0"
1201.
  set /a "maxItem=startLine+contentLines-1"
1202.
  if %maxItem% gtr %numItems% (if defined titleLine (set /a "maxItem=numItems+1") else (set /a "maxItem=numItems"))
1203.

1204.
  for /f "usebackq tokens=1,* delims=" %%i in ("%menuFile%") do (
1205.
    set /a "itemCntr+=1"
1206.

1207.
    if !itemCntr! geq %startLine% if !itemCntr! leq %maxItem% (
1208.
      setlocal disabledelayedexpansion
1209.
      set "itemLine=%%i"
1210.
      call :ShowMenuPrintMenuItems
1211.
      endlocal
1212.
    )
1213.
  )
1214.

1215.

1216.
  ::Leerzeilen ausgeben, um eine konstante Hoehe der Menuebox
1217.
  ::zu erreichen.
1218.
  for /l %%i in (1,1,%trailingBlankLines%) do (
1219.
    if %innerBoxWidth% equ 78 (
1220.
      <NUL set /p =%vBar%%blankLine%%vBar%
1221.
    ) else (
1222.
      echo %screenPaddingBlanks%%vBar%%blankLine%%vBar%
1223.
    )
1224.
  )
1225.

1226.

1227.
  ::Zwei Leerzeilen, die Zeile mit den Steuerbefehlen, noch eine Leerzeile
1228.
  ::und den unteren Rand der Menuebox ausgeben
1229.
  if %innerBoxWidth% equ 78 (
1230.
    <NUL set /p =%vBar%%blankLine%%vBar%
1231.
    <NUL set /p =%vBar%%blankLine%%vBar%
1232.
    <NUL set /p =%vBar%%ctrlLine%%vBar%
1233.
    <NUL set /p =%vBar%%blankLine%%vBar%
1234.
    <NUL set /p =%llCorner%%vertBorder%%lrCorner%
1235.
  ) else (
1236.
    echo %screenPaddingBlanks%%vBar%%blankLine%%vBar%
1237.
    echo %screenPaddingBlanks%%vBar%%blankLine%%vBar%
1238.
    echo %screenPaddingBlanks%%vBar%%ctrlLine%%vBar%
1239.
    echo %screenPaddingBlanks%%vBar%%blankLine%%vBar%
1240.
    echo %screenPaddingBlanks%%llCorner%%vertBorder%%lrCorner%
1241.
  )
1242.

1243.

1244.
  ::Zwei Leerzeilen und die Eingabeaufforderung ausgeben
1245.
  echo. & echo.
1246.
  set "selected="
1247.
  set /p "selected=%inputStr%"
1248.

1249.

1250.
  ::Bei leerer Eingabe Menue nochmal darstellen.
1251.
  if not defined selected goto :ShowMenuSelectLoop
1252.

1253.

1254.
  ::Sonderzeichen aus der Eingabe herausfiltern.
1255.
  ::Vermeidet zufaelliges Cross-Site Scripting.
1256.
  set "selected=%selected:!= %"
1257.
  set "selected=%selected:^= %"
1258.
  set "selected=%selected:"= %"
1259.
  set "selected=%selected:'= %"
1260.
  set "selected=%selected:`= %"
1261.
  set "selected=%selected:&= %"
1262.
  set "selected=%selected:<= %"
1263.
  set "selected=%selected:>= %"
1264.
  set "selected=%selected:|= %"
1265.

1266.

1267.
  ::Besteht die Eingabe nur aus zulaessigen Zeichen?
1268.
  ::Wenn nicht, Menue nochmal darstellen
1269.
  for /f %%i in ('echo %selected%^|findstr /i "[^aoubec0-9%userKey%]"') do (
1270.
    goto :ShowMenuSelectLoop
1271.
  )
1272.

1273.

1274.
  ::Auf die Eingabe von Steuerbefehlen reagieren
1275.
  if /i "%selected%" equ "A" set "selected=0" & goto :ShowMenuSelectLoopBreak
1276.
  if "%selected%" equ "o" if defined titleLine (if %startLine% gtr 2 set /a "startLine-=1") else (if %startLine% gtr 1 set /a "startLine-=1") & goto :ShowMenuSelectLoop
1277.
  if "%selected%" equ "u" if %startLine% lss %maxStartLine% set /a "startLine+=1" & goto :ShowMenuSelectLoop
1278.
  if "%selected%" equ "O" set /a "startLine-=contentLines-1" & if defined titleLine (if !startLine! lss 2 set /a "startLine=2") else (if !startLine! lss 1 set /a "startLine=1") & goto :ShowMenuSelectLoop
1279.
  if "%selected%" equ "U" set /a "startLine+=contentLines-1" & if !startLine! gtr %maxStartLine% set /a "startLine=maxStartLine" & goto :ShowMenuSelectLoop
1280.
  if /i "%selected%" equ "B" if defined titleLine (set "startLine=2") else (set "startLine=1") & goto :ShowMenuSelectLoop
1281.
  if /i "%selected%" equ "E" set /a "startLine=maxStartLine" & goto :ShowMenuSelectLoop
1282.

1283.
  if not defined userKey goto :ShowMenuCheckSpecialChoice
1284.
  ::Benutzerdefinierte Funktion aufrufen. Wenn der Rueckgabewert ungleich 0
1285.
  ::ist, mit dem Code für Menue neu laden back to caller.
1286.
  if /i "%selected%" equ "%userKey%" (call :%userHandler% && goto :ShowMenuSelectLoop || set "selected=2147483647" & goto :ShowMenuSelectLoopBreak)
1287.

1288.
  ::Auf Code fuer spezielle Auswahl pruefen
1289.
  :ShowMenuCheckSpecialChoice
1290.
  if /i "%selected:~0,1%" equ "C" set "selected=%selected:~1%" & set "specialChoice=1"
1291.

1292.

1293.
  ::Fuehrende Nullen entfernen, damit selected nicht als Oktalzahl
1294.
  ::angesehen wird
1295.
  for /f "tokens=* delims=0" %%n in ("%selected%") do set "selected=%%n"
1296.

1297.

1298.
  ::Eingabe in eine Zahl wandeln
1299.
  if defined titleLine (set /a "selected=%selected%+1") else (set /a "selected=%selected%")
1300.

1301.

1302.
  ::Ist die eingegebene Nummer des Menueeintrags im zulaessigen Bereich?
1303.
  ::Wenn ja, diese Nummer als Funktionsergebnis zurueckgeben.
1304.
  ::Wenn nicht, Menue nochmal darstellen.
1305.
  if defined titleLine (
1306.
    set /a "numItems2=numItems+1"
1307.

1308.
    for /l %%i in (2,1,!numItems2!) do (
1309.
      if "%selected%" equ "%%i" goto :ShowMenuSelectLoopBreak
1310.
    )
1311.
  ) else (
1312.
    for /l %%i in (1,1,%numItems%) do (
1313.
      if "%selected%" equ "%%i" goto :ShowMenuSelectLoopBreak
1314.
    )
1315.
  )
1316.
goto :ShowMenuSelectLoop
1317.

1318.

1319.
:ShowMenuSelectLoopBreak
1320.
::Wenn eine spezielle Auswahl gemacht wurde, die Zeilennummer des
1321.
::Menueeintrags als negativen Wert zurueckgeben
1322.
if %specialChoice% equ 1 set /a "selected=-selected"
1323.

1324.

1325.
::Umgebung mit ENABLEDELAYEDEXPANSION schliessen und Variable selected
1326.
::an die Umgebung eine Ebene hoeher uebergeben.
1327.
endlocal & set "selected=%selected%"
1328.

1329.

1330.
:ShowMenuEnd
1331.
::Ruecksprung und Funktionsergebnis in ERRORLEVEL zurueckliefern
1332.
exit /b %selected%
1333.

1334.

1335.

1336.
::Die Prozedur zum Ausgeben der Menueeintraege. Durch die Auslagerung in ein
1337.
::Unterprogramm koennen die Variablen, aus denen ein Menueeintrag zusammen-
1338.
::gesetzt wird, veraendert werden und die Eintraege koennen Ausrufezeichen
1339.
::enthalten.
1340.
:ShowMenuPrintMenuItems
1341.
if defined titleLine (set /a "itemCntr2=itemCntr-1") else (set /a "itemCntr2=itemCntr")
1342.
set "itemIndex=%zeros%%itemCntr2%"
1343.
call set "itemIndex=%%itemIndex:~-%numDigits%%%"
1344.

1345.
set "itemLine=%itemLine:~3%"
1346.
set "itemLine=%itemIndex%  %itemLine%%blankLine%"
1347.
call set "itemLine=%itemLinePaddingBlanks%%%itemLine:~0,%longestLine%%%%blankLine%"
1348.
call set "itemLine=%%itemLine:~0,%innerBoxWidth%%%"
1349.
set "itemLine=%itemLine:^=^^%"
1350.
set "itemLine=%itemLine:&=^&%"
1351.
set "itemLine=%itemLine:(=^(%"
1352.
set "itemLine=%itemLine:)=^)%"
1353.

1354.
if %innerBoxWidth% geq 78 (
1355.
  <NUL set /p =%vBar%%itemLine%%vBar%
1356.
) else (
1357.
  echo %screenPaddingBlanks%%vBar%%itemLine%%vBar%
1358.
)
1359.

1360.
exit /b
Gruß
Friemler
Bitte warten ..
Mitglied: regedit19
04.08.2011 um 18:16 Uhr
@Friemler:

Danke für dieses sehr ausführliche Skript, werde dies auf mich wirken lassen!

Lg
regedit19
Bitte warten ..
Mitglied: Skyemugen
04.08.2011 um 19:19 Uhr
Aloha Friemler,

... und dann war damals dein 2-Wochen-Urlaub vorbei? *lach*

vbs-inline ... selbst wenn es nur für die Laufwerke ist, ruiniert das Ganze :P

Aber mal die Frage:
>>"%menuFile%" (for /f "delims=" %%d in ('dir /b /o:ne /a:-s-hd "%objectPath2%" 2^>NUL') do (<NUL set /p "=::: %%d" & echo.)) 
Was stellt das Zeichen/Symbol whatever  eigentlich dar? ^_^

greetz André
Bitte warten ..
Mitglied: Friemler
04.08.2011 um 19:55 Uhr
Hi André,

joaa, die Entwicklung hat schon ein Weilchen gedauert .

Zur Frage nach dem Zeichen: Dabei handelt es sich um ASCII-Code 16. Wenn Du wissen willst wie es aussieht: Lass die Scripte doch mal laufen...

Ab und an benutze ich es sogar in einem Batchscript zur Erstellung der Verzeichnisstruktur und der nötigen Dateien für ein neues Delphi-Projekt.

Gruß
Friemler
Bitte warten ..
Mitglied: Skyemugen
04.08.2011 um 21:23 Uhr
Aloha Friemler,

► ahja, beim c&p des Zeichens in die cmd-Box klärt sich das Geheimnis *gg*

nun dann

greetz André
Bitte warten ..
Ähnliche Inhalte
VB for Applications
VBS Datei Auswahl Dialog
gelöst Frage von 133202VB for Applications5 Kommentare

Hallo Ihr, im Thread: konnte ich schon finden, was ich gesucht habe: Jetzt möchte ich allerdings, dass am Anfang ...

Windows Server
Scheduler Jobs grafisch darstellen?
gelöst Frage von tuxbusterWindows Server5 Kommentare

Hallo, Bin auf der Suche nach einer Möglichkeit die Skriptjobs des Windows Schedulers grafisch von der Laufzeit her darzustellen. ...

Batch & Shell
BATCH ini Datei Datei auslesen
gelöst Frage von Juergen42Batch & Shell2 Kommentare

Hallo zusammen, ich möchte eine ini Datei auslesen mit folgenden Aufbau INHALT DER INI ID=30 NAME="test1" PFAD="K:\Kontoauszug\Test1\*.pdf" PFAD_S="K:\Kontoauszug\Test1\Sicherung\" ID=28 ...

Batch & Shell
Batch Datei Ordnerüberwachung
Frage von Phant0xBatch & Shell1 Kommentar

Hallo zusammen, könntet ihr mir helfen eine Batch Datei zu schreiben, die einen bestimmten Ordner kontrolliert, ob sich Dateien ...

Neue Wissensbeiträge
Windows 7

Windows 7 u. Server 2008 (R2) SHA-2-Update kommt am 12. März 2019

Information von kgborn vor 22 StundenWindows 73 Kommentare

Kleine Info für die Admins der oben genannten Maschinen. Ab Juli 2019 werden Updates von Microsoft nur noch mit ...

Firewall
PfSense 2.5.0 benötigt doch kein AES-NI
Information von ChriBo vor 2 TagenFirewall2 Kommentare

Hallo, Wie sich einige hier erinnern werden hat Jim Thompson in diesem Aritkel beschrieben, daß ab Version 2.5.0 ein ...

Internet
Copyright-Reform: Upload-Filter
Information von Frank vor 4 TagenInternet1 Kommentar

Hallo, viele Menschen reden aktuell von Upload-Filtern. Sie reden darüber, als wären es eine Selbstverständlichkeit, das Upload-Filter den Seitenbetreibern ...

Google Android

Blokada: Tracking und Werbung unter Android unterbinden

Information von AnkhMorpork vor 4 TagenGoogle Android1 Kommentar

In Ergänzung zu meinem vorherigen Beitrag: Blokada efficiently blocks ads, tracking and malware. It saves your data plan, makes ...

Heiß diskutierte Inhalte
Hardware
IT-Werkzeugkoffer bis 50,- EUR
gelöst Frage von departure69Hardware31 Kommentare

Hallo. Ich bin als IT-Systembetreuer einer Gemeinde zusätzlich auch der IT-Systembetreuer einer Grund- und Hauptschule. Dort muß ich jedoch ...

Netzwerkmanagement
Richtfunknetzwerk mit vielen Hops stabiler gestalten
Frage von turti83Netzwerkmanagement21 Kommentare

Hallo, in meinem Dorf habe ich vor ca. einem Jahr ein Backbone aufgebaut um die Nachbarschaft mit Internet zu ...

Netzwerke
Verteilung von Programmdaten außerhalb des internen Netzwerkes
gelöst Frage von mertaufmbergNetzwerke20 Kommentare

Guten Morgen liebe Administratoren, ich versuche zurzeit eine möglichst sichere und einfache Lösung zu suchen, um ein Programmverzeichnis über ...

Hyper-V
Intel MSC Raid 5 Rebuild
Frage von DannysHyper-V19 Kommentare

Hallo Community, Ich habe einen Modul Server von Intel in Betrieb. Dort ist eine Festplatte aus dem Raid 5 ...