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

Zeilen aus Datei auf einem Netzwerkspeicher einlesen und NUMMERIERT auflisten in BATCH

Frage Entwicklung Batch & Shell

Mitglied: Fabian-Haas

Fabian-Haas (Level 1) - Jetzt verbinden

09.02.2014, aktualisiert 11.02.2014, 1333 Aufrufe, 10 Kommentare, 4 Danke

Hallo,

Ich möchte mithilfe einer Batchdatei verschiedene Netzwerkfreigaben eines Benutzers nummeriert auflisten. Diese sind in einer Datei auf dem gleichen Server abgespeichert, worauf das Programm Zugriff hat, und die eingelesen wird und dann eben nummeriert aufgelistet werden sollte. Daraufhin darf der Benutzer entscheiden welche er öffnen will und die jeweilige Netzwerk Freigabe wird dann im Explorer geöffnet. Das ganze habe ich so versucht:

01.
:: Sprungmarke, zu der nach dem Auswählen und Öffnen einer Freigabe zurückgekehrt wird 
02.
   :shares 
03.
 
04.
:: legt den Titel als "Ihre Ordner" fest 
05.
   title="Ihre Ordner" 
06.
 
07.
:: löscht den Bildschirminhalt  
08.
   cls 
09.
 
10.
:: gestaltet das Layout und listet die Freigaben "home" und "share" auf 
11.
   echo. 
12.
   echo           ------------------- 
13.
   echo           -                 - 
14.
   echo           -   Ihre Ordner   - 
15.
   echo           -                 - 
16.
   echo           ------------------- 
17.
   echo. 
18.
   echo   1 --- Eigener Ordner 
19.
   echo. 
20.
   echo   2 --- Gemeinsamer Ordner 
21.
   echo. 
22.
 
23.
:: liest die Datei des Benutzers zeilenweise ein und listet dessen Freigaben auf 
24.
   echo 2 > "%USERPROFILE%\NLTEMP.txt" 
25.
   for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do ( 
26.
       set /p NLTEMP=<"%USERPROFILE%\NLTEMP.txt" 
27.
       set /a NL=%NLTEMP%+1 
28.
       echo   %NL% --- %%i Ordner 
29.
       echo. 
30.
       echo %NL% > "%USERPROFILE%\NLTEMP.txt" 
31.
32.
 
33.
:: legt die zu öffnende Freigabe fest 
34.
   echo Bitte geben Sie die Nummer des zu oeffnenden Ordners an 
35.
   echo und bestaetigen Sie diese mit ENTER: 
36.
   echo. 
37.
   set /p NS= 
38.
   if "%NS%" == "1" goto home 
39.
   if "%NS%" == "2" goto share 
40.
   set /a NSTEMP=%NS%-3 
41.
   for /f "usebackq skip=%NSTEMP%" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do ( 
42.
       echo %%i> "%USERPROFILE%\share.txt" 
43.
44.
 
45.
:: öffnet die ausgewählte Freigabe (ausgenommen "home" und "share") und kehrt zur Sprungmarke "shares" zurück 
46.
   set /p SHARE=<"%USERPROFILE%\share.txt" 
47.
   start explorer.exe "\\%SERVERIP%\%SHARE%" 
48.
   goto shares 
49.
 
50.
:: Sprungmarke, um das Homeverzeichnis des Benutzers zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
51.
   :home 
52.
   start explorer.exe "\\%SERVERIP%\%USERNAME%" 
53.
   goto shares 
54.
 
55.
:: Sprungmarke, um die Freigabe "share" zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
56.
   :share 
57.
   start explorer.exe "\\%SERVERIP%\share" 
58.
   goto shares 
59.
 
60.
:: kehrt zur Sprungmarke "shares" zurück 
61.
   goto shares
Die ersten beiden Freigaben stehen dabei nicht in dieser Datei, da sie für jeden Benutzer existieren und in der Datei nur die individuellen Freigaben des Benutzers aufgelistet sind.


Dabei klappt alles super, jedoch werden außer der "1" und der "2" keine Nummern vor den aufgelisteten Freigaben angezeigt. Gibt der Benutzer aber die Nummer ein, die eigentlich dort stehen sollte öffnet das Programm auch die richtige Freigabe im Explorer.

Dementsprechend wäre meine Frage, wie die Auflistung klappen kann, liegt der Fehler vielleicht in der FOR-Schleife?

Vielen Dank im Voraus
Fabian Haas
Mitglied: bastla
LÖSUNG 09.02.2014, aktualisiert 11.02.2014
Hallo Fabian-Haas und willkommen im Forum!

Wenn Du innerhalb einer Klammer Variablenwerte änderst, brauchst Du "delayedExpansion", um diese geänderten Werte gleich verwenden zu können - daher vorweg (noch vor der Sprungmarke ":shares")
setlocal enabledelayedexpansion
und dann
01.
set /a NL=!NLTEMP!+1 
02.
echo !NL! --- %%i Ordner 
03.
echo. 
04.
echo !NL! > "%USERPROFILE%\NLTEMP.txt
Das Zwischenspeichern des Zählers in einer Datei wäre übrigens nicht nötig - Du könntest das auch einfach so lösen:
01.
set /a NL=2 
02.
for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do ( 
03.
    set /a NL+=1 
04.
    echo !NL! --- %%i Ordner 
05.
    echo. 
06.
)
Damit es auch mit der Eingabe 3 klappt, könntest Du noch den Auswahlteil etwa so ändern:
01.
set /p NS= 
02.
if "%NS%" == "1" goto home 
03.
if "%NS%" == "2" goto share 
04.
set /a NSTEMP=%NS%-3 
05.
set "SHARE=" 
06.
for /f %%i in ('more +%NSTEMP% \\%SERVERIP%\shares\%USERNAME%.txt') do if not defined SHARE set "SHARE=%%i"
Grüße
bastla

P.S.: "Code"-Blöcke müssen mit einem Ende-Tag </code> beendet werden ...
Bitte warten ..
Mitglied: Fabian-Haas
09.02.2014 um 21:00 Uhr
Hallo bastla,

erstmal vielen Dank für die schnelle Antwort.
Wenn ich jetzt weiterhin die Variable zwischenspeichere (der Gewohnheit halber und weil mir vorher gesagt wurde, dass das sonst nicht mit der FOR-Schleife funktionieren würde), muss der Code dann so aussehen:
01.
   echo 2 > "%USERPROFILE%\NLTEMP.txt" 
02.
   for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do ( 
03.
       set /p NLTEMP=<"%USERPROFILE%\NLTEMP.txt" 
04.
       set /a NL=!NLTEMP!+1 
05.
       echo   !NL! --- %%i Ordner 
06.
       echo. 
07.
       echo !NL! > "%USERPROFILE%\NLTEMP.txt" 
08.
       )
oder müsste ich nicht eigentlich ebenfalls die Variable "USERPROFILE" mit Ausrufezeichen umgeben?, also so:
01.
   echo 2 > "%USERPROFILE%\NLTEMP.txt" 
02.
   for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do ( 
03.
       set /p NLTEMP=<"!USERPROFILE!\NLTEMP.txt" 
04.
       set /a NL=!NLTEMP!+1 
05.
       echo   !NL! --- %%i Ordner 
06.
       echo. 
07.
       echo !NL! > "%USERPROFILE%\NLTEMP.txt" 
08.
       )
Schon mal danke
Fabian Haas
Bitte warten ..
Mitglied: Fabian-Haas
09.02.2014 um 22:49 Uhr
Okay ich habs verstanden, es geht ja nur um die variablen, die in Klammern GEÄNDERT werden. ;) Es hat also genau so geklappt, wie du es meintest.

Nochmals Danke
Fabian Haas
Bitte warten ..
Mitglied: Fabian-Haas
10.02.2014, aktualisiert um 21:48 Uhr
Jetzt tritt bei mir doch noch ein Problem auf leider :/. Ich habe die Hilfen so versucht umzusetzen, dass meine Batch-Datei jetzt so aussieht:
01.
:: erlaubt Variablen in Klammern zu ändern 
02.
   setlocal enabledelayedexpansion 
03.
 
04.
:: Sprungmarke, zu der nach dem Auswählen und Öffnen einer Freigabe zurückgekehrt wird 
05.
   :shares 
06.
 
07.
:: legt den Titel als "Ihre Ordner" fest 
08.
   title="Ihre Ordner" 
09.
 
10.
:: löscht den Bildschirminhalt  
11.
   cls 
12.
 
13.
:: gestaltet das Layout und listet die Freigaben "home" und "share" auf 
14.
   echo. 
15.
   echo           ------------------- 
16.
   echo           -                 - 
17.
   echo           -   Ihre Ordner   - 
18.
   echo           -                 - 
19.
   echo           ------------------- 
20.
   echo. 
21.
   echo   1 --- Eigener Ordner 
22.
   echo. 
23.
   echo   2 --- Gemeinsamer Ordner 
24.
   echo. 
25.
 
26.
:: liest die Datei des Benutzers zeilenweise ein und listet dessen Freigaben auf 
27.
   echo 2 > "%USERPROFILE%\NLTEMP.txt" 
28.
   for /f "tokens=2 delims=:" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do ( 
29.
       set /p NLTEMP=<"%USERPROFILE%\NLTEMP.txt" 
30.
       set /a NL=!NLTEMP!+1 
31.
       echo   !NL! --- %%i Ordner 
32.
       echo. 
33.
       echo !NL! > "%USERPROFILE%\NLTEMP.txt" 
34.
35.
        
36.
:: legt die zu öffnende Freigabe fest 
37.
   echo Bitte geben Sie die Nummer des zu oeffnenden Ordners an 
38.
   echo und bestaetigen Sie diese mit ENTER: 
39.
   echo. 
40.
   set /p NS= 
41.
   if "%NS%" == "1" goto home 
42.
   if "%NS%" == "2" goto share 
43.
   set /a NSTEMP=%NS%-3 
44.
   if NOT %NSTEMP% == "0" ( 
45.
       for /f "usebackq skip=%NSTEMP% tokens=2 delims=:" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do ( 
46.
           echo %%i> "%USERPROFILE%\share.txt" 
47.
           goto openshare1 
48.
49.
       ) else ( 
50.
         pause 
51.
         for /f %%i in ('more +%NSTEMP% \\%SERVERIP%\shares\%USERNAME%.txt') do ( 
52.
             set SHARE="" 
53.
             if not defined SHARE set SHARE=%%i 
54.
             goto openshare2 
55.
56.
57.
 
58.
:: öffnet die ausgewählte Freigabe (ausgenommen "home" und "share") und kehrt zur Sprungmarke "shares" zurück 
59.
   :openshare1 
60.
   set /p SHARE=<"%USERPROFILE%\share.txt" 
61.
   :openshare2 
62.
   start explorer.exe "\\%SERVERIP%\%SHARE%" 
63.
   goto shares 
64.
 
65.
:: Sprungmarke, um das Homeverzeichnis des Benutzers zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
66.
   :home 
67.
   start explorer.exe "\\%SERVERIP%\%USERNAME%" 
68.
   goto shares 
69.
 
70.
:: Sprungmarke, um die Freigabe "share" zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
71.
   :share 
72.
   start explorer.exe "\\%SERVERIP%\share" 
73.
   goto shares 
74.
 
75.
:: kehrt zur Sprungmarke "shares" zurück 
76.
   goto shares
Dabei klappt das Aufrufen der dritten Freigabe jedoch immer noch nicht ;(. und mir fällt absolut keine Erklärung dazu ein. Weiß jemand da vielleicht Rat?

Vielen Dank im Vorraus
Fabian Haas

PS: Leider weiß ich nicht, wie man eine Frage wieder als ungelöst markieren kann.
Bitte warten ..
Mitglied: bastla
LÖSUNG 10.02.2014, aktualisiert 11.02.2014
Hallo Fabian-Haas!

Mit vertauschten Zeilen 51 und 52 (und der Angabe von tokens und delims wie in Zeile 45) sollte das klappen ...

Grüße
bastla
Bitte warten ..
Mitglied: Fabian-Haas
10.02.2014 um 23:05 Uhr
Hallo Bastler,

danke für die Antwort. Leider funktioniert es auch dann nicht. Außerdem komme ich nie bei einer Pause an (die Pause in Zeile 50). Funktioniert dann die If-Abfrage nicht?

Schon mal Danke
Fabian Haas
Bitte warten ..
Mitglied: bastla
LÖSUNG 10.02.2014, aktualisiert 11.02.2014
Hallo Fabian-Haas!

Die Anführungszeichen in der Zeile 44 hatte ich leider übersehen - entweder verwendest Du sie auf beiden Seiten oder auf keiner, daher zB
if NOT "%NSTEMP%"=="0" (
Grüße
bastla
Bitte warten ..
Mitglied: Fabian-Haas
11.02.2014 um 17:51 Uhr
Hallo Bastla,

das habe ich jetzt auch ausprobiert, leider ohne Erfolg :/. Allerdings wird mir jetzt die Pause in Zeile 50 angezeigt. Müsste der Fehler dann nicht in den Zeilen 51-56 liegen?

Viele Grüße
Fabian Haas
Bitte warten ..
Mitglied: bastla
LÖSUNG 11.02.2014, aktualisiert um 21:02 Uhr
Hallo Fabian-Haas!

Ersetze die Zeilen 51 - 54 durch
01.
set "SHARE=" 
02.
for /f "usebackq tokens=2 delims=:" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do if not defined SHARE set "SHARE=%%i" 
03.
goto openshare2
Grüße
bastla
Bitte warten ..
Mitglied: Fabian-Haas
11.02.2014 um 21:05 Uhr
Okay jetzt klappt alles genauso, wie ich es wollte. Perfekt!

Also nochmals Vielen Dank für die schnellen und aufschlussreichen Antworten (auf meine zum Teil vielleicht etwas dämlichen Fragen ) und aber auch für die herzliche Aufnahme ins Forum.

Nochmals Danke
Fabian Haas
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch - Datei aus Ordner einlesen mit Ausnahmen! (4)

Frage von Daedrafaction zum Thema Batch & Shell ...

Batch & Shell
Neuere Datei per Batch ausfinding machen (2)

Frage von chattie zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...