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

Batch Grafische Oberfläche Datei auswählen

Frage Entwicklung Batch & Shell

Mitglied: regedit19

regedit19 (Level 1) - Jetzt verbinden

04.08.2011, aktualisiert 18.10.2012, 6050 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell oder Batch-Task: Kopiere Datei x mal und benenne diese um (2)

Frage von Lorderich zum Thema Batch & Shell ...

Batch & Shell
gelöst Per Batch nur neueste Datei mit bestimmten Dateianfang kopieren (3)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch das eine Datei (.tiff) an einen Netzwerkdrucker sendet und druckt (3)

Frage von klouisbrother zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...

Peripheriegeräte
Wlan stört Funkmaus (11)

Frage von Falaffel zum Thema Peripheriegeräte ...

Windows Server
RODC über VPN - Verbindung weg (10)

Frage von stefan2k1 zum Thema Windows Server ...