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

Auswahlliste automatisch erstellen

Frage Entwicklung Batch & Shell

Mitglied: ReXx3r

ReXx3r (Level 1) - Jetzt verbinden

09.07.2007, aktualisiert 18.10.2012, 5389 Aufrufe, 13 Kommentare

Hi,

ich möchte per Batch-Datei Unterordner erstellen. Dafür sollen die Namen der Übergeordneten Ordner erst per Eingabe der ersten 3 Buchstaben aufgelistet werden - mit Nummerierung. Aus dieser Liste soll man dann per Eingabe der Nummer den Entsprechenden Namen auswählen können.
Das entscheidende Problem ist die Nummerierung zu erzeugen und dann daraus eine Auswahl zu erstellen.

Dazu habe ich schon folgenden Code:
01.
Echo Bitte keine Leerzeichen verwenden!!! 
02.
SET /P Ziel=Bitte Kundennamen eingeben (ersten 3 Buchstaben)...: 
03.
Echo. 
04.
Echo Liste der Verzeichnisse mit "%Ziel%": 
05.
DIR /b /o /ad "P:Anfragen\%Ziel:~0,3%*.*" 2>nul || Echo -Das Kundenverzeichnis existiert noch nicht!- 
06.
Echo. 
07.
Set /P Ziel=Bitte vollstaendigen Kundennamen eingeben ...: 
08.
SET Zielpfad=P:Anfragen 
09.
if defined AngNr (set AngNr=%AngNr%.0) else (set AngNr=%AngNralt%) 
10.
set verzeichnis=%Zielpfad%\%Ziel% 
11.
if exist %verzeichnis%
12.
ul (goto istda) else (goto istnichtda)
Vielen Dank schonmal im Vorraus für eure Hilfe


Mit freundlichen Grüßen
ReXx3r
Mitglied: bastla
09.07.2007, aktualisiert 18.10.2012
Hallo ReXx3r und willkommen im Forum!

Etwas Ähnliches hatten wir hier ...

Grüße
bastla
Bitte warten ..
Mitglied: ReXx3r
09.07.2007 um 14:14 Uhr
Hi,
erstmal danke für die Antwort

aufgrund meiner beschränkten Batch Kenntnisse weiß ich nicht genau wie ich die Abfrage nach den Anfangsbuchstaben der Ordnernamen hinbekomme, zumal die auf einem anderen Laufwerk liegen.
Desweiteren möchte ich nur eine Spalte haben.

Ich hab schonmal bischen am Code gebastelt, hab aber keine Ahnung ob ich damit richtig liege:
01.
::------------------------------------------------------------------------------------Abschnitt Verzeichnis prüfen 
02.
::          Abfrage Kundenname und Anzeige der Verzeichnisse (Vergleich der ersten 3 Buchstaben) 
03.
:: 
04.
 
05.
Echo Bitte keine Leerzeichen verwenden!!! 
06.
SET /P Ziel=Bitte Kundennamen eingeben (ersten 3 Buchstaben)...: 
07.
Echo. 
08.
Echo Liste der Verzeichnisse mit "%Ziel%": 
09.
DIR /b /o /ad "P:\Anfragen\%Ziel:~0,3%*.*" 2>nul || Echo -Das Kundenverzeichnis existiert noch nicht!- 
10.
 
11.
set /a count=0 
12.
for /f "delims=;" %%i in ('dir /b /a-d') do if "%%i" neq "%~nx0" call :setprog "%%i" 
13.
if %count% EQU 0 goto :eof 
14.
 
15.
set /a Zeilen=%count% 
16.
call :MenueText 
17.
mode con lines=(%Zeilen%+5) 
18.
 
19.
 
20.
:Menue 
21.
cls 
22.
for /l %%n in (1,1,%Zeilen%) do echo!MZeile%%n! 
23.
echo. 
24.
echo. 
25.
set /p choice=  Gib die Nummer des Kunden an (0 fr Ende):  
26.
set /a Nr=-1 
27.
set /a Nr=%choice% 2>nul 
28.
if %Nr% equ 0 goto :Ende 
29.
if %Nr% lss 0 goto :Fehler 
30.
if %Nr% gtr %count% goto :Fehler 
31.
 
32.
if defined AngNr (set AngNr=%AngNr%.0) else (set AngNr=%AngNralt%) 
33.
set verzeichnis=%Zielpfad%\%Ziel% 
34.
if exist %verzeichnis%\nul (goto istda) else (goto istnichtda) 
35.
 
36.
:setprog 
37.
set /a "count+=1" 
38.
set "prog%count%=%~1" 
39.
goto :eof 
40.
 
41.
:MenueText 
42.
for /l %%m in (1,1,%Zeilen%) do ( 
43.
    set "MZeile%%m=." 
44.
    set /a Nr=%%m 
45.
    if !Nr! leq %count% set MZeile%%m= 
46.
    if !Nr! leq %count% call :ProcessEntryForLine %%m 
47.
    set /a Nr+=%Zeilen% 
48.
    if !Nr! leq %count% call :ProcessEntryForLine %%m 
49.
    set /a Nr+=%Zeilen% 
50.
    if !Nr! leq %count% call :ProcessEntryForLine %%m 
51.
52.
goto :eof 
53.
 
54.
:ProcessEntryForLine 
55.
set "NrForm=   %Nr%" 
56.
set "ProgForm=!prog%Nr%!" 
57.
set "MZeile%1=%NrForm:~-4%: %ProgForm:" 
58.
goto :eof 
59.
 
60.
 
Was sich mir nicht erschließt sind folgende Zeilen, wäre nett wenn mir diese jmd erklären könnte:
01.
for /f "delims=;" %%i in ('dir /b /a-d') do if "%%i" neq "%~nx0" call :setprog "%%i" 
02.
if %count% EQU 0 goto :eof
wieso ist der if Ausdruck hier 3 mal da? Und was bedeutet das leq?
01.
for /l %%m in (1,1,%Zeilen%) do ( 
02.
    set "MZeile%%m=." 
03.
    set /a Nr=%%m 
04.
    if !Nr! leq %count% set MZeile%%m= 
05.
    if !Nr! leq %count% call :ProcessEntryForLine %%m 
06.
    set /a Nr+=%Zeilen% 
07.
    if !Nr! leq %count% call :ProcessEntryForLine %%m 
08.
    set /a Nr+=%Zeilen% 
09.
    if !Nr! leq %count% call :ProcessEntryForLine %%m 
10.
)
und noch eins: Wieso ist nach jedem Programmteil ein goto :eof (heißt doch eigtl Ende der Batchdatei?)


Mit freundlichen Grüßen
ReXx3r
Bitte warten ..
Mitglied: miniversum
09.07.2007 um 15:08 Uhr
Also mal von deinem Grundbatch ausgehend würd ichs so machen:
01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
Echo Bitte keine Leerzeichen verwenden!!! 
04.
SET "Zielpfad=P:\Anfragen" 
05.
SET /P Ziel=Bitte Kundennamen eingeben (ersten 3 Buchstaben)...: 
06.
Echo. 
07.
Echo Liste der Verzeichnisse mit "%Ziel%": 
08.
 
09.
set nr=0 
10.
for /F "delims=" %%a in ('DIR /b /on /ad "%Zielpfad%\%Ziel:~0,3%*.*" 2>nul || Echo -Das Kundenverzeichnis existiert noch nicht!-') do ( 
11.
set /a nr+=1 
12.
echo !nr! %%a 
13.
14.
 
15.
Echo. 
16.
Set /P Ziel=Bitte Wählen ...: 
17.
 
18.
set "shift=" 
19.
if %Ziel% gtr 1 set /a shift=%Ziel%-1 
20.
set "Ziel=" 
21.
for /F "skip=%shift% delims=" %%a in ('DIR /b /on /ad "%Zielpfad%\%Ziel:~0,3%*.*"') do if not defined Ziel set Ziel=%%a 
22.
 
23.
echo ausgewählter Kundenname: %Ziel%
miniversum
Bitte warten ..
Mitglied: ReXx3r
09.07.2007 um 16:07 Uhr
Danke miniversum, aber irgendwie funktioniert deine Variante nicht,
kann das sein dass das daran liegt dass du mehrere Befehle in der For schleife hast?

Abgesehen davon dass ich schon paar Fehler korigieren musste:
01.
SET Zielpfad=##red|"##P:\Anfragen"
und diese
01.
set "shift=" 
02.
set "Ziel="
kann man auch nicht so stehen lassen oder?

Mit freundlichen Grüßen
ReXx3r
Bitte warten ..
Mitglied: miniversum
09.07.2007 um 16:45 Uhr
Mein Code war ungetestet. Ändere die Forschleife mal um:
for /F "delims=" %%a in ('DIR /b /on /ad "%Zielpfad%\%Ziel:~0,3%*.*" 2^>nul ^|^| Echo -Das Kundenverzeichnis existiert noch nicht!-') do (
dann sollte es gehen.
Die set anweisungen stimmen so.

miniversum
Bitte warten ..
Mitglied: bastla
09.07.2007 um 19:21 Uhr
Hallo ReXx3r!

Falls Du noch interessiert bist:
01.
@echo off & setlocal enabledelayedexpansion 
02.
::------------------------------------------------------------------------------------Abschnitt Verzeichnis prüfen 
03.
::          Abfrage Kundenname und Anzeige der Verzeichnisse (Vergleich der ersten 3 Buchstaben) 
04.
:: 
05.
cls 
06.
set "Zielpfad=P:\Anfragen" 
07.
set /a count=0 
08.
 
09.
set /P Ziel=Bitte Kundennamen eingeben (erste 3 Buchstaben)...: 
10.
set Ziel=%Ziel: =% 
11.
 
12.
for /f "delims=" %%i in ('dir /b /o /ad "%Zielpfad%\%Ziel:~0,3%*.*" 2^>nul') do ( 
13.
	set /a count+=1 
14.
	set "Verz!count!=%%i" 
15.
	set "NrForm=   !count!" 
16.
	set "MZeile!count!=!NrForm:~-4!: %%i" 
17.
18.
if %count% equ 0 Echo -Das Kundenverzeichnis existiert noch nicht!- & goto :istnichtda 
19.
 
20.
:Menue 
21.
cls 
22.
echo. 
23.
echo Liste der Verzeichnisse mit "%Ziel%": 
24.
echo. 
25.
for /l %%n in (1,1,%count%) do echo!MZeile%%n! 
26.
echo. 
27.
echo. 
28.
set /p choice=Gib die Nummer des Kunden an (0 fr Ende):  
29.
set /a Nr=-1 
30.
set /a Nr=%choice% 2>nul 
31.
if %Nr% equ 0 goto :Ende 
32.
if %Nr% lss 0 goto :Fehler 
33.
if %Nr% gtr %count% goto :Fehler 
34.
 
35.
::Was Du mit AngNr etc vorhast, kann ich nicht erkennen ... 
36.
::if defined AngNr (set AngNr=%AngNr%.0) else (set AngNr=%AngNralt%) 
37.
set "verzeichnis=%Zielpfad%\!Verz%Nr%!" 
38.
if not exist "%verzeichnis%\" goto :istnichtda 
39.
echo. 
40.
echo. 
41.
echo Kundenverzeichnis: %verzeichnis% 
42.
:: was halt 
43.
:: noch so 
44.
:: anliegt ... 
45.
goto :eof 
46.
 
47.
:istnichtda 
48.
echo. 
49.
echo. 
50.
echo Verzeichnis %verzeichnis% nicht gefunden. 
51.
goto :eof 
52.
 
53.
:Fehler 
54.
echo. 
55.
echo. 
56.
echo Bitte nur 0 bis %count% verwenden . . . 
57.
echo. 
58.
pause 
59.
goto :Menue 
60.
 
61.
:Ende 
62.
echo. 
63.
echo. 
64.
echo Programm beendet 
65.
goto :eof
Ich hab' das Ganze etwas entschlackt und auf eine Spalte reduziert, aber die Formatierung der Nummern (mit führenden Leerstellen, um sie rechtsbündig untereinander zu schreiben) noch beibehalten.

Zu Deinen Fragen:
01.
for /f "delims=;" %%i in ('dir /b /a-d') do if "%%i" neq "%~nx0" call :setprog "%%i"
Diese "for"-Zeile hatte die Aufgabe, alle Dateien des aktuellen Ordners mit Ausnahme der Batchdatei selbst ("%~nx0") in die Liste aufzunehmen - dafür wurde ein Unterprogramm verwendet. Beim Aufruf des Unterprogramms wurde der Dateiname als Parameter mitgeliefert. Im Unterprogramm wurde ua ein Zähler %count% jeweils um 1 erhöht.
01.
if %count% EQU 0 goto :eof
Falls nach Durchlaufen der Schleife der Zähler immer noch auf 0 stand, konnte der Batch beendet werden (da keine Dateien gefunden worden waren).

wieso ist der if Ausdruck hier 3 mal da? Und was bedeutet das leq?
3 Spalten - 3 Unterprogrammaufrufe zur Formatierung und vollständigen Erstellung der Menüzeile.
"leq" steht für "less or equal" oder auch "<=": Solange noch nicht alle %count% Einträge in den Menüzeilen erfasst waren, musste das Unterprogramm noch aufgerufen werden.

Wieso ist nach jedem Programmteil ein goto :eof (heißt doch eigtl Ende der Batchdatei?)
Da jedes Unterprogramm als eigene "Batchdatei" aufgefasst werden kann (früher musste dafür tatsächlich jeweils eine eigene Datei existieren, jetzt genügt eine Sprungmarke), bedeutet das einfach "Ende des Unterprogramms - Rücksprung zum aufrufenden Programm" (vergleichbar einer "Return"-Anweisung in älterem BASIC).
Vielleicht noch abschließend zum Unterschied zu miniversum's Ansatz: In meiner Variante werden die gefundenen Verzeichnisse in einer Art "Array" vorweg gespeichert (die Menüzeilen übrigens auch - bei nur einer Spalte schon fast Luxus ). Das Array wird simuliert, indem die Variablennamen laufend nummeriert werden, also %Verz1%, %Verz2%, ..., %Verz%Nr%%. Wie ersichtlich ist, wäre der letzte Name nicht richtig zu interpretieren (worauf soll sich das "%" nach "Verz" beziehen), daher wird mit der "delayed expansion" die Auswertung der Variable %Nr% vorweg erlaubt, und erst danach (verzögert) wird dann zB %Verz12% durch den gespeicherten Inhalt ersetzt. Die dafür nötige Schreibweise sieht eben so aus: !Verz%Nr%! - das "!" ersetzt das äußere "%".

Ein weiterer Grund für das "enabledelayedexpansion" ist die Tatsache, dass in der "for"-Schleife eine Auswertung der Variablen nur am Anfang erfolgen würde - zB das Erhöhen der Variable %count% würde so immer nur zum Wert 1 führen (zu Beginn der Schleife war %count% 0, und bei jedem Schleifendurchlauf würde wieder dieser Wert 0 als Variableninhalt angenommen) - die "verzögerte Variablenerweiterung" bewirkt, dass Änderungen des Variableninhaltes auch innerhalb der Schleife "gesehen" werden - deshalb !count!.

Grüße
bastla
Bitte warten ..
Mitglied: ReXx3r
10.07.2007 um 09:39 Uhr
Hi bastla,

DANKE DANKE DANKE

mit deiner Version gehts wunderbar.
Zwei Sachen noch:
1. Wie füge ich einen letzten Menüpunkt ein, mit dem man einen neuen Kunden anlegt?
Habs schonmal probiert aber nicht richtig hinbekommen:
01.
:Menue 
02.
echo. 
03.
echo Liste der Verzeichnisse mit "%Ziel%": 
04.
echo. 
05.
for /l %%n in (1,1,%count%) do echo!MZeile%%n! 
06.
set /a count=%count%+1 
07.
echo!NrForm:~4!:  %count%: Neuen Kunden anlegen 
08.
echo. 
09.
echo. 
10.
set /p choice=Gib die Nummer des Kunden an (0 fr Ende): 
11.
set /a Nr=-1 
12.
set /a Nr=%choice% 2>nul 
13.
if %Nr% = %count% goto :neuerkunde
und
01.
:neuerkunde 
02.
set /p verzeichnis = Neuen Kundennamen eingeben...: 
03.
goto istnichtda
2. Was ist der Unterschied zwischen "goto kdnr" und "goto :kdnr"?

Mit freundlichen Grüßen
ReXx3r
Bitte warten ..
Mitglied: ReXx3r
10.07.2007 um 09:44 Uhr
Bei deiner Version zeigt der mir als Nummerierung immer 0 an.

Aber die von bastla funktioniert ja jetzt

trotzdem Danke für deine Mühe
Bitte warten ..
Mitglied: bastla
10.07.2007 um 13:05 Uhr
Hallo ReXx3r!

Für den besonderen Menüpunkt "Neuen Kunden anlegen" würde ich keine (immer wieder variierende) Nummer verwenden, sondern einfach den Buchstaben "N" anbieten, etwa:
01.
:Menue 
02.
cls 
03.
echo. 
04.
echo Liste der Verzeichnisse mit "%Ziel%": 
05.
echo. 
06.
for /l %%n in (1,1,%count%) do echo!MZeile%%n! 
07.
echo. 
08.
echo. 
09.
<b>set /p choice=Gib die Nummer des Kunden an (N fr "Neuer Kunde", 0 fr Ende):  
10.
if /i %choice:~0,1%==N goto :NeuerKunde</b> 
11.
set /a Nr=-1 
12.
set /a Nr=%choice% 2>nul 
13.
if %Nr% equ 0 goto :Ende 
14.
...
und zB
01.
:NeuerKunde 
02.
cls 
03.
echo. 
04.
echo Anlage neuer Kunde 
05.
echo. 
06.
echo. 
07.
set Verzeichnis= 
08.
set /p Verzeichnis=Neuen Kundennamen eingeben...: 
09.
 
10.
::falls keine Eingabe 
11.
if not defined Verzeichnis goto :Fehler 
12.
 
13.
set "Verzeichnis=%Zielpfad%\%Verzeichnis%" 
14.
md "%Verzeichnis%" 
15.
::und weiter ... 
16.
goto :Bearbeitung
Natürlich würde sich anbieten, vor dem Erstellen des Verzeichnisses den neuen Kundennamen etwas genauer zu überprüfen (bereits vorhanden, nicht zulässige Sonderzeichen, ...).

Was ist der Unterschied zwischen "goto kdnr" und "goto :kdnr"?
Bei "goto", soweit ich weiß, eigentlich keiner - sehr wohl aber bei "call" - daher habe ich mir den Doppelpunkt einfach angewöhnt ...

Grüße
bastla
Bitte warten ..
Mitglied: miniversum
10.07.2007 um 13:08 Uhr
Immer 0 ?
Aber du hast das
setlocal enabledelayedexpansion
ganz oben nicht vergessen?

miniversum
Bitte warten ..
Mitglied: ReXx3r
10.07.2007 um 13:54 Uhr
Natürlich habe ich das nicht vergessen, der Fehler muss also woanders liegen
Bitte warten ..
Mitglied: bastla
10.07.2007, aktualisiert 30.01.2014
Hallo Ihr Beiden!

Nur als Anmerkung: miniversum's Variante (mit der geänderten "for"-Zeile) funktioniert bei mir, bis auf die Tatsache, dass die Variable %Ziel% für verschiedenste Zwecke verwendet werden soll (und damit etwas überfordert wird ):
01.
... 
02.
Set /P Ziel=Bitte Wählen ...: 
03.
 
04.
set "shift=" 
05.
if %Ziel% gtr 1 set /a shift=%Ziel%-1 
06.
set "Ziel=" 
07.
for /F "skip=%shift% delims=" %%a in ('DIR /b /on /ad "%Zielpfad%\%<b>Ziel</b>:~0,3%*.*"') do if not defined Ziel set Ziel=%%a 
08.
...
Wenn also für die Eingabe der Auswahl und für das gesuchte Verzeichnis andere Variablen verwendet werden, klappt's.

Grüße
bastla
Bitte warten ..
Mitglied: ReXx3r
10.07.2007 um 15:54 Uhr
so Danke an euch beide, vor allem bastla

Programm ist fertig und läuft

Mit freundlichen Grüßen
ReXx3r
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
VB for Applications
Excel Inhaltsverzeichnis Layout automatisch erstellen (3)

Frage von Julian8990 zum Thema VB for Applications ...

Batch & Shell
gelöst Alte Daten automatisch per Zip erstellen (4)

Frage von BEBBYs zum Thema Batch & Shell ...

Batch & Shell
Batch: .rar-Pakete automatisch Ordner erstellen und verschieben (2)

Frage von BowserMD zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...